Factor out parsing of +tag, -tag operations from argv
into a separate function.
---
 notmuch-tag.c | 66 +++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 41 insertions(+), 25 deletions(-)

diff --git a/notmuch-tag.c b/notmuch-tag.c
index 88d559b..35a76db 100644
--- a/notmuch-tag.c
+++ b/notmuch-tag.c
@@ -167,11 +167,48 @@ tag_query (void *ctx, notmuch_database_t *notmuch, const 
char *query_string,
     return interrupted;
 }

+/* Parse +tag and -tag operations between argv[i] and argv[argc-1].
+ * The array tag_ops must be at least argc - i elements long.
+ * Returns the index into argv where parsing stopped, or -1 on error. */
+static int
+parse_tag_operations (int i, int argc, char *argv[],
+                     tag_operation_t *tag_ops, int *tag_ops_count)
+{
+    *tag_ops_count = 0;
+
+    for (; i < argc; i++) {
+       if (strcmp (argv[i], "--") == 0) {
+           i++;
+           break;
+       }
+       if (argv[i][0] == '+' || argv[i][0] == '-') {
+           if (argv[i][0] == '+' && argv[i][1] == '\0') {
+               fprintf (stderr, "Error: tag names cannot be empty.\n");
+               return -1;
+           }
+           if (argv[i][0] == '+' && argv[i][1] == '-') {
+               /* This disallows adding the non-removable tag "-" and
+                * enables notmuch tag to take long options in the
+                * future. */
+               fprintf (stderr, "Error: tag names must not start with '-'.\n");
+               return -1;
+           }
+           tag_ops[*tag_ops_count].tag = argv[i] + 1;
+           tag_ops[*tag_ops_count].remove = (argv[i][0] == '-');
+           (*tag_ops_count)++;
+       } else {
+           break;
+       }
+    }
+
+    return i;
+}
+
 int
 notmuch_tag_command (void *ctx, int argc, char *argv[])
 {
     tag_operation_t *tag_ops;
-    int tag_ops_count = 0;
+    int tag_ops_count;
     char *query_string;
     notmuch_config_t *config;
     notmuch_database_t *notmuch;
@@ -197,30 +234,9 @@ notmuch_tag_command (void *ctx, int argc, char *argv[])
        return 1;
     }

-    for (i = 0; i < argc; i++) {
-       if (strcmp (argv[i], "--") == 0) {
-           i++;
-           break;
-       }
-       if (argv[i][0] == '+' || argv[i][0] == '-') {
-           if (argv[i][0] == '+' && argv[i][1] == '\0') {
-               fprintf (stderr, "Error: tag names cannot be empty.\n");
-               return 1;
-           }
-           if (argv[i][0] == '+' && argv[i][1] == '-') {
-               /* This disallows adding the non-removable tag "-" and
-                * enables notmuch tag to take long options in the
-                * future. */
-               fprintf (stderr, "Error: tag names must not start with '-'.\n");
-               return 1;
-           }
-           tag_ops[tag_ops_count].tag = argv[i] + 1;
-           tag_ops[tag_ops_count].remove = (argv[i][0] == '-');
-           tag_ops_count++;
-       } else {
-           break;
-       }
-    }
+    i = parse_tag_operations (0, argc, argv, tag_ops, &tag_ops_count);
+    if (i < 0)
+       return 1;

     tag_ops[tag_ops_count].tag = NULL;

-- 
1.7.12.1

Reply via email to