changeset 143:e481947fd051

Improve format string parsing.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 13 Jun 2017 01:24:38 +0300
parents da29f147afcb
children 6418286a7e4c
files sidinfo.c
diffstat 1 files changed, 30 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/sidinfo.c	Mon Jun 05 09:31:57 2017 +0300
+++ b/sidinfo.c	Tue Jun 13 01:24:38 2017 +0300
@@ -296,36 +296,43 @@
             break;
 
         case 1:
-            if (*fmt == '@')
+            if (*fmt != '@')
+            {
+                if (*fmt == 0)
+                    mode = -1;
+                fmt++;
+                break;
+            }
+
+            if (fmt - start == 0)
             {
-                if (fmt - start == 0)
+                item.cmd = -2;
+                item.str = NULL;
+                item.chr = '@';
+                if (!siStackAddItem(stack, &item))
+                    return FALSE;
+            }
+            else
+            {
+                char *field = th_strndup_trim(start, fmt - start, TH_TRIM_BOTH);
+
+                int ret = argMatchPSFieldError(field);
+                if (ret >= 0)
                 {
-                    item.cmd = -2;
+                    item.cmd = ret;
+                    item.flags = 0;
                     item.str = NULL;
-                    item.chr = '@';
+
                     if (!siStackAddItem(stack, &item))
-                        return FALSE;
+                        rval = FALSE;
                 }
                 else
-                {
-                    char *field = th_strndup_trim(start, fmt - start, TH_TRIM_BOTH);
-                    int ret = argMatchPSFieldError(field);
-                    th_free(field);
-                    if (ret >= 0)
-                    {
-                        item.cmd = ret;
-                        item.str = NULL;
-                        if (!siStackAddItem(stack, &item))
-                            return FALSE;
-                    }
-                    else
-                        rval = FALSE;
-                }
-                mode = 0;
+                    rval = FALSE;
+
+                th_free(field);
             }
-            else
-            if (*fmt == 0)
-                mode = -1;
+
+            mode = 0;
             fmt++;
             break;