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