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