summaryrefslogtreecommitdiffstats
path: root/dstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'dstring.c')
-rw-r--r--dstring.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/dstring.c b/dstring.c
index 9c65757..5a6d4b3 100644
--- a/dstring.c
+++ b/dstring.c
@@ -75,23 +75,26 @@ int dstresize(char **dstr, size_t length) {
return 0;
}
-int dstrcat(char **dest, const char *src) {
- struct dstring *header = dstrheader(*dest);
- return dstrcatat(dest, header->length, src);
-}
+static int dstrcat_impl(char **dest, const char *src, size_t srclen) {
+ size_t oldlen = dstrlen(*dest);
+ size_t newlen = oldlen + srclen;
-int dstrcatat(char **dest, size_t pos, const char *src) {
- size_t srclen = strlen(src);
- size_t destlen = pos + srclen;
-
- if (dstresize(dest, destlen) != 0) {
+ if (dstresize(dest, newlen) != 0) {
return -1;
}
- memcpy(*dest + pos, src, srclen);
+ memcpy(*dest + oldlen, src, srclen);
return 0;
}
+int dstrcat(char **dest, const char *src) {
+ return dstrcat_impl(dest, src, strlen(src));
+}
+
+int dstrncat(char **dest, const char *src, size_t n) {
+ return dstrcat_impl(dest, src, strnlen(src, n));
+}
+
void dstrfree(char *dstr) {
if (dstr) {
free(dstrheader(dstr));