X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommon%2Fcmdline.c;h=0f6622934beabc03d002bad0ce35cdac7cc4663a;hb=858e95250586aa6ba9feb478a07accfd4ced42ae;hp=8ed149247028c1d6e9da27e53f061332cbe074bd;hpb=b7c8c651f6268c7f72ec8f4fa2a47202a52b07a2;p=cc65 diff --git a/src/common/cmdline.c b/src/common/cmdline.c index 8ed149247..0f6622934 100644 --- a/src/common/cmdline.c +++ b/src/common/cmdline.c @@ -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); } - - - -