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
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;
}