]> www.git.momoyon.org Git - commonlib.git/commitdiff
[commonlib.h] Implemented sv_lpop_until_string().
authorahmedsamyh <ahmedsamyh10@gmail.com>
Fri, 28 Feb 2025 05:55:01 +0000 (10:55 +0500)
committerahmedsamyh <ahmedsamyh10@gmail.com>
Fri, 28 Feb 2025 05:55:01 +0000 (10:55 +0500)
commonlib.h

index 12a63c6a7a361eac92e96099e75272f7af400ed6..357136954dcdc6b0d513a899f093715272ac1e02 100644 (file)
@@ -50,6 +50,7 @@
 #define sv_from_cstr c_sv_from_cstr\r
 #define sv_lpop c_sv_lpop\r
 #define sv_lpop_until_predicate c_sv_lpop_until_predicate\r
+#define sv_lpop_until_string c_sv_lpop_until_string\r
 #define sv_rpop_until_predicate c_sv_rpop_until_predicate\r
 #define sv_lpop_until_char c_sv_lpop_until_char\r
 #define sv_rpop_until_char c_sv_rpop_until_char\r
@@ -264,6 +265,7 @@ void c_sv_print_dumb(c_String_view sv);
 c_String_view c_sv_from_cstr(const char* cstr); // Actually just use SV(cstr) macro...\r
 c_String_view c_sv_lpop(c_String_view* sv, uint32 n);\r
 c_String_view c_sv_lpop_until_predicate(c_String_view* sv, int(*predicate)(int));\r
+c_String_view c_sv_lpop_until_string(c_String_view* sv, const char *string);\r
 c_String_view c_sv_rpop_until_predicate(c_String_view* sv, int(*predicate)(int));\r
 c_String_view c_sv_lpop_until_char(c_String_view* sv, char ch);\r
 c_String_view c_sv_rpop_until_char(c_String_view* sv, char ch);\r
@@ -486,6 +488,27 @@ c_String_view c_sv_lpop_until_predicate(c_String_view* sv, int(*predicate)(int))
     };\r
 }\r
 \r
+c_String_view c_sv_lpop_until_string(c_String_view* sv, const char *string) {\r
+    size_t string_len = strlen(string);\r
+\r
+    char *old_sv_data = sv->data;\r
+\r
+    while (sv->count > string_len) {\r
+        bool matched = true;\r
+        for (int i = 0; i < string_len; ++i) {\r
+            if (sv->data[i] != string[i]) matched = false;\r
+        }\r
+        if (matched) break;\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
+\r
+    return (c_String_view) {\r
+        .data = old_sv_data,\r
+        .count = (sv->data - old_sv_data),\r
+    };\r
+}\r
+\r
 c_String_view c_sv_rpop_until_predicate(c_String_view* sv, int(*predicate)(int)){\r
     size_t old_sv_count = sv->count;\r
     while (sv->count > 0 && !predicate(*(sv->data+sv->count-1))){\r