From: Ben Pfaff Date: Fri, 11 Mar 2011 19:52:12 +0000 (-0800) Subject: dynamic-string: New function ds_get_preprocessed_line(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd8101bc538cdad7a99f61666760fa79e6c047af;p=openvswitch dynamic-string: New function ds_get_preprocessed_line(). This commit adds one user. It will be useful elsewhere in an upcoming commit. --- diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index 3af7fc9f..dbb33a35 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -207,6 +207,32 @@ ds_get_line(struct ds *ds, FILE *file) } } +/* Reads a line from 'file' into 'ds', clearing anything initially in 'ds'. + * Deletes comments introduced by "#" and skips lines that contains only white + * space (after deleting comments). + * + * Returns 0 if successful, EOF if no non-blank line was found. */ +int +ds_get_preprocessed_line(struct ds *ds, FILE *file) +{ + while (!ds_get_line(ds, file)) { + char *line = ds_cstr(ds); + char *comment; + + /* Delete comments. */ + comment = strchr(line, '#'); + if (comment) { + *comment = '\0'; + } + + /* Return successfully unless the line is all spaces. */ + if (line[strspn(line, " \t\n")] != '\0') { + return 0; + } + } + return EOF; +} + char * ds_cstr(struct ds *ds) { diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h index db033c98..2961a013 100644 --- a/lib/dynamic-string.h +++ b/lib/dynamic-string.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,6 +54,7 @@ void ds_put_strftime(struct ds *, const char *, const struct tm *) 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 *); char *ds_cstr(struct ds *); const char *ds_cstr_ro(const struct ds *); diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 73c3ebc4..f1a4cb44 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -874,27 +874,13 @@ bool parse_ofp_add_flow_file(struct list *packets, enum nx_flow_format *cur, FILE *stream) { - struct ds s = DS_EMPTY_INITIALIZER; - bool ok = false; + struct ds s; + bool ok; - while (!ds_get_line(&s, stream)) { - char *line = ds_cstr(&s); - char *comment; - - /* Delete comments. */ - comment = strchr(line, '#'); - if (comment) { - *comment = '\0'; - } - - /* Drop empty lines. */ - if (line[strspn(line, " \t\n")] == '\0') { - continue; - } - - parse_ofp_flow_mod_str(packets, cur, line, OFPFC_ADD); - ok = true; - break; + ds_init(&s); + ok = ds_get_preprocessed_line(&s, stream) == 0; + if (ok) { + parse_ofp_flow_mod_str(packets, cur, ds_cstr(&s), OFPFC_ADD); } ds_destroy(&s);