X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7410b72db09489e8b9d3ee3cb087f35882397d93..fb33f893495b18dc7a0e13182b901d4cf662150f:/src/xbt/xbt_strbuff.c diff --git a/src/xbt/xbt_strbuff.c b/src/xbt/xbt_strbuff.c index 1d3067c542..4369aca483 100644 --- a/src/xbt/xbt_strbuff.c +++ b/src/xbt/xbt_strbuff.c @@ -7,23 +7,26 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/strbuff.h" +#include #define minimal_increment 512 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(strbuff, xbt, "String buffers"); -inline void xbt_strbuff_empty(xbt_strbuff_t b) +/** @brief Remove any content from the buffer */ +inline void xbt_strbuff_clear(xbt_strbuff_t b) { b->used = 0; b->data[0] = '\0'; } +/** @brief Constructor */ xbt_strbuff_t xbt_strbuff_new(void) { xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t)); res->data = xbt_malloc(512); res->size = 512; - xbt_strbuff_empty(res); + xbt_strbuff_clear(res); return res; } @@ -35,7 +38,8 @@ inline xbt_strbuff_t xbt_strbuff_new_from(const char *ctn) { xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t)); res->data = xbt_strdup(ctn); - res->used = res->size = strlen(ctn); + res->size = strlen(ctn); + res->used = res->size; return res; } @@ -54,6 +58,7 @@ inline void xbt_strbuff_free(xbt_strbuff_t b) } } +/** @brief Adds some content at the end of the buffer */ void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd) { int addlen; @@ -68,10 +73,21 @@ void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd) b->size = MAX(minimal_increment + b->used, needed_space); b->data = xbt_realloc(b->data, b->size); } - strcpy(b->data + b->used, toadd); + strncpy(b->data + b->used, toadd, b->size-b->used); b->used += addlen; } +/** @brief format some content and push it at the end of the buffer */ +void xbt_strbuff_printf(xbt_strbuff_t b, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + char *data = bvprintf(fmt, ap); + xbt_strbuff_append(b, data); + xbt_free(data); + va_end(ap); +} + /** @brief Replaces a set of variables by their values * * @param b buffer to modify @@ -88,7 +104,8 @@ void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd) void xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns) { char *end; /* pointers around the parsed chunk */ - int in_simple_quote = 0, in_double_quote = 0; + int in_simple_quote = 0; + int in_double_quote = 0; int done = 0; if (b->data[0] == '\0') @@ -117,11 +134,13 @@ void xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns) case '$': if (!in_simple_quote) { /* Go for the substitution. First search the variable name */ - char *beg_var, *end_var; /* variable name boundary */ - char *beg_subst, *end_subst = NULL; /* where value should be written to */ - char *value, *default_value = NULL; + char *beg_var; + char *end_var; /* variable name boundary */ + char *beg_subst = end; + char *end_subst = NULL; /* where value should be written to */ + char *value; + char *default_value = NULL; int val_len; - beg_subst = end; if (*(++end) == '{') { /* the variable name is enclosed in braces. */