dynamic-string: New function ds_get_test_line().
authorBen Pfaff <blp@nicira.com>
Wed, 9 May 2012 19:15:11 +0000 (12:15 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 10 May 2012 18:44:05 +0000 (11:44 -0700)
This eliminates some code duplication.   An upcoming commit will add
another user.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/dynamic-string.c
lib/dynamic-string.h
tests/test-odp.c
utilities/ovs-ofctl.c

index e672af41f43b51dfc382e3bb1d3e1cb4e5e1f891..e7ad73cd667996bd4f7628ed0bfb7ef34fb6503d 100644 (file)
@@ -250,6 +250,54 @@ ds_get_preprocessed_line(struct ds *ds, FILE *file)
     return EOF;
 }
 
+/* Reads a line from 'file' into 'ds' and does some preprocessing on it:
+ *
+ *    - If the line begins with #, prints it on stdout and reads the next line.
+ *
+ *    - Otherwise, if the line contains an # somewhere else, strips it and
+ *      everything following it (as a comment).
+ *
+ *    - If (after comment removal) the line contains only white space, prints
+ *      a blank line on stdout and reads the next line.
+ *
+ *    - Otherwise, returns the line to the caller.
+ *
+ * This is useful in some of the OVS tests, where we want to check that parsing
+ * and then re-formatting some kind of data does not change it, but we also
+ * want to be able to put comments in the input.
+ *
+ * Returns 0 if successful, EOF if no non-blank line was found. */
+int
+ds_get_test_line(struct ds *ds, FILE *file)
+{
+    for (;;) {
+        char *s, *comment;
+        int retval;
+
+        retval = ds_get_line(ds, file);
+        if (retval) {
+            return retval;
+        }
+
+        s = ds_cstr(ds);
+        if (*s == '#') {
+            puts(s);
+            continue;
+        }
+
+        comment = strchr(s, '#');
+        if (comment) {
+            *comment = '\0';
+        }
+        if (s[strspn(s, " \t\n")] == '\0') {
+            putchar('\n');
+            continue;
+        }
+
+        return 0;
+    }
+}
+
 char *
 ds_cstr(struct ds *ds)
 {
index 871021572d731ac52df3b9445de97ba2aff0ea05..098caafe72e713b4acddb9a0366a1167634b4045 100644 (file)
@@ -62,6 +62,7 @@ void ds_put_hex_dump(struct ds *ds, const void *buf_, size_t size,
                      uintptr_t ofs, bool ascii);
 int ds_get_line(struct ds *, FILE *);
 int ds_get_preprocessed_line(struct ds *, FILE *);
+int ds_get_test_line(struct ds *, FILE *);
 
 char *ds_cstr(struct ds *);
 const char *ds_cstr_ro(const struct ds *);
index 123db71a7a7405337e0dc1b376ca6e3bfbc335f6..29732eb58baf77863142f90d7bfcfab11b755d82 100644 (file)
@@ -31,27 +31,12 @@ main(void)
 
     ds_init(&in);
     vlog_set_levels_from_string("odp_util:console:dbg");
-    while (!ds_get_line(&in, stdin)) {
+    while (!ds_get_test_line(&in, stdin)) {
         enum odp_key_fitness fitness;
         struct ofpbuf odp_key;
         struct flow flow;
         struct ds out;
         int error;
-        char *s;
-
-        /* Delete comments, skip blank lines. */
-        s = ds_cstr(&in);
-        if (*s == '#') {
-            puts(s);
-            continue;
-        }
-        if (strchr(s, '#')) {
-            *strchr(s, '#') = '\0';
-        }
-        if (s[strspn(s, " ")] == '\0') {
-            putchar('\n');
-            continue;
-        }
 
         /* Convert string to OVS DP key. */
         ofpbuf_init(&odp_key, 0);
index ff61ffcd79787e2088dc55f2341185d8ea6e3616..c1fce83cf181865ea591319c39cbf0847bf50eb3 100644 (file)
@@ -1906,27 +1906,12 @@ do_parse_nx_match(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
     struct ds in;
 
     ds_init(&in);
-    while (!ds_get_line(&in, stdin)) {
+    while (!ds_get_test_line(&in, stdin)) {
         struct ofpbuf nx_match;
         struct cls_rule rule;
         ovs_be64 cookie, cookie_mask;
         enum ofperr error;
         int match_len;
-        char *s;
-
-        /* Delete comments, skip blank lines. */
-        s = ds_cstr(&in);
-        if (*s == '#') {
-            puts(s);
-            continue;
-        }
-        if (strchr(s, '#')) {
-            *strchr(s, '#') = '\0';
-        }
-        if (s[strspn(s, " ")] == '\0') {
-            putchar('\n');
-            continue;
-        }
 
         /* Convert string to nx_match. */
         ofpbuf_init(&nx_match, 0);