1 /*****************************************************************************/
5 /* Helper functions for command line parsing */
9 /* (C) 2000 Ullrich von Bassewitz */
11 /* D-70597 Stuttgart */
12 /* EMail: uz@musoftware.de */
15 /* This software is provided 'as-is', without any expressed or implied */
16 /* warranty. In no event will the authors be held liable for any damages */
17 /* arising from the use of this software. */
19 /* Permission is granted to anyone to use this software for any purpose, */
20 /* including commercial applications, and to alter it and redistribute it */
21 /* freely, subject to the following restrictions: */
23 /* 1. The origin of this software must not be misrepresented; you must not */
24 /* claim that you wrote the original software. If you use this software */
25 /* in a product, an acknowledgment in the product documentation would be */
26 /* appreciated but is not required. */
27 /* 2. Altered source versions must be plainly marked as such, and must not */
28 /* be misrepresented as being the original software. */
29 /* 3. This notice may not be removed or altered from any source */
32 /*****************************************************************************/
43 /*****************************************************************************/
45 /*****************************************************************************/
49 /* Program name - is set after call to InitCmdLine */
52 /* The program argument vector */
53 static char** ArgVec = 0;
54 static unsigned ArgCount = 0;
58 /*****************************************************************************/
60 /*****************************************************************************/
64 void InitCmdLine (unsigned aArgCount, char* aArgVec[], const char* aProgName)
65 /* Initialize command line parsing. aArgVec is the argument array terminated by
66 * a NULL pointer (as usual), ArgCount is the number of valid arguments in the
67 * array. Both arguments are remembered in static storage.
70 /* Remember the argument vector */
74 /* Get the program name from argv[0] but strip a path */
76 /* Use the default name given */
80 ProgName = strchr (ArgVec[0], '\0');
81 while (ProgName > ArgVec[0]) {
83 if (*ProgName == '/' || *ProgName == '\\') {
88 if (ProgName[0] == '\0') {
97 void UnknownOption (const char* Opt)
98 /* Print an error about an unknown option and die. */
100 AbEnd ("Unknown option: %s\n", Opt);
105 void NeedArg (const char* Opt)
106 /* Print an error about a missing option argument and exit. */
108 AbEnd ("Option requires an argument: %s\n", Opt);
113 void InvDef (const char* Def)
114 /* Print an error about an invalid definition and die */
116 AbEnd ("Invalid definition: `%s'\n", Def);
121 const char* GetArg (int* ArgNum, unsigned Len)
122 /* Get an argument for a short option. The argument may be appended to the
123 * option itself or may be separate. Len is the length of the option string.
126 const char* Arg = ArgVec[*ArgNum];
127 if (Arg[Len] != '\0') {
128 /* Argument appended */
131 /* Separate argument */
132 Arg = ArgVec[*ArgNum + 1];
134 /* End of arguments */
135 NeedArg (ArgVec[*ArgNum]);
144 void LongOption (int* ArgNum, const LongOpt* OptTab, unsigned OptCount)
145 /* Handle a long command line option */
147 /* Get the option and the argument (which may be zero) */
148 const char* Opt = ArgVec[*ArgNum];
150 /* Search the table for a match */
152 if (strcmp (Opt, OptTab->Option) == 0) {
153 /* Found, call the function */
154 if (OptTab->ArgCount > 0) {
155 /* We need an argument, check if we have one */
156 const char* Arg = ArgVec[++(*ArgNum)];
160 OptTab->Func (Opt, Arg);
162 OptTab->Func (Opt, 0);
168 /* Next table entry */