diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2009-12-09 03:52:08 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2009-12-09 03:52:08 +0000 |
commit | 481a3f5110e03c2301e53837da2666114b5efa5c (patch) | |
tree | 77e1d1272c4252785583794324e5e7007da1d60e /lib/util/shhopt.c | |
parent | ca1c1c7c4ca76728b3134cf685e8b8a6142e663b (diff) | |
download | netpbm-mirror-481a3f5110e03c2301e53837da2666114b5efa5c.tar.gz netpbm-mirror-481a3f5110e03c2301e53837da2666114b5efa5c.tar.xz netpbm-mirror-481a3f5110e03c2301e53837da2666114b5efa5c.zip |
new facilities needed by recently committed Pnmconvol updates: string list option type, token parsing, file line I/O
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1031 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib/util/shhopt.c')
-rw-r--r-- | lib/util/shhopt.c | 88 |
1 files changed, 50 insertions, 38 deletions
diff --git a/lib/util/shhopt.c b/lib/util/shhopt.c index 718186fa..7f6e2899 100644 --- a/lib/util/shhopt.c +++ b/lib/util/shhopt.c @@ -31,6 +31,7 @@ #include "mallocvar.h" #include "nstring.h" +#include "token.h" #include "shhopt.h" /*-----------------------------------------------------------------------+ @@ -237,6 +238,7 @@ optNeedsArgument(const optEntry opt) || opt.type == OPT_ULONG || opt.type == OPT_FLOAT || opt.type == OPT_NAMELIST + || opt.type == OPT_STRINGLIST ; } @@ -281,46 +283,12 @@ getToken(const char * const tokenStart, we return an empty string and *nextP == tokenStart, i.e. *nextP doesn't necessarily advance. -----------------------------------------------------------------------------*/ - char * token; - const char * cursor; - unsigned int charCount; - - /* Run through the token, counting characters */ - - charCount = 0; - cursor = tokenStart; - - while (*cursor != delimiter && *cursor != '\0') { - if (*cursor == '\\') { - ++cursor; - if (*cursor == '\0') - optFatal("string ends with an escape character (\\)"); - } - ++cursor; - ++charCount; - } + const char * error; - token = malloc(charCount + 1); - if (token == NULL) - optFatal("Could not allocate %u bytes of memory to parse a string", - charCount + 1); - - /* Go back and do it again, this time copying the characters */ - charCount = 0; - cursor = tokenStart; - - while (*cursor != delimiter && *cursor != '\0') { - if (*cursor == '\\') - ++cursor; - - assert(*cursor != '\0'); + pm_gettoken(tokenStart, delimiter, tokenP, nextP, &error); - token[charCount++] = *cursor++; - } - token[charCount] = '\0'; - - *tokenP = token; - *nextP = cursor; + if (error) + optFatal("error parsing a token: %s", error); } @@ -375,6 +343,41 @@ parseNameList(const char * const listText, +static void +parseStringList(const char * const listText, + const char *** const listP) { + + unsigned int const maxStringCount = 100; + + const char * cursor; + unsigned int stringCount; + const char ** list; + + MALLOCARRAY_NOFAIL(list, maxStringCount+1); + + cursor = &listText[0]; /* initial value */ + + stringCount = 0; /* initial value */ + + while (stringCount < maxStringCount && *cursor != '\0') { + const char * next; + + getToken(cursor, ',', &list[stringCount++], &next); + + cursor = next; + + if (*cursor != '\0') { + assert(*cursor == ','); + ++cursor; + } + } + list[stringCount] = NULL; + + *listP = list; +} + + + /*------------------------------------------------------------------------ | NAME optExecute | @@ -479,6 +482,15 @@ optExecute(optEntry const opt, char *arg, int lng) parseNameList(arg, (struct optNameValue **)opt.arg); } break; + case OPT_STRINGLIST: { + if (arg == NULL) + optFatal("internal error: optExecute() called with NULL argument " + "'%s'", optString(opt, lng)); + + if (opt.arg) + parseStringList(arg, (const char ***)opt.arg); + + } break; default: break; } |