From d8903b05de941cf49d74850a63e271e4124dc8bf Mon Sep 17 00:00:00 2001 From: Horacio Daniel Ros Date: Sat, 14 Nov 2026 20:11:26 -0300 Subject: [PATCH] stringview --- c/stringview/main.c | 52 +++++++++++++-- c/stringview/string | Bin 49432 -> 55024 bytes c/stringview/stringv.c | 143 +++++++++++++++++++++++++++++++++-------- c/stringview/stringv.h | 20 +++++- 4 files changed, 182 insertions(+), 33 deletions(-) diff --git a/c/stringview/main.c b/c/stringview/main.c index 57f3f78..da750a2 100644 --- a/c/stringview/main.c +++ b/c/stringview/main.c @@ -1,13 +1,57 @@ #include "stringv.h" #include int main(void) { - StringView s1 = sv_from_cstr("Hola mundo con string view"); + const char *data = " xHola mundo con string view- "; StringView s2 = sv_from_cstr("😊"); - StringView last = sv_right(&s1, 4); + + StringView hola = sv_from_cstr(data); + sv_ltrim(&hola); + sv_left(&hola, 4); + + StringView view = sv_from_cstr(data); + sv_rtrim(&view); + sv_right(&view, 4); + + StringView trim = sv_from_cstr(data); + sv_trim(&trim); printf("El string view contiene: %s\n", s2.text); - printf("El length es: %zu\n", s2.lenght); + printf("El length es: %zu\n", s2.length); - printf("last tiene:%.*s\n", (int)last.lenght, last.text); + printf("hola tiene:%.*s\n", (int)hola.length, hola.text); + printf("view tiene:%.*s\n", (int)view.length, view.text); + printf("trim tiene:[%.*s]\n", (int)trim.length, trim.text); + + StringView semana = sv_from_cstr( + "lunes, martes, miercoles, jueves, viernes, sabado, domingo"); + + StringView dia = sv_chop_by_delim(&semana, ','); + int d = 0; + while (dia.length > 0) { + d++; + sv_trim(&dia); + printf("dia%d: %.*s\n", d, (int)dia.length, dia.text); + dia = sv_chop_by_delim(&semana, ','); + } + + StringView c1 = sv_from_cstr("hdr2104"); + StringView c2 = sv_from_cstr("hdr2"); + + if (sv_equals(&c1, &c2)) { + printf("Las cadenas son iguales.\n"); + } else { + printf("Las cadenas NO son iguales.\n"); + } + + if (sv_starts_with(&c1, &c2) == true) { + printf("La cadena1 comienza con cadena2.\n"); + } else { + printf("La cadena1 NOOO comienza con cadena2.\n"); + } + + StringView test = sv_from_cstr("2"); + if (sv_ends_with(&c2, &test)) { + printf("La cedena dos termina como se quiere.\n"); + } return 0; } diff --git a/c/stringview/string b/c/stringview/string index 169823a23bc2659081293a139a760dee723398af..9695b672cd5b701ebbabfe82854a4ea8b72854e6 100755 GIT binary patch delta 20332 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%0D(AJw4upv&?bHF6>KvpE zeJmkjFQTvW@i*=SDSNeRA0yVr$A*RW!qo0R@EfE(_E=c*>&O(l0)J+2a@_g0qCS&_YGWHb4!?9iO~V{N3_It?YWk)zIPa_bpI9Uexeg! z&@qFf{kM`WXIr8~_jkKrJTW-17JpeQ)BD%5QW8dKK~GK@(Eb$)fA~?}d0a6*omuc? zq!n!Z@sIn-^mMe14~Fm(mtL3G*X!?*^%ut&Homt+tLuk)Z$IfwqT%*;+1@V;`J1-( zy+_bDN#4(KTcVyiDztZ={+DVO+Tnu=6@(E=n=p#rfLGLy5lO7M&Nr#D4rxYLNE_+FsnG{dmYDYBgaB)0z&4`!vzjDUK%XvBPOW zbe^Tdix)9p;E|5MAmt2;7P?9mP#Nz`JG28x@tACDyVN*bWA z=fzQ~Hs)x8Z^vJI)9Q|<`gZzTaE~8N_3{1zvL@~8qiH_g60}oGekM(8JsPO3cqXa+ z*XT_+kJ3@wa_E^1p}uF)etI_5w;GqbbezO?$5MS$$LQUM%-VJ6euT3%9Y-p(!^cv6 zcJ0@@>$M+`rTIobsP}qAYGaP4`Xs%mcQ0uxkEi*>p3-}-YKM-e`F{JV-dirTF$eqo EZ}&Zq3IG5A delta 12597 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 diff --git a/c/stringview/stringv.c b/c/stringview/stringv.c index aeb5f48..fdc02af 100644 --- a/c/stringview/stringv.c +++ b/c/stringview/stringv.c @@ -1,60 +1,151 @@ #include "stringv.h" +#include +#include #include #include #include /* - * @brief Create a string view from a const char* and set their lenght + * @brief Create a string view from a const char* and set their length * * @details This string view provides a view of a string. It does not allocate * memory, therefore, it lives only while the source is alive. The - * lenght is a bytes number of the string. It does not represents the number of + * length is a bytes number of the string. It does not represents the number of * characters. * * @param str pointer from the original string. It can be NULL. * * @return a StringView with the view of original string with corresponding - * lenght. + * length. */ -#define STRING_VIEW_NULL (StringView){.text = NULL, .lenght = 0} - StringView sv_from_cstr(const char *str) { if (str == NULL) { - return STRING_VIEW_NULL; + return SV_NULL; } - return (StringView){.text = (char *)str, .lenght = strlen(str)}; + return (StringView){.text = (char *)str, .length = strlen(str)}; } -StringView sv_left(const StringView *sv, size_t l) { +void sv_left(StringView *sv, size_t l) { if (sv == NULL) { - perror("sv_left: pointer is NULL\n"); - return STRING_VIEW_NULL; + return; } if (sv->text == NULL) { - perror("sv_left: text pointer is NULL\n"); - return STRING_VIEW_NULL; + return; } - if (sv->lenght < l) { - perror("sv_left: text length is less than specified length\n"); - return STRING_VIEW_NULL; + if (sv->length < l) { + return; } - return (StringView){.text = sv->text, .lenght = l}; + sv->length = l; } -StringView sv_right(const StringView *sv, size_t r) { +void sv_right(StringView *sv, size_t r) { if (sv == NULL) { - perror("sv_right: pointer is NULL\n"); - return STRING_VIEW_NULL; + return; } if (sv->text == NULL) { - perror("sv_right: text pointer is NULL\n"); - return STRING_VIEW_NULL; + return; } - if (sv->lenght < r) { - perror("sv_right: text length is less than specified length\n"); - return STRING_VIEW_NULL; + if (sv->length < r) { + return; } - size_t nlength = sv->lenght - r; - return (StringView){.text = sv->text + nlength, .lenght = r}; + size_t nlength = sv->length - r; + sv->text = sv->text + nlength; + sv->length = r; +} + +void sv_ltrim(StringView *sv) { + if (sv == NULL) + return; + if (sv->length == 0) + return; + if (sv->text == NULL) + return; + + size_t offset = 0; + while (offset < sv->length && isspace((int)*(sv->text + offset))) { + offset++; + } + + if (offset > sv->length) + return; + sv->text += offset; + sv->length -= offset; +} + +void sv_rtrim(StringView *sv) { + if (sv == NULL) + return; + if (sv->length == 0) + return; + if (sv->text == NULL) + return; + + size_t offset = 0; + while (offset < sv->length && + isspace((int)*(sv->text + sv->length - 1 - offset))) { + offset++; + } + + if (offset > sv->length) + return; + sv->length -= offset; +} + +void sv_trim(StringView *sv) { + sv_ltrim(sv); + sv_rtrim(sv); +} + +int sv_index_of(StringView sv, char c) { + size_t offset = 0; + while (offset < sv.length && *(sv.text + offset) != c) { + offset++; + } + if (offset > sv.length) + return -1; + return offset; +} + +StringView sv_chop_by_delim(StringView *sv, char delim) { + StringView returnsv = SV_NULL; + int find = sv_index_of(*sv, delim); + if (!find) { + return returnsv; + } + returnsv.text = sv->text; + returnsv.length = find; + + sv->text += find + 1; + sv->length = sv->length - find; + + return returnsv; +} + +bool sv_equals(StringView *sv1, StringView *sv2) { + if (sv1 == NULL) + return false; + if (sv2 == NULL) + return false; + if (sv1->text == NULL) + return false; + if (sv2->text == NULL) + return false; + if (sv1->length != sv2->length) + return false; + return memcmp(sv1->text, sv2->text, sv1->length) == 0; +} + +bool sv_starts_with(StringView *sv, StringView *prefix) { + if (sv->length < prefix->length) + return false; + StringView cut = {.text = sv->text, .length = prefix->length}; + return sv_equals(&cut, prefix); +} +bool sv_ends_with(StringView *sv, StringView *suffix) { + if (sv->length < suffix->length) + return false; + StringView cut = {.text = sv->text, .length = sv->length}; + sv_right(&cut, suffix->length); + return sv_equals(&cut, suffix); } diff --git a/c/stringview/stringv.h b/c/stringview/stringv.h index e48caf2..cbc8f9a 100644 --- a/c/stringview/stringv.h +++ b/c/stringview/stringv.h @@ -1,14 +1,28 @@ #ifndef STRING_VIEW_H #define STRING_VIEW_H +#include #include typedef struct StringView { char *text; - size_t lenght; + size_t length; } StringView; +#define SV_NULL (StringView){.text = NULL, .length = 0} + StringView sv_from_cstr(const char *); -StringView sv_left(const StringView *sv, size_t l); -StringView sv_right(const StringView *sv, size_t l); + +void sv_left(StringView *sv, size_t l); +void sv_right(StringView *sv, size_t l); + +void sv_ltrim(StringView *sv); +void sv_rtrim(StringView *sv); +void sv_trim(StringView *sv); + +int sv_index_of(StringView sv, char c); +StringView sv_chop_by_delim(StringView *sv, char delim); +bool sv_equals(StringView *sv1, StringView *sv2); +bool sv_starts_with(StringView *sv, StringView *prefix); +bool sv_ends_with(StringView *sv, StringView *suffix); #endif