]> diplodocus.org Git - nmh/blobdiff - sbr/charstring.c
Escape literal leading full stop in man/new.man.
[nmh] / sbr / charstring.c
index 76d9fa2afdf5946006ecca9c23a9addf5dcdcf0d..00c6598652d8fe2ebef6f662be20fc98ec8bccd2 100644 (file)
@@ -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;
     }