X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c61294eca5edf4f245c2d8818bf53d3bdc3d80c1..6a26499beca5a61354b6cc12e4abf6b7454ff878:/sbr/charstring.c?ds=sidebyside diff --git a/sbr/charstring.c b/sbr/charstring.c index 76d9fa2a..00c65986 100644 --- a/sbr/charstring.c +++ b/sbr/charstring.c @@ -42,8 +42,9 @@ charstring_reserve (charstring_t s, size_t need) { */ charstring_t charstring_create (size_t max) { - charstring_t s = mh_xmalloc (sizeof *s); + charstring_t s; + NEW(s); s->max = NMH_MAX_CHARWIDTH * (max ? max : CHARSTRING_DEFAULT_SIZE); s->cur = s->buffer = mh_xmalloc (s->max); s->chars = 0; @@ -54,8 +55,9 @@ charstring_create (size_t max) { charstring_t charstring_copy (const charstring_t src) { const size_t num = src->cur - src->buffer; - charstring_t s = mh_xmalloc (sizeof *s); + charstring_t s; + NEW(s); s->max = src->max; s->buffer = mh_xmalloc (s->max); memcpy (s->buffer, src->buffer, num); @@ -102,13 +104,25 @@ charstring_append (charstring_t dest, const charstring_t src) { const size_t num = src->cur - src->buffer; if (num > 0) { - charstring_reserve (dest, num + (dest->cur - dest->buffer)); + charstring_reserve (dest, dest->cur - dest->buffer + num); memcpy (dest->cur, src->buffer, num); dest->cur += num; dest->chars += src->chars; } } +void +charstring_append_cstring (charstring_t dest, const char src[]) { + const size_t num = strlen (src); + + if (num > 0) { + charstring_reserve (dest, dest->cur - dest->buffer + num); + memcpy (dest->cur, src, num); /* Exclude src's trailing newline. */ + dest->cur += num; + dest->chars += num; + } +} + void charstring_clear (charstring_t s) { s->cur = s->buffer; @@ -134,14 +148,12 @@ charstring_buffer (const charstring_t s) { char * charstring_buffer_copy (const charstring_t s) { - char *copy = strdup (charstring_buffer (s)); + char *copy = mh_xmalloc (s->cur - s->buffer + 1); - if (copy) { - return copy; - } else { - advise ("strdup", "unable to copy charstring buffer"); - return NULL; - } + /* Use charstring_buffer() to null terminate the buffer. */ + memcpy (copy, charstring_buffer (s), s->cur - s->buffer + 1); + + return copy; } size_t @@ -161,13 +173,14 @@ charstring_last_char_len (const charstring_t s) { const char *sp = charstring_buffer (s); size_t remaining = charstring_bytes (s); - (void) mbtowc (NULL, NULL, 0); /* reset shift state */ + if (mbtowc (NULL, NULL, 0)) {} /* reset shift state */ while (*sp && remaining > 0) { wchar_t wide_char; - len = mbtowc (&wide_char, sp, - MB_CUR_MAX < remaining ? MB_CUR_MAX : remaining); + len = mbtowc (&wide_char, sp, (size_t) MB_CUR_MAX < remaining + ? (size_t) MB_CUR_MAX + : remaining); sp += len > 0 ? len : 1; remaining -= len > 0 ? len : 1; }