X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=support%2FUtil%2Fdbuf_string.c;h=61e125e46aa5364ab98971baa511c0e82ef5f219;hb=f3a44fc094dc5ce393e2029d3c7c6587a4b1a835;hp=5d38c2100147349d6ff9b7bd3ea31948b88a1ab5;hpb=589f48dc0e58659d84dd97b7c40a94081d4d0936;p=fw%2Fsdcc diff --git a/support/Util/dbuf_string.c b/support/Util/dbuf_string.c index 5d38c210..61e125e4 100644 --- a/support/Util/dbuf_string.c +++ b/support/Util/dbuf_string.c @@ -1,8 +1,8 @@ /* dbuf_string.c - Append formatted string to the dynamic buffer - version 1.0.0, January 6th, 2007 + version 1.2.0, February 10th, 2008 - Copyright (c) 2002-2007 Borut Razem + Copyright (c) 2002-2008 Borut Razem This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,25 +30,44 @@ /* * Append string to the end of the buffer. + * The buffer is null terminated. */ int -dbuf_append_str(struct dbuf_s *dbuf, const char *str) +dbuf_append_str (struct dbuf_s *dbuf, const char *str) { - assert(str != NULL); + size_t len; + assert (str != NULL); - return dbuf_append(dbuf, str, strlen(str)); + len = strlen (str); + if (dbuf_append (dbuf, str, len + 1)) + { + --dbuf->len; + return 1; + } + else + return 0; } /* * Append single character to the end of the buffer. + * The buffer is null terminated. */ int -dbuf_append_char(struct dbuf_s *dbuf, char chr) +dbuf_append_char (struct dbuf_s *dbuf, char chr) { - return dbuf_append(dbuf, &chr, 1); + char buf[2]; + buf[0] = chr; + buf[1] = '\0'; + if (dbuf_append (dbuf, buf, 2)) + { + --dbuf->len; + return 1; + } + else + return 0; } /* @@ -69,68 +88,68 @@ calc_result_length (const char *format, va_list args) #ifdef va_copy va_copy (ap, args); #else - memcpy ((PTR) &ap, (PTR) &args, sizeof (va_list)); + memcpy (&ap, &args, sizeof (va_list)); #endif while (*p != '\0') { if (*p++ == '%') - { - while (strchr ("-+ #0", *p)) - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, (char **) &p, 10); - if (*p == '.') - { - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, (char **) &p, 10); - } - while (strchr ("hlL", *p)) - ++p; - /* Should be big enough for any format specifier except %s and floats. */ - total_width += 30; - switch (*p) - { - case 'd': - case 'i': - case 'o': - case 'u': - case 'x': - case 'X': - case 'c': - (void) va_arg (ap, int); - break; - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - (void) va_arg (ap, double); - /* Since an ieee double can have an exponent of 307, we'll - make the buffer wide enough to cover the gross case. */ - total_width += 307; - break; - case 's': - total_width += strlen (va_arg (ap, char *)); - break; - case 'p': - case 'n': - (void) va_arg (ap, char *); - break; - } - p++; - } + { + while (strchr ("-+ #0", *p)) + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + if (*p == '.') + { + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + } + while (strchr ("hlL", *p)) + ++p; + /* Should be big enough for any format specifier except %s and floats. */ + total_width += 30; + switch (*p) + { + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + case 'c': + (void) va_arg (ap, int); + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + (void) va_arg (ap, double); + /* Since an ieee double can have an exponent of 307, we'll + make the buffer wide enough to cover the gross case. */ + total_width += 307; + break; + case 's': + total_width += strlen (va_arg (ap, char *)); + break; + case 'p': + case 'n': + (void) va_arg (ap, char *); + break; + } + p++; + } } #ifdef va_copy va_end (ap); @@ -141,6 +160,7 @@ calc_result_length (const char *format, va_list args) /* * Append the formatted string to the end of the buffer. + * The buffer is null terminated. */ int @@ -148,21 +168,23 @@ dbuf_vprintf (struct dbuf_s *dbuf, const char *format, va_list args) { int size = calc_result_length (format, args); - assert(dbuf != NULL); - assert(dbuf->alloc != 0); - assert(dbuf->buf != NULL); - - if (_dbuf_expand(dbuf, size) != 0) { - int len = vsprintf(&(((char *)dbuf->buf)[dbuf->len]), format, args); + assert (dbuf != NULL); + assert (dbuf->alloc != 0); + assert (dbuf->buf != NULL); - if (len >= 0) { - /* if written length is greater then the calculated one, - we have a buffer overrun! */ - assert(len <= size); - dbuf->len += len; + if (0 != _dbuf_expand (dbuf, size)) + { + int len = vsprintf (&(((char *)dbuf->buf)[dbuf->len]), format, args); + + if (len >= 0) + { + /* if written length is greater then the calculated one, + we have a buffer overrun! */ + assert (len <= size); + dbuf->len += len; + } + return len; } - return len; - } return 0; } @@ -170,6 +192,7 @@ dbuf_vprintf (struct dbuf_s *dbuf, const char *format, va_list args) /* * Append the formatted string to the end of the buffer. + * The buffer is null terminated. */ int @@ -179,13 +202,79 @@ dbuf_printf (struct dbuf_s *dbuf, const char *format, ...) int len; va_start (arg, format); - len = dbuf_vprintf(dbuf, format, arg); + len = dbuf_vprintf (dbuf, format, arg); va_end (arg); return len; } +/* + * Append line from file to the dynamic buffer + * The buffer is null terminated. + */ + +size_t +dbuf_getline (struct dbuf_s *dbuf, FILE *infp) +{ + int c; + char chr; + + while ((c = getc (infp)) != '\n' && c != EOF) + { + chr = c; + + dbuf_append (dbuf, &chr, 1); + } + + /* add trailing NL */ + if (c == '\n') + { + chr = c; + + dbuf_append (dbuf, &chr, 1); + } + + /* terminate the line without increasing the length */ + if (0 != _dbuf_expand (dbuf, 1)) + ((char *)dbuf->buf)[dbuf->len] = '\0'; + + return dbuf_get_length (dbuf); +} + + +/* + * Remove trailing newline from the string. + * The buffer is null terminated. + * It returns the total number of characters removed. + */ + +int +dbuf_chomp (struct dbuf_s *dbuf) +{ + size_t i = dbuf->len; + int ret; + + if ('\n' == ((char *)dbuf->buf)[i - 1]) + { + --i; + if ('\r' == ((char *)dbuf->buf)[i - 1]) + { + --i; + } + } + + ret = dbuf->len - i; + dbuf->len = i; + + /* terminate the line without increasing the length */ + if (_dbuf_expand(dbuf, 1) != 0) + ((char *)dbuf->buf)[dbuf->len] = '\0'; + + return ret; +} + + /* * Write dynamic buffer to the file. */ @@ -193,7 +282,10 @@ dbuf_printf (struct dbuf_s *dbuf, const char *format, ...) void dbuf_write (struct dbuf_s *dbuf, FILE *dest) { - fwrite(dbuf_get_buf(dbuf), 1, dbuf_get_length(dbuf), dest); + size_t res; + size_t len = dbuf_get_length (dbuf); + res = fwrite (dbuf_get_buf (dbuf), 1, len, dest); + assert(res == len); } @@ -206,5 +298,5 @@ dbuf_write_and_destroy (struct dbuf_s *dbuf, FILE *dest) { dbuf_write (dbuf, dest); - dbuf_destroy(dbuf); + dbuf_destroy (dbuf); }