# HG changeset patch # User Matti Hamalainen # Date 1451621640 -7200 # Node ID 9fb70b7b34ff799c9e3188074299ef1d63793785 # Parent d14c8288014181e9388886fb1b032a301deba889 Clean up error handling for field parsing. diff -r d14c82880141 -r 9fb70b7b34ff sidinfo.c --- a/sidinfo.c Fri Jan 01 05:26:15 2016 +0200 +++ b/sidinfo.c Fri Jan 01 06:14:00 2016 +0200 @@ -155,13 +155,13 @@ } -int argMatchPSField(const char *field, const size_t len) +int argMatchPSField(const char *field) { int index, found = -1; for (index = 0; index < noptPSFlags; index++) { const PSFOption *opt = &optPSFlags[index]; - if (th_strncasecmp(opt->name, field, len) == 0) + if (th_strcasecmp(opt->name, field) == 0) { if (found >= 0) return -2; @@ -173,6 +173,23 @@ } +int argMatchPSFieldError(const char *field) +{ + int found = argMatchPSField(field); + switch (found) + { + case -1: + THERR("No such field '%s'.\n", field); + break; + + case -2: + THERR("Field '%s' is ambiguous.\n", field); + break; + } + return found; +} + + BOOL argParsePSField(char *opt, char *end, uint32_t *fields) { // Trim whitespace @@ -182,21 +199,13 @@ while (*opt && th_isspace(*opt)) opt++; // Match field name - int found = argMatchPSField(opt, (end != NULL) ? end - opt : strlen(opt)); - switch (found) - { - case -1: - THERR("No such field '%s'.\n", opt); - return FALSE; + char *field = (end != NULL) ? th_strndup(opt, end - opt) : th_strdup(opt); + int found = argMatchPSFieldError(field); + if (found >= 0) + *fields |= optPSFlags[found].flag; - case -2: - THERR("Field '%s' is ambiguous.\n", opt); - return FALSE; - - default: - *fields |= optPSFlags[found].flag; - return TRUE; - } + th_free(field); + return FALSE; } @@ -275,19 +284,19 @@ } else { - int ret = argMatchPSField(start, fmt - start); - if (ret >= 0) + char *field = th_strndup(start, fmt - start); + int ret = argMatchPSFieldError(field); + if (found >= 0) { item.cmd = ret; item.str = NULL; if (!siStackAddItem(&optFormat, &item)) + { + th_free(field); return FALSE; + } } - else - { - THERR("Foobar %d\n", ret); - return FALSE; - } + th_free(field); } mode = 0; }