]> git.sur5r.net Git - cc65/blobdiff - src/common/cmdline.c
Merge pull request #494 from jedeoric/master
[cc65] / src / common / cmdline.c
index 8ed149247028c1d6e9da27e53f061332cbe074bd..0f6622934beabc03d002bad0ce35cdac7cc4663a 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                cmdline.c                                 */
+/*                                 cmdline.c                                 */
 /*                                                                           */
-/*                Helper functions for command line parsing                 */
+/*                 Helper functions for command line parsing                 */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
@@ -47,7 +47,7 @@
 
 
 /*****************************************************************************/
-/*                                          Data                                    */
+/*                                   Data                                    */
 /*****************************************************************************/
 
 
@@ -62,14 +62,14 @@ unsigned ArgCount = 0;
 /* Struct to pass the command line */
 typedef struct {
     char**      Vec;            /* The argument vector */
-    unsigned           Count;          /* Actual number of arguments */
-    unsigned           Size;           /* Number of argument allocated */
+    unsigned    Count;          /* Actual number of arguments */
+    unsigned    Size;           /* Number of argument allocated */
 } CmdLine;
 
 
 
 /*****************************************************************************/
-/*                            Helper functions                              */
+/*                             Helper functions                              */
 /*****************************************************************************/
 
 
@@ -89,13 +89,13 @@ static void AddArg (CmdLine* L, char* Arg)
 /* Add one argument to the list */
 {
     if (L->Size <= L->Count) {
-       /* No space left, reallocate */
-       unsigned NewSize = L->Size * 2;
-       char**   NewVec  = xmalloc (NewSize * sizeof (L->Vec[0]));
-       memcpy (NewVec, L->Vec, L->Count * sizeof (L->Vec[0]));
-       xfree (L->Vec);
-       L->Vec  = NewVec;
-       L->Size = NewSize;
+        /* No space left, reallocate */
+        unsigned NewSize = L->Size * 2;
+        char**   NewVec  = xmalloc (NewSize * sizeof (L->Vec[0]));
+        memcpy (NewVec, L->Vec, L->Count * sizeof (L->Vec[0]));
+        xfree (L->Vec);
+        L->Vec  = NewVec;
+        L->Size = NewSize;
     }
 
     /* We have space left, add a copy of the argument */
@@ -106,115 +106,115 @@ static void AddArg (CmdLine* L, char* Arg)
 
 static void ExpandFile (CmdLine* L, const char* Name)
 /* Add the contents of a file to the command line. Each line is a separate
- * argument with leading and trailing whitespace removed.
- */
+** argument with leading and trailing whitespace removed.
+*/
 {
     char Buf [256];
 
     /* Try to open the file for reading */
     FILE* F = fopen (Name, "r");
     if (F == 0) {
-       AbEnd ("Cannot open \"%s\": %s", Name, strerror (errno));
+        AbEnd ("Cannot open \"%s\": %s", Name, strerror (errno));
     }
 
     /* File is open, read all lines */
     while (fgets (Buf, sizeof (Buf), F) != 0) {
 
-       /* Get a pointer to the buffer */
-       const char* B = Buf;
+        /* Get a pointer to the buffer */
+        const char* B = Buf;
 
-       /* Skip trailing whitespace (this will also kill the newline that is
-        * appended by fgets().
-        */
-       unsigned Len = strlen (Buf);
-       while (Len > 0 && IsSpace (Buf [Len-1])) {
-           --Len;
-       }
-       Buf [Len] = '\0';
+        /* Skip trailing whitespace (this will also kill the newline that is
+        ** appended by fgets().
+        */
+        unsigned Len = strlen (Buf);
+        while (Len > 0 && IsSpace (Buf [Len-1])) {
+            --Len;
+        }
+        Buf [Len] = '\0';
 
-       /* Skip leading spaces */
-       while (IsSpace (*B)) {
-           ++B;
-       }
+        /* Skip leading spaces */
+        while (IsSpace (*B)) {
+            ++B;
+        }
 
-       /* Skip empty lines to work around problems with some editors */
-       if (*B == '\0') {
-           continue;
-       }
+        /* Skip empty lines to work around problems with some editors */
+        if (*B == '\0') {
+            continue;
+        }
 
-       /* Add anything not empty to the command line */
-       AddArg (L, xstrdup (B));
+        /* Add anything not empty to the command line */
+        AddArg (L, xstrdup (B));
 
     }
 
     /* Close the file, ignore errors here since we had the file open for
-     * reading only.
-     */
+    ** reading only.
+    */
     (void) fclose (F);
 }
 
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
 
-void InitCmdLine (int* aArgCount, char** aArgVec[], const char* aProgName)
+void InitCmdLine (int* aArgCount, char*** aArgVec, const char* aProgName)
 /* 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.
- */
+** a NULL pointer (as usual), ArgCount is the number of valid arguments in the
+** array. Both arguments are remembered in static storage.
+*/
 {
-    CmdLine    L;
+    CmdLine     L;
     int         I;
 
     /* Get the program name from argv[0] but strip a path */
-    if (*(aArgVec)[0] == 0) {
-       /* Use the default name given */
-       ProgName = aProgName;
+    if ((*aArgVec)[0] == 0) {
+        /* Use the default name given */
+        ProgName = aProgName;
     } else {
-       /* Strip a path */
-               ProgName = FindName ((*aArgVec)[0]);
-       if (ProgName[0] == '\0') {
-           /* Use the default */
-           ProgName = aProgName;
-       }
+        /* Strip a path */
+        ProgName = FindName ((*aArgVec)[0]);
+        if (ProgName[0] == '\0') {
+            /* Use the default */
+            ProgName = aProgName;
+        }
     }
 
     /* Make a CmdLine struct */
     NewCmdLine (&L);
 
     /* Walk over the parameters and add them to the CmdLine struct. Add a
-     * special handling for arguments preceeded by the '@' sign - these are
-     * actually files containing arguments.
-     */
-    for (I = 0; I < *aArgCount; ++I) {
+    ** special handling for arguments preceeded by the '@' sign - these are
+    ** actually files containing arguments.
+    */
+    for (I = 0; I <= *aArgCount; ++I) {
 
-       /* Get the next argument */
-       char* Arg = (*aArgVec)[I];
+        /* Get the next argument */
+        char* Arg = (*aArgVec)[I];
 
-       /* Is this a file argument? */
-       if (Arg && Arg[0] == '@') {
+        /* Is this a file argument? */
+        if (Arg && Arg[0] == '@') {
 
-           /* Expand the file */
-           ExpandFile (&L, Arg+1);
+            /* Expand the file */
+            ExpandFile (&L, Arg+1);
 
-       } else {
+        } else {
 
-           /* No file, just add a copy */
-           AddArg (&L, Arg);
+            /* No file, just add a copy */
+            AddArg (&L, Arg);
 
-       }
+        }
     }
 
     /* Store the new argument list in a safe place... */
-    ArgCount = L.Count;
+    ArgCount = L.Count - 1;
     ArgVec   = L.Vec;
 
     /* ...and pass back the changed data also */
-    *aArgCount = L.Count;
+    *aArgCount = L.Count - 1;
     *aArgVec   = L.Vec;
 }
 
@@ -254,22 +254,22 @@ void InvDef (const char* Def)
 
 const char* GetArg (unsigned* 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.
- */
+** 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;
+        /* Argument appended */
+        return Arg + Len;
     } else {
-       /* Separate argument */
-       Arg = ArgVec[*ArgNum + 1];
-       if (Arg == 0) {
-           /* End of arguments */
-           NeedArg (ArgVec[*ArgNum]);
-       }
-       ++(*ArgNum);
-       return Arg;
+        /* Separate argument */
+        Arg = ArgVec[*ArgNum + 1];
+        if (Arg == 0) {
+            /* End of arguments */
+            NeedArg (ArgVec[*ArgNum]);
+        }
+        ++(*ArgNum);
+        return Arg;
     }
 }
 
@@ -283,31 +283,27 @@ void LongOption (unsigned* ArgNum, const LongOpt* OptTab, unsigned OptCount)
 
     /* Search the table for a match */
     while (OptCount) {
-       if (strcmp (Opt, OptTab->Option) == 0) {
-           /* Found, call the function */
-           if (OptTab->ArgCount > 0) {
-               /* We need an argument, check if we have one */
-               const char* Arg = ArgVec[++(*ArgNum)];
-               if (Arg == 0) {
-                   NeedArg (Opt);
-               }
-               OptTab->Func (Opt, Arg);
-           } else {
-               OptTab->Func (Opt, 0);
-           }
-           /* Done */
-           return;
-       }
-
-       /* Next table entry */
-       --OptCount;
-       ++OptTab;
+        if (strcmp (Opt, OptTab->Option) == 0) {
+            /* Found, call the function */
+            if (OptTab->ArgCount > 0) {
+                /* We need an argument, check if we have one */
+                const char* Arg = ArgVec[++(*ArgNum)];
+                if (Arg == 0) {
+                    NeedArg (Opt);
+                }
+                OptTab->Func (Opt, Arg);
+            } else {
+                OptTab->Func (Opt, 0);
+            }
+            /* Done */
+            return;
+        }
+
+        /* Next table entry */
+        --OptCount;
+        ++OptTab;
     }
 
     /* Invalid option */
     UnknownOption (Opt);
 }
-
-
-
-