changeset 78:9fb70b7b34ff

Clean up error handling for field parsing.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 01 Jan 2016 06:14:00 +0200
parents d14c82880141
children 5709d0beb394
files sidinfo.c
diffstat 1 files changed, 32 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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;
             }