xref: /haiku/src/apps/terminal/Arguments.cpp (revision e0bc2fcce4c5ceb7b57d978b752cda01639d0098)
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