1 /* 2 * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include "Arguments.h" 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 #include <Catalog.h> 14 #include <Locale.h> 15 16 17 #undef B_TRANSLATE_CONTEXT 18 #define B_TRANSLATE_CONTEXT "Terminal arguments parsing" 19 20 21 Arguments::Arguments(int defaultArgsNum, const char* const* defaultArgs) 22 : fUsageRequested(false), 23 fBounds(50, 50, 630, 435), 24 fStandardShell(true), 25 fFullScreen(false), 26 fShellArgumentCount(0), 27 fShellArguments(NULL), 28 fTitle(NULL) 29 { 30 _SetShellArguments(defaultArgsNum, defaultArgs); 31 } 32 33 34 Arguments::~Arguments() 35 { 36 _SetShellArguments(0, NULL); 37 } 38 39 40 void 41 Arguments::Parse(int argc, const char* const* argv) 42 { 43 int argi = 1; 44 while (argi < argc) { 45 const char* arg = argv[argi++]; 46 47 if (*arg == '-') { 48 if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) { 49 fUsageRequested = true; 50 51 /*} else if (strcmp(arg, "-l") == 0) { 52 // location 53 float x, y; 54 if (argi + 1 >= argc 55 || sscanf(argv[argi++], "%f", &x) != 1 56 || sscanf(argv[argi++], "%f", &y) != 1) { 57 print_usage_and_exit(true); 58 } 59 60 fBounds.OffsetTo(x, y); 61 62 } else if (strcmp(arg, "-s") == 0) { 63 // size 64 float width, height; 65 if (argi + 1 >= argc 66 || sscanf(argv[argi++], "%f", &width) != 1 67 || sscanf(argv[argi++], "%f", &height) != 1) { 68 print_usage_and_exit(true); 69 } 70 71 fBounds.right = fBounds.left + width; 72 fBounds.bottom = fBounds.top + height; 73 */ 74 } else if (strcmp(arg, "-t") == 0 || strcmp(arg, "--title") == 0) { 75 // title 76 if (argi >= argc) 77 fUsageRequested = true; 78 else 79 fTitle = argv[argi++]; 80 81 } else if (strcmp(arg, "-f") == 0 || strcmp(arg, "--fullscreen") == 0) { 82 fFullScreen = true; 83 argi++; 84 } else { 85 // illegal option 86 fprintf(stderr, B_TRANSLATE("Unrecognized option \"%s\"\n"), 87 arg); 88 fUsageRequested = true; 89 } 90 91 } else { 92 // no option, so the remainder is the shell program with arguments 93 _SetShellArguments(argc - argi + 1, argv + argi - 1); 94 argi = argc; 95 fStandardShell = false; 96 } 97 } 98 } 99 100 101 void 102 Arguments::GetShellArguments(int& argc, const char* const*& argv) const 103 { 104 argc = fShellArgumentCount; 105 argv = fShellArguments; 106 } 107 108 109 void 110 Arguments::_SetShellArguments(int argc, const char* const* argv) 111 { 112 // delete old arguments 113 for (int32 i = 0; i < fShellArgumentCount; i++) 114 free((void *)fShellArguments[i]); 115 delete[] fShellArguments; 116 117 fShellArguments = NULL; 118 fShellArgumentCount = 0; 119 120 // copy new ones 121 if (argc > 0 && argv) { 122 fShellArguments = new const char*[argc + 1]; 123 for (int i = 0; i < argc; i++) 124 fShellArguments[i] = strdup(argv[i]); 125 126 fShellArguments[argc] = NULL; 127 fShellArgumentCount = argc; 128 } 129 } 130 131