From: cuz Date: Wed, 14 Jun 2000 07:09:10 +0000 (+0000) Subject: New module for command line parsing X-Git-Tag: V2.12.0~3449 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=94cee5c9b21559cbb1d2fbac5bb2423bcad26bcd;p=cc65 New module for command line parsing git-svn-id: svn://svn.cc65.org/cc65/trunk@63 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/common/cmdline.c b/src/common/cmdline.c new file mode 100644 index 000000000..057afaa67 --- /dev/null +++ b/src/common/cmdline.c @@ -0,0 +1,149 @@ +/*****************************************************************************/ +/* */ +/* cmdline.c */ +/* */ +/* Helper functions for command line parsing */ +/* */ +/* */ +/* */ +/* (C) 2000 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include + +#include "cmdline.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +static char** ArgVec = 0; +static unsigned ArgCount = 0; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void InitCmdLine (char* aArgVec[], unsigned aArgCount) +/* Initialize command line parsing. aArgVec is the argument array terminated by + * a NULL pointer (as usual), ArgCount is the number of valid arguments in the + * array. Both arguments are remembered in static storage. + */ +{ + ArgVec = aArgVec; + ArgCount = aArgCount; +} + + + +void UnknownOption (const char* Opt) +/* Print an error about an unknown option. */ +{ + fprintf (stderr, "Unknown option: %s\n", Opt); + exit (EXIT_FAILURE); +} + + + +void NeedArg (const char* Opt) +/* Print an error about a missing option argument and exit. */ +{ + fprintf (stderr, "Option requires an argument: %s\n", Opt); + exit (EXIT_FAILURE); +} + + + +void InvSym (const char* Def) +/* Print an error about an invalid symbol definition and die */ +{ + fprintf (stderr, "Invalid symbol definition: `%s'\n", Def); + exit (EXIT_FAILURE); +} + + + +const char* GetArg (int* ArgNum, unsigned Len) +/* Get an argument for a short option. The argument may be appended to the + * option itself or may be separate. Len is the length of the option string. + */ +{ + const char* Arg = ArgVec[*ArgNum]; + if (Arg[Len] != '\0') { + /* Argument appended */ + return Arg + Len; + } else { + /* Separate argument */ + Arg = ArgVec[*ArgNum + 1]; + if (Arg == 0) { + /* End of arguments */ + NeedArg (ArgVec[*ArgNum]); + } + ++(*ArgNum); + return Arg; + } +} + + + +void LongOption (int* ArgNum, const LongOpt* OptTab, unsigned OptCount) +/* Handle a long command line option */ +{ + /* Get the option and the argument (which may be zero) */ + const char* Opt = ArgVec[*ArgNum]; + + /* Search the table for a match */ + while (OptCount) { + if (strcmp (Opt, OptTab->Option) == 0) { + /* Found, call the function */ + if (OptTab->ArgCount > 0) { + OptTab->Func (Opt, ArgVec[++(*ArgNum)]); + } else { + OptTab->Func (Opt, 0); + } + } + + /* Next table entry */ + --OptCount; + ++OptTab; + } + + /* Invalid option */ + UnknownOption (Opt); +} + + + diff --git a/src/common/cmdline.h b/src/common/cmdline.h new file mode 100644 index 000000000..c0c5a1af7 --- /dev/null +++ b/src/common/cmdline.h @@ -0,0 +1,93 @@ +/*****************************************************************************/ +/* */ +/* cmdline.h */ +/* */ +/* Helper functions for command line parsing */ +/* */ +/* */ +/* */ +/* (C) 2000 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef CMDLINE_H +#define CMDLINE_H + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* Structure defining a long option */ +typedef struct LongOpt LongOpt; +struct LongOpt { + const char* Option; + unsigned ArgCount; + void (*Func) (const char* Opt, const char* Arg); +}; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +void InitCmdLine (char* aArgVec[], unsigned aArgCount); +/* Initialize command line parsing. aArgVec is the argument array terminated by + * a NULL pointer (as usual), ArgCount is the number of valid arguments in the + * array. Both arguments are remembered in static storage. + */ + +void UnknownOption (const char* Opt); +/* Print an error about an unknown option. */ + +void NeedArg (const char* Opt); +/* Print an error about a missing option argument and exit. */ + +void InvSym (const char* Def); +/* Print an error about an invalid symbol definition and die */ + +const char* GetArg (int* ArgNum, unsigned Len); +/* Get an argument for a short option. The argument may be appended to the + * option itself or may be separate. Len is the length of the option string. + */ + +void LongOption (int* ArgNum, const LongOpt* OptTab, unsigned OptCount); +/* Handle a long command line option */ + + + +/* End of cmdline.h */ + +#endif + + + diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index d6df03ead..f50e1f18d 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -10,8 +10,9 @@ LIB = common.a OBJS = bitops.o \ + cmdline.o \ hashstr.o \ - xsprintf.o + xsprintf.o # ------------------------------------------------------------------------------ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index e3e6b30b3..949680695 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -66,10 +66,11 @@ CCCFG = -bt=$(TARGET) -d1 -onatx -zp4 -5 -zq -w2 # All library OBJ files OBJS = bitops.obj \ + cmdline.obj \ hashstr.obj \ wildargv.obj \ xsprintf.obj - + .PRECIOUS $(OBJS:.obj=.cc) $(LIB)