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_TRANSLATION_CONTEXT
18#define B_TRANSLATION_CONTEXT "Terminal arguments parsing"
19
20
21Arguments::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
34Arguments::~Arguments()
35{
36	_SetShellArguments(0, NULL);
37}
38
39
40void
41Arguments::Parse(int argc, const char* const* argv)
42{
43	int argi;
44	for (argi = 1; argi < argc; argi ++) {
45		const char* arg = argv[argi];
46
47		if (*arg == '-') {
48			if (strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0)
49				fUsageRequested = true;
50			else if (strcmp(arg, "-t") == 0 || strcmp(arg, "--title") == 0) {
51				// title
52				if (argi >= argc)
53					fUsageRequested = true;
54				else
55					fTitle = argv[++argi];
56
57			} else if (strcmp(arg, "-f") == 0 || strcmp(arg, "--fullscreen")
58					== 0)
59				fFullScreen = true;
60			else {
61				// illegal option
62				fprintf(stderr, B_TRANSLATE("Unrecognized option \"%s\"\n"),
63					arg);
64				fUsageRequested = true;
65			}
66		} else {
67			// no option, so the remainder is the shell program with arguments
68			_SetShellArguments(argc - argi, argv + argi);
69			argi = argc;
70			fStandardShell = false;
71		}
72	}
73}
74
75
76void
77Arguments::GetShellArguments(int& argc, const char* const*& argv) const
78{
79	argc = fShellArgumentCount;
80	argv = fShellArguments;
81}
82
83
84void
85Arguments::_SetShellArguments(int argc, const char* const* argv)
86{
87	// delete old arguments
88	for (int32 i = 0; i < fShellArgumentCount; i++)
89		free((void *)fShellArguments[i]);
90	delete[] fShellArguments;
91
92	fShellArguments = NULL;
93	fShellArgumentCount = 0;
94
95	// copy new ones
96	if (argc > 0 && argv) {
97		fShellArguments = new const char*[argc + 1];
98		for (int i = 0; i < argc; i++)
99			fShellArguments[i] = strdup(argv[i]);
100
101		fShellArguments[argc] = NULL;
102		fShellArgumentCount = argc;
103	}
104}
105
106