-/*
- * charstring -- dynamically-sized char array that can report size
+/* charstring.c -- dynamically-sized char array that can report size
* in both characters and bytes
*
* This code is Copyright (c) 2014, by the authors of nmh. See the
*/
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;
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);
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;
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