X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdynamic-string.c;h=e672af41f43b51dfc382e3bb1d3e1cb4e5e1f891;hb=e0edde6fee279cdbbf3c179f5f50adaf0c7c7f1e;hp=79a7d8ee408c21209abee96f1e41858c8232d388;hpb=36c501fe7888bce761b5527dbd2ac7234543aef1;p=sliver-openvswitch.git diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index 79a7d8ee4..e672af41f 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, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ #include "timeval.h" #include "util.h" +/* Initializes 'ds' as an empty string buffer. */ void ds_init(struct ds *ds) { @@ -31,12 +32,16 @@ ds_init(struct ds *ds) ds->allocated = 0; } +/* Sets 'ds''s length to 0, effectively clearing any existing content. Does + * not free any memory. */ void -ds_clear(struct ds *ds) +ds_clear(struct ds *ds) { ds->length = 0; } +/* Reduces 'ds''s length to no more than 'new_length'. (If its length is + * already 'new_length' or less, does nothing.) */ void ds_truncate(struct ds *ds, size_t new_length) { @@ -46,6 +51,9 @@ ds_truncate(struct ds *ds, size_t new_length) } } +/* Ensures that at least 'min_length + 1' bytes (including space for a null + * terminator) are allocated for ds->string, allocating or reallocating memory + * as necessary. */ void ds_reserve(struct ds *ds, size_t min_length) { @@ -56,6 +64,9 @@ ds_reserve(struct ds *ds, size_t min_length) } } +/* Appends space for 'n' bytes to the end of 'ds->string', increasing + * 'ds->length' by the same amount, and returns the first appended byte. The + * caller should fill in all 'n' bytes starting at the return value. */ char * ds_put_uninit(struct ds *ds, size_t n) { @@ -147,8 +158,6 @@ ds_put_format_valist(struct ds *ds, const char *format, va_list args_) if (needed < available) { ds->length += needed; } else { - size_t available; - ds_reserve(ds, ds->length + needed); va_copy(args, args_); @@ -162,7 +171,7 @@ ds_put_format_valist(struct ds *ds, const char *format, va_list args_) } void -ds_put_printable(struct ds *ds, const char *s, size_t n) +ds_put_printable(struct ds *ds, const char *s, size_t n) { ds_reserve(ds, ds->length + n); while (n-- > 0) { @@ -175,13 +184,19 @@ 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'. */ void -ds_put_strftime(struct ds *ds, const char *template, const struct tm *tm) +ds_put_strftime(struct ds *ds, const char *template, bool utc) { - if (!tm) { - time_t now = time_now(); + const struct tm *tm; + time_t now = time_wall(); + if (utc) { + tm = gmtime(&now); + } else { tm = localtime(&now); } + for (;;) { size_t avail = ds->string ? ds->allocated - ds->length + 1 : 0; size_t used = strftime(&ds->string[ds->length], avail, template, tm); @@ -189,7 +204,7 @@ ds_put_strftime(struct ds *ds, const char *template, const struct tm *tm) ds->length += used; return; } - ds_reserve(ds, ds->length + (avail < 32 ? 64 : 2 * avail)); + ds_reserve(ds, ds->length + (avail < 32 ? 64 : 2 * avail)); } } @@ -209,6 +224,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) {