From 78c7bcc36adae4af583d24526352e75099c71291 Mon Sep 17 00:00:00 2001 From: ketmar Date: Thu, 3 Oct 2013 16:09:39 +0300 Subject: [PATCH] dstrings: it's now safe to pass NULL dstring --- src/dstrings.c | 97 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/src/dstrings.c b/src/dstrings.c index 7dda821..862270d 100644 --- a/src/dstrings.c +++ b/src/dstrings.c @@ -22,10 +22,12 @@ static inline void dstr_zero (dstring_t *s) { - s->str = s->sbuf; - s->len = 0; - s->size = sizeof(s->sbuf); - s->sbuf[0] = 0; + if (s != NULL) { + s->str = s->sbuf; + s->len = 0; + s->size = sizeof(s->sbuf); + s->sbuf[0] = 0; + } } @@ -53,56 +55,66 @@ void dstr_init_memrange (dstring_t *s, const void *start, const void *finish) { void dstr_done (dstring_t *s) { - if (s->str != s->sbuf) free(s->str); - dstr_zero(s); + if (s != NULL) { + if (s->str != s->sbuf) free(s->str); + dstr_zero(s); + } } void dstr_clear (dstring_t *s) { - s->str[s->len=0] = 0; + if (s != NULL) { + s->str[s->len=0] = 0; + } } void dstr_empty (dstring_t *s) { - if (s->str != s->sbuf) free(s->str); - dstr_zero(s); + if (s != NULL) { + if (s->str != s->sbuf) free(s->str); + dstr_zero(s); + } } static void dstr_resv (dstring_t *s, int size) { - if (size < 0) size = 0; - if (size > 0) { - if (s->str == s->sbuf) { - s->str = malloc(size); - if (s->len > 0) memcpy(s->str, s->sbuf, s->len); - s->str[s->len] = 0; - } else { - char *ns = realloc(s->str, size); - if (ns == NULL) { fprintf(stderr, "FATAL: out of memory!\n"); abort(); } - s->str = ns; + if (s != NULL) { + if (size < 0) size = 0; + if (size > 0) { + if (s->str == s->sbuf) { + s->str = malloc(size); + if (s->len > 0) memcpy(s->str, s->sbuf, s->len); + s->str[s->len] = 0; + } else { + char *ns = realloc(s->str, size); + if (ns == NULL) { fprintf(stderr, "FATAL: out of memory!\n"); abort(); } + s->str = ns; + } } + s->size = size; } - s->size = size; } void dstr_reserve (dstring_t *s, int size) { - if (size > s->size) dstr_resv(s, size); + if (s != NULL && size > s->size) dstr_resv(s, size); } // make room for at least `spc` chars static inline void dstr_expand (dstring_t *s, int spc) { - if (spc >= 0) dstr_reserve(s, ((s->len+spc+1)|0x3ff)+1); + if (s != NULL && spc >= 0) dstr_reserve(s, ((s->len+spc+1)|0x3ff)+1); } void dstr_push_buf (dstring_t *s, const void *start, int len) { - if (len < 0) len = (start != NULL ? strlen((const char *)start) : 0); - if (len > 0) { - dstr_expand(s, len); - if (start == NULL) memset(s->str+s->len, 32, len); else memmove(s->str+s->len, start, len); - s->str[s->len+=len] = 0; + if (s != NULL) { + if (len < 0) len = (start != NULL ? strlen((const char *)start) : 0); + if (len > 0) { + dstr_expand(s, len); + if (start == NULL) memset(s->str+s->len, 32, len); else memmove(s->str+s->len, start, len); + s->str[s->len+=len] = 0; + } } } @@ -113,14 +125,16 @@ void dstr_push_cstr (dstring_t *s, const void *str) { void dstr_push_memrange (dstring_t *s, const void *start, const void *finish) { - if (finish > start) dstr_push_buf(s, start, ((const char *)finish)-((const char *)start)); + if (s != NULL && finish > start) dstr_push_buf(s, start, ((const char *)finish)-((const char *)start)); } void dstr_push_char (dstring_t *s, int x) { - dstr_expand(s, 1); - s->str[s->len++] = x&0xff; - s->str[s->len] = 0; + if (s != NULL) { + dstr_expand(s, 1); + s->str[s->len++] = x&0xff; + s->str[s->len] = 0; + } } @@ -142,28 +156,33 @@ void dstr_set_memrange (dstring_t *s, const void *start, const void *finish) { void dstr_chop (dstring_t *s, int n) { - if (n < 0) n = 0; else if (n > s->len) n = s->len; - s->str[s->len=n] = 0; + if (s != NULL) { + if (n < 0) n = 0; else if (n > s->len) n = s->len; + s->str[s->len=n] = 0; + } } int dstr_pop_char (dstring_t *s) { - int res = (s->len > 0 ? (unsigned char)(s->str[--s->len]) : 0); - s->str[s->len] = 0; - return res; + if (s != NULL) { + int res = (s->len > 0 ? (unsigned char)(s->str[--s->len]) : 0); + s->str[s->len] = 0; + return res; + } + return 0; } char dstr_last_char (dstring_t *s) { - return (s->len > 0 ? s->str[s->len-1] : 0); + return (s != NULL && s->len > 0 ? s->str[s->len-1] : 0); } char *dstr_cstr (dstring_t *s) { - return s->str; + return (s != NULL ? s->str : NULL); } int dstr_len (dstring_t *s) { - return s->len; + return (s != NULL ? s->len : 0); } -- 2.11.4.GIT