]> git.sur5r.net Git - cc65/commitdiff
New module for command line parsing
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 14 Jun 2000 07:09:10 +0000 (07:09 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 14 Jun 2000 07:09:10 +0000 (07:09 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@63 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/common/cmdline.c [new file with mode: 0644]
src/common/cmdline.h [new file with mode: 0644]
src/common/make/gcc.mak
src/common/make/watcom.mak

diff --git a/src/common/cmdline.c b/src/common/cmdline.c
new file mode 100644 (file)
index 0000000..057afaa
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+
+#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 (file)
index 0000000..c0c5a1a
--- /dev/null
@@ -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
+
+
+
index d6df03ead356c55e97db74fc8eeef349faeef162..f50e1f18d35642099a7530cda1bcda86fefaac3b 100644 (file)
@@ -10,8 +10,9 @@ LIB   = common.a
 
 
 OBJS = bitops.o        \
+       cmdline.o       \
        hashstr.o       \
-       xsprintf.o      
+       xsprintf.o
 
 
 # ------------------------------------------------------------------------------
index e3e6b30b3992b471988fb394534262b2ad6d4211..949680695eda1108e6efe88569ce01965af74302 100644 (file)
@@ -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)