X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcstring.c;h=15707868d442e417beaae4552ff7d4563cc09b63;hb=47f5af2c310874a47a42c6e30a1b5904e3c88a9a;hp=d00421791e5aa1be7c7cdd8b2243ba6002a18b09;hpb=b1e0c986d6e531f71d0a3ecc01551ab2d9cd8929;p=smdp.git diff --git a/src/cstring.c b/src/cstring.c index d004217..1570786 100644 --- a/src/cstring.c +++ b/src/cstring.c @@ -19,7 +19,7 @@ * */ -#include // strlen +#include // wcslen, wcscat, wmemmove #include // fprintf #include // malloc, realloc @@ -32,6 +32,7 @@ cstring_t *cstring_init() { x->size = x->alloc = 0; x->expand = cstring_expand; x->expand_arr = cstring_expand_arr; + x->strip = cstring_strip; x->reset = cstring_reset; x->delete = cstring_delete; } else { @@ -41,30 +42,42 @@ 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)); +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->text = realloc(self->text, 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->text[self->size+1] = L'\0'; + self->size = wcslen(self->text); } -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)); +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->text = realloc(self->text, self->alloc)) == NULL) { - fprintf(stderr, "%s\n", "cstring_expand() failed to reallocate memory."); + 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->text = wcscat(self->text, x); + self->size = wcslen(self->text); + self->text[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] = L'\0'; + self->size = pos; + } + return; + } + wmemmove(&self->text[pos], &self->text[pos+len], self->size - pos - len+1); + self->size -= len; } void cstring_reset(cstring_t *self) {