aboutsummaryrefslogtreecommitdiffstats
path: root/xstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'xstring.c')
-rw-r--r--xstring.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/xstring.c b/xstring.c
index 98d91f9..d540828 100644
--- a/xstring.c
+++ b/xstring.c
@@ -5,18 +5,23 @@
string *string_alloc(const char *text)
{
+ return string_nalloc(text,
+ (text) ? strlen(text) : INIT_LEN_STRING);
+}
+
+string *string_nalloc(const char *text, size_t text_len)
+{
string *str = malloc(sizeof(string));
+ str->s = malloc(sizeof(char) * (text_len + 1));
if(text) {
- int length = strlen(text);
- str->s = malloc(sizeof(char) * (length + 1));
- strcpy(str->s, text);
- str->capacity = length;
- str->len = length;
+ strncpy(str->s, text, text_len);
+ str->capacity = text_len;
+ str->len = text_len;
+ str->s[text_len] = '\0';
}
else {
- str->s = malloc(sizeof(char) * (INIT_LEN_STRING + 1));
str->len = 0;
- str->capacity = INIT_LEN_STRING;
+ str->capacity = text_len;
str->s[0] = '\0';
}
return str;
@@ -39,6 +44,18 @@ void string_reset(string *str)
}
}
+static void string_realloc(string *str, int cap)
+{
+ int i;
+ char *tmp_s = str->s;
+ str->s = malloc(sizeof(char) * (cap + 1));
+ for(i = 0; i < cap; i++)
+ str->s[i] = (i >= str->len) ? '\0' : tmp_s[i];
+
+ str->capacity = cap;
+ free(tmp_s);
+}
+
void string_addch(string *str, int ch)
{
if(str->capacity <= (str->len + 1)) {