From 06d7ae7d9ba1c09c3ce5ad805a89ea564449795d Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 9 May 2012 12:15:11 -0700 Subject: [PATCH] dynamic-string: New function ds_get_test_line(). This eliminates some code duplication. An upcoming commit will add another user. Signed-off-by: Ben Pfaff --- lib/dynamic-string.c | 48 +++++++++++++++++++++++++++++++++++++++++++ lib/dynamic-string.h | 1 + tests/test-odp.c | 17 +-------------- utilities/ovs-ofctl.c | 17 +-------------- 4 files changed, 51 insertions(+), 32 deletions(-) diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index e672af41..e7ad73cd 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -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) { diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h index 87102157..098caafe 100644 --- a/lib/dynamic-string.h +++ b/lib/dynamic-string.h @@ -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 *); diff --git a/tests/test-odp.c b/tests/test-odp.c index 123db71a..29732eb5 100644 --- a/tests/test-odp.c +++ b/tests/test-odp.c @@ -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); diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index ff61ffcd..c1fce83c 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -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); -- 2.30.2