From a42feaf72b4dacee5c354ec4c87199dafb148844 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Sat, 4 Jun 2022 00:31:50 +0300 Subject: [PATCH 1/2] Fix string termination --- src/string/replace.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/string/replace.c b/src/string/replace.c index cb80d82..2ee84cd 100644 --- a/src/string/replace.c +++ b/src/string/replace.c @@ -24,6 +24,7 @@ size_t string_replace_cstring_cstring(str_t* x, const char* a, const char* d, si if (x->buffer == a) { x->buffer = realloc(x->buffer, dn + 1); memcpy(x->buffer, d, dn); + x->buffer[dn] = 0; return 1; } @@ -68,6 +69,7 @@ size_t string_replace_cstring_char(str_t* x, const char* a, int dc, size_t maxn) if (x->buffer == a) { x->buffer = realloc(x->buffer, dn + 1); memcpy(x->buffer, d, dn); + x->buffer[dn] = 0; return 1; } else if (x->buffer < a && a < x->buffer + n) { From ae0e93f068d760e054526fcda697110a9b368866 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Sat, 4 Jun 2022 00:33:29 +0300 Subject: [PATCH 2/2] Add string extra methods --- include/extra/string.h | 6 ++ src/string/extra-align.c | 142 +++++++++++++++++++++++++++++++++++++++ src/string/extra.c | 32 +++++++++ 3 files changed, 180 insertions(+) create mode 100644 src/string/extra-align.c diff --git a/include/extra/string.h b/include/extra/string.h index af9f662..5f34c21 100644 --- a/include/extra/string.h +++ b/include/extra/string.h @@ -17,6 +17,12 @@ extern size_t string_to_lower (vtype_string* x) LIBCDSB_nt__ LIBCDSB_nn1__; extern size_t string_to_upper (vtype_string* x) LIBCDSB_nt__ LIBCDSB_nn1__; extern size_t string_capitalize(vtype_string* x) LIBCDSB_nt__ LIBCDSB_nn1__; +extern size_t string_reverse (vtype_string* x) LIBCDSB_nt__ LIBCDSB_nn1__; + +extern size_t string_align_center(vtype_string* x, size_t padsize, int padchr) LIBCDSB_nt__ LIBCDSB_nn1__; +extern size_t string_align_right (vtype_string* x, size_t padsize, int padchr) LIBCDSB_nt__ LIBCDSB_nn1__; +extern size_t string_align_left (vtype_string* x, size_t padsize, int padchr) LIBCDSB_nt__ LIBCDSB_nn1__; + extern int string_compare_case_insensitive(const vtype_string* s0, const vtype_string* s1) LIBCDSB_cmpattr__; diff --git a/src/string/extra-align.c b/src/string/extra-align.c new file mode 100644 index 0000000..ebfb8d1 --- /dev/null +++ b/src/string/extra-align.c @@ -0,0 +1,142 @@ +/* This software is licensed by the MIT License, see LICENSE file */ +/* Copyright © 2022 Gregory Lirent */ + +#include "include.h" + + +/*#####################################################################################################################*/ + + +static char* string_info(const vtype_string* s, size_t* size, size_t* nmemb) { + + char* p; + char* v; + + if (is_null(s->buffer) || !*s->buffer) { + *size = *nmemb = 0; + return s->buffer; + } + + *size = *nmemb = strasciilen(s->buffer); + p = s->buffer + *nmemb; + + if (!*p) return p; + + while (*(v = next_char(p))) { + ++*size; + *nmemb += v - p; + p = v; + } + ++*size; + *nmemb += v - p; + + return p; +} + + +static int fetch_pad(char buffer[4], int chr) { + + char* p; + + if (chr) { + p = tochar_unicode(buffer, chr); + chr = !is_null(p) ? p - buffer : 0; + } + + if (!chr) { + *buffer = ' '; + chr = 1; + } + + return chr; +} + + +/*#####################################################################################################################*/ + + +size_t string_align_center(vtype_string* x, size_t n, int pc) { + + char s[4]; + size_t l; + size_t ls; + size_t rs; + char* p; + + string_info(x, &ls, &l); + + if (ls < n) { + pc = fetch_pad(s, pc); + ls = n - ls; + rs = ls / 2; + } else return ls; + + x->buffer = p = realloc(x->buffer, l + ls*pc + 1); + memmove(x->buffer + (ls -= rs)*pc, x->buffer, l); + + for (size_t i = 0; i < ls; ++i) { + p = memcpy(p, s, pc) + pc; + } + + p += l; + + for (size_t i = 0; i < rs; ++i) { + p = memcpy(p, s, pc) + pc; + } + + *p = 0; + + return n; +} + + +size_t string_align_right(vtype_string* x, size_t n, int pc) { + + char s[4]; + size_t l; + size_t ls; + char* p; + + string_info(x, &ls, &l); + + if (ls < n) { + pc = fetch_pad(s, pc); + ls = n - ls; + } else return ls; + + x->buffer = p = realloc(x->buffer, ++l + ls*pc); + memmove(x->buffer + ls*pc, x->buffer, l); + + for (size_t i = 0; i < ls; ++i) { + p = memcpy(p, s, pc) + pc; + } + + return n; +} + + +size_t string_align_left(vtype_string* x, size_t n, int pc) { + + char s[4]; + size_t l; + size_t rs; + char* p; + + string_info(x, &rs, &l); + + if (rs < n) { + pc = fetch_pad(s, pc); + rs = n - rs; + } else return rs; + + x->buffer = realloc(x->buffer, l + rs*pc + 1); + p = x->buffer + l; + + for (size_t i = 0; i < rs; ++i) { + p = memcpy(p, s, pc) + pc; + } + + *p = 0; + + return n; +} diff --git a/src/string/extra.c b/src/string/extra.c index fa301de..4cd5493 100644 --- a/src/string/extra.c +++ b/src/string/extra.c @@ -175,3 +175,35 @@ size_t string_capitalize(str_t* x) { return n; } + + +/*#####################################################################################################################*/ + + +size_t string_reverse(str_t* x) { + char *t, *p, *v; + size_t n; + + if (is_null(x->buffer) || !*x->buffer) + return 0; + + n = strlen(x->buffer); + t = malloc(n + 1); + p = t + n; + v = x->buffer; + n = 0; + + while (p > t) { + int cs = charsize(v); + + if (cs > 1) { + p = memcpy(p - cs, v, cs); + v += cs; + } else *(--p) = *(v++); + } + + free(x->buffer); + x->buffer = t; + + return n; +}