Fix memory leak.
[darkstat] / str.c
diff --git a/str.c b/str.c
index e6866da..852a24d 100644 (file)
--- a/str.c
+++ b/str.c
@@ -1,5 +1,5 @@
 /* darkstat 3
- * copyright (c) 2001-2008 Emil Mikulic.
+ * copyright (c) 2001-2011 Emil Mikulic.
  *
  * str.c: string buffer with pool-based reallocation
  *
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include "conv.h"
+#include "err.h"
+#include "str.h"
+
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h> /* for uint32_t on Linux and OS X */
-
-#include "darkstat.h"
-#include "conv.h"
-#include "err.h"
-#include "str.h"
+#include <unistd.h>
 
 #define INITIAL_LEN 1024
 
@@ -63,7 +63,7 @@ str_extract(struct str *s, size_t *len, char **str)
 }
 
 void
-str_append2(struct str *buf, const char *s, const size_t len)
+str_appendn(struct str *buf, const char *s, const size_t len)
 {
    if (buf->pool < buf->len + len) {
       /* pool has dried up */
@@ -78,14 +78,14 @@ str_append2(struct str *buf, const char *s, const size_t len)
 void
 str_appendstr(struct str *buf, const struct str *s)
 {
-   str_append2(buf, s->buf, s->len);
+   str_appendn(buf, s->buf, s->len);
 }
 
 #ifndef str_append
 void
 str_append(struct str *buf, const char *s)
 {
-   str_append2(buf, s, strlen(s));
+   str_appendn(buf, s, strlen(s));
 }
 #endif
 
@@ -106,7 +106,8 @@ static void
 str_append_u32(struct str *s, const uint32_t i, const int mod_sep)
 {
    char out[I32_MAXLEN];
-   int pos, len;
+   int pos;
+   unsigned int len;
    uint32_t rem, next;
 
    if (i == 0) {
@@ -132,7 +133,7 @@ str_append_u32(struct str *s, const uint32_t i, const int mod_sep)
          pos--;
       }
    }
-   str_append2(s, out+pos+1, sizeof(out)-1-pos);
+   str_appendn(s, out+pos+1, sizeof(out)-1-pos);
 }
 
 static void
@@ -149,7 +150,8 @@ static void
 str_append_u64(struct str *s, const uint64_t i, const int mod_sep)
 {
    char out[I64_MAXLEN];
-   int pos, len;
+   int pos;
+   unsigned int len;
    uint64_t rem, next;
    uint32_t rem32, next32;
 
@@ -196,7 +198,7 @@ str_append_u64(struct str *s, const uint64_t i, const int mod_sep)
          pos--;
       }
    }
-   str_append2(s, out+pos+1, sizeof(out)-1-pos);
+   str_appendn(s, out+pos+1, sizeof(out)-1-pos);
 }
 
 static void
@@ -217,7 +219,7 @@ str_append_hex8(struct str *s, const uint8_t b)
 
    out[0] = hexset[ ((b >> 4) & 15) ];
    out[1] = hexset[ (b & 15) ];
-   str_append2(s, out, 2);
+   str_appendn(s, out, 2);
 }
 
 /* accepted formats: %s %d %u %x
@@ -225,9 +227,7 @@ str_append_hex8(struct str *s, const uint8_t b)
  *
  * %x is equivalent to %02x and expects a uint8_t
  */
-static void
-str_vappendf(struct str *s, const char *format, va_list va)
-{
+void str_vappendf(struct str *s, const char *format, va_list va) {
    size_t pos, len;
    len = strlen(format);
 
@@ -239,7 +239,7 @@ str_vappendf(struct str *s, const char *format, va_list va)
          pos++;
       }
       if (span_len > 0)
-         str_append2(s, format+span_start, span_len);
+         str_appendn(s, format+span_start, span_len);
 
       if (format[pos] == '%') {
          int mod_quad = 0, mod_sep = 0;
@@ -301,7 +301,7 @@ xvasprintf(char **result, const char *format, va_list va)
    size_t len;
    struct str *s = str_make();
    str_vappendf(s, format, va);
-   str_append2(s, "", 1); /* "" still contains \0 */
+   str_appendn(s, "", 1); /* "" still contains \0 */
    str_extract(s, &len, result);
    return (len-1);
 }
@@ -355,4 +355,12 @@ length_of_time(const time_t t)
    return buf;
 }
 
+ssize_t str_write(const struct str * const buf, const int fd) {
+   return write(fd, buf->buf, buf->len);
+}
+
+size_t str_len(const struct str * const buf) {
+   return buf->len;
+}
+
 /* vim:set ts=3 sw=3 tw=78 expandtab: */