X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdynamic-string.c;h=ba9aa6dd609d140c1314480cab65be64c9dd75e3;hb=f40869bdf6feca4d3ff7c59a1fb1f7ac101bc967;hp=e672af41f43b51dfc382e3bb1d3e1cb4e5e1f891;hpb=e0edde6fee279cdbbf3c179f5f50adaf0c7c7f1e;p=sliver-openvswitch.git diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index e672af41f..ba9aa6dd6 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include #include "dynamic-string.h" -#include #include #include #include @@ -165,7 +164,7 @@ ds_put_format_valist(struct ds *ds, const char *format, va_list args_) needed = vsnprintf(&ds->string[ds->length], available, format, args); va_end(args); - assert(needed < available); + ovs_assert(needed < available); ds->length += needed; } } @@ -184,22 +183,21 @@ ds_put_printable(struct ds *ds, const char *s, size_t n) } } -/* Writes the current time to 'string' based on 'template'. - * The current time is either localtime or UTC based on 'utc'. */ +/* Writes time 'when' to 'string' based on 'template', in local time or UTC + * based on 'utc'. */ void -ds_put_strftime(struct ds *ds, const char *template, bool utc) +ds_put_strftime(struct ds *ds, const char *template, time_t when, bool utc) { - const struct tm *tm; - time_t now = time_wall(); + struct tm tm; if (utc) { - tm = gmtime(&now); + gmtime_r(&when, &tm); } else { - tm = localtime(&now); + localtime_r(&when, &tm); } for (;;) { size_t avail = ds->string ? ds->allocated - ds->length + 1 : 0; - size_t used = strftime(&ds->string[ds->length], avail, template, tm); + size_t used = strftime(&ds->string[ds->length], avail, template, &tm); if (used) { ds->length += used; return; @@ -208,6 +206,18 @@ ds_put_strftime(struct ds *ds, const char *template, bool utc) } } +/* Returns a malloc()'d string for time 'when' based on 'template', in local + * time or UTC based on 'utc'. */ +char * +xastrftime(const char *template, time_t when, bool utc) +{ + struct ds s; + + ds_init(&s); + ds_put_strftime(&s, template, when, utc); + return s.string; +} + int ds_get_line(struct ds *ds, FILE *file) { @@ -250,6 +260,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) { @@ -263,7 +321,7 @@ ds_cstr(struct ds *ds) const char * ds_cstr_ro(const struct ds *ds) { - return ds_cstr((struct ds *) ds); + return ds_cstr(CONST_CAST(struct ds *, ds)); } /* Returns a null-terminated string representing the current contents of 'ds',