]> diplodocus.org Git - nmh/blobdiff - sbr/charstring.c
Clarified in repl(1) man page that -noformat is only the
[nmh] / sbr / charstring.c
index cc2e907e284c32c731f5dbe3bd65af9ba501357d..d94961aad604f45cce28dc70e8c1b78f9a73ae5c 100644 (file)
@@ -102,13 +102,25 @@ charstring_append (charstring_t dest, const charstring_t src) {
     const size_t num = src->cur - src->buffer;
 
     if (num > 0) {
     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;
     }
 }
 
         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;
 void
 charstring_clear (charstring_t s) {
     s->cur = s->buffer;
@@ -134,14 +146,12 @@ charstring_buffer (const charstring_t s) {
 
 char *
 charstring_buffer_copy (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
 }
 
 size_t
@@ -161,7 +171,7 @@ charstring_last_char_len (const charstring_t s) {
     const char *sp = charstring_buffer (s);
     size_t remaining = charstring_bytes (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;
 
     while (*sp  &&  remaining > 0) {
         wchar_t wide_char;