X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=src%2Fcstring.c;h=cf5756ffd3699532b4d6ac7a64613e12fac2e56b;hb=354cf2e07ccd0d7900f96bffc279093997cbe203;hp=558a78662bc29aa2a68859a58f1d0b01e20ec171;hpb=24fbdfb2b81ab2a1c8834e38d644f66a1e5653e4;p=smdp.git diff --git a/src/cstring.c b/src/cstring.c index 558a786..cf5756f 100644 --- a/src/cstring.c +++ b/src/cstring.c @@ -1,6 +1,6 @@ /* * An implementation of expandable c strings in heap memory. - * Copyright (C) 2014 Michael Goehler + * Copyright (C) 2018 Michael Goehler * * This file is part of mdp. * @@ -19,7 +19,7 @@ * */ -#include // strlen, memmove +#include // wcslen, wcscat, wmemmove #include // fprintf #include // malloc, realloc @@ -28,7 +28,7 @@ cstring_t *cstring_init() { cstring_t *x = NULL; if((x = malloc(sizeof(cstring_t))) != NULL) { - x->text = NULL; + x->value = NULL; x->size = x->alloc = 0; x->expand = cstring_expand; x->expand_arr = cstring_expand_arr; @@ -42,51 +42,51 @@ cstring_t *cstring_init() { return x; } -void cstring_expand(cstring_t *self, char x) { - if(self->size + sizeof(x) + sizeof(char) > self->alloc) { - self->alloc += (REALLOC_ADD * sizeof(char)); - if((self->text = realloc(self->text, self->alloc)) == NULL) { +void cstring_expand(cstring_t *self, wchar_t x) { + if((self->size + 2) * sizeof(wchar_t) > self->alloc) { + self->alloc += (REALLOC_ADD * sizeof(wchar_t)); + if((self->value = realloc(self->value, self->alloc)) == NULL) { fprintf(stderr, "%s\n", "cstring_expand() failed to reallocate memory."); exit(EXIT_FAILURE); } } - self->text[self->size] = x; - self->text[self->size+1] = '\0'; - self->size = strlen(self->text); + self->value[self->size] = x; + self->value[self->size+1] = L'\0'; + self->size = wcslen(self->value); } -void cstring_expand_arr(cstring_t *self, char *x) { - if(self->size + strlen(x) + sizeof(char) > self->alloc) { - self->alloc = ((strlen(x) + self->size + 1) * sizeof(char)); - if((self->text = realloc(self->text, self->alloc)) == NULL) { - fprintf(stderr, "%s\n", "cstring_expand() failed to reallocate memory."); +void cstring_expand_arr(cstring_t *self, wchar_t *x) { + if((self->size + wcslen(x) + 1) * sizeof(wchar_t) > self->alloc) { + self->alloc = ((self->size + wcslen(x) + 1) * sizeof(wchar_t)); + if((self->value = realloc(self->value, self->alloc)) == NULL) { + fprintf(stderr, "%s\n", "cstring_expand_arr() failed to reallocate memory."); exit(EXIT_FAILURE); } } - self->text = strcat(self->text, x); - self->size = strlen(self->text); - self->text[self->size+1] = '\0'; + self->value = wcscat(self->value, x); + self->size = wcslen(self->value); + self->value[self->size+1] = L'\0'; } void cstring_strip(cstring_t *self, int pos, int len) { if(pos + len >= self->size) { if(pos <= self->size) { - self->text[pos] = '\0'; + self->value[pos] = L'\0'; self->size = pos; } return; } - memmove(&self->text[pos], &self->text[pos+len], self->size - pos - len+1); + wmemmove(&self->value[pos], &self->value[pos+len], self->size - pos - len+1); self->size -= len; } void cstring_reset(cstring_t *self) { - free(self->text); - self->text = NULL; + free(self->value); + self->value = NULL; self->size = self->alloc = 0; } void cstring_delete(cstring_t *self) { - free(self->text); + free(self->value); free(self); }