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