* str: fixed utterly broken str_rtrim()
authorUrban Wallasch <urban.wallasch@freenet.de>
Wed, 30 Oct 2019 23:59:09 +0000 (00:59 +0100)
committerUrban Wallasch <urban.wallasch@freenet.de>
Wed, 30 Oct 2019 23:59:09 +0000 (00:59 +0100)
str/str.h
str/str_test.c

index adb2cc8b0f1c8b51ff153a38882a0a09ff1bbb47..6270d2b5f2db41c115e63c71e1005668576c8acd 100644 (file)
--- a/str/str.h
+++ b/str/str.h
@@ -329,7 +329,17 @@ static inline char *str_ltrim(char *s, const char *trimset, bool notin) {
 }
 
 static inline char *str_rtrim(char *s, const char *trimset, bool notin) {
-    *(str_delim(s, trimset, notin)) = '\0';
+    char *rs, *p;
+
+    rs = p = s + strlen(s);
+    while (rs > s) {
+        --rs;
+        if (!!strchr(trimset, *rs) ^ notin)
+            p = rs;
+        else
+            break;
+    }
+    *p = '\0';
     return s;
 }
 
index 9414f957879d7f1ed25dd65629074ed85ea8b067..b08b322198ca4086db65596276a8b5bfcf919bce 100644 (file)
@@ -301,19 +301,27 @@ int main(void) {
 
     {
         H("str_ltrim, str_rtrim, str_trim");
-        char s1[] = ",.-XXX,.-";
+        char s1[] = ",.-XX-,.XX,.-";
         D(s1);
-        T(strcmp(str_ltrim(s1, "-,.", false), "XXX,.-") == 0);
+        T(strcmp(str_ltrim(s1, "-,.", false), "XX-,.XX,.-") == 0);
         D(s1);
-        T(strcmp(str_rtrim(s1, "-,.", false), "XXX") == 0);
+        T(strcmp(str_rtrim(s1, "-,.", false), "XX-,.XX") == 0);
         D(s1);
-        T(strcmp(str_rtrim(s1, "-,.", true), "") == 0);
-        char s2[] = "***XXX***";
+        T(strcmp(str_rtrim(s1, "-,.", true), "XX-,.") == 0);
+        char s2[] = "*+*XX**XX+*+";
         D(s2);
-        T(strcmp(str_trim(s2, "*", false), "XXX") == 0);
-        char s3[] = "XXX***XXX";
+        T(strcmp(str_trim(s2, "*+", false), "XX**XX") == 0);
+        char s3[] = "XX+X**XX**X+XX";
         D(s3);
-        T(strcmp(str_trim(s3, "*", true), "***") == 0);
+        T(strcmp(str_trim(s3, "*", true), "**XX**") == 0);
+        char s4[] = "";
+        D(s4);
+        T(strcmp(str_rtrim(s4, "asdf", false), "") == 0);
+        T(strcmp(str_rtrim(s4, "asdf", true), "") == 0);
+        char s5[] = "asdf";
+        D(s5);
+        T(strcmp(str_rtrim(s5, "", false), "asdf") == 0);
+        T(strcmp(str_rtrim(s5, "", true), "") == 0);
     }
 
     /*****************************************/