]> Savannah Git Hosting - gnulib.git/commitdiff
trim: Fix trim_trailing result in multibyte locales.
authorBruno Haible <bruno@clisp.org>
Sun, 2 Apr 2023 19:03:55 +0000 (21:03 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 2 Apr 2023 19:05:17 +0000 (21:05 +0200)
* lib/trim.c (trim2): Simplify algorithm for trim_trailing in multibyte
locales, to use 2 instead of 3 states.

ChangeLog
lib/trim.c

index a559f3dd713de5dfdd16c4223e6b1d059e0210dd..30e39d757afafda1a08abde71ce30db5d3701b9f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2023-04-02  Bruno Haible  <bruno@clisp.org>
 
+       trim: Fix trim_trailing result in multibyte locales.
+       * lib/trim.c (trim2): Simplify algorithm for trim_trailing in multibyte
+       locales, to use 2 instead of 3 states.
+
        trim: Add tests.
        * tests/test-trim.c: New file.
        * tests/test-trim1.sh: New file.
index 162c43e1dec073db4147287d71526f2d44ee1705..ed643cd20cfa735b3ee7e20b46329d110245ebe4 100644 (file)
@@ -65,42 +65,21 @@ trim2 (const char *s, int how)
       /* Trim trailing whitespaces. */
       if (how != TRIM_LEADING)
         {
-          unsigned int state = 0;
-          char *r IF_LINT (= NULL); /* used only while state = 2 */
+          char *start_of_spaces = NULL;
 
           mbi_init (i, d, strlen (d));
 
           for (; mbi_avail (i); mbi_advance (i))
-            {
-              if (state == 0 && mb_isspace (mbi_cur (i)))
-                continue;
-
-              if (state == 0 && !mb_isspace (mbi_cur (i)))
-                {
-                  state = 1;
-                  continue;
-                }
-
-              if (state == 1 && !mb_isspace (mbi_cur (i)))
-                continue;
-
-              if (state == 1 && mb_isspace (mbi_cur (i)))
-                {
-                  state = 2;
-                  r = (char *) mbi_cur_ptr (i);
-                }
-              else if (state == 2 && mb_isspace (mbi_cur (i)))
-                {
-                  /* empty */
-                }
-              else
-                {
-                  state = 1;
-                }
-            }
-
-          if (state == 2)
-            *r = '\0';
+            if (mb_isspace (mbi_cur (i)))
+              {
+                if (start_of_spaces == NULL)
+                  start_of_spaces = (char *) mbi_cur_ptr (i);
+              }
+            else
+              start_of_spaces = NULL;
+
+          if (start_of_spaces != NULL)
+            *start_of_spaces = '\0';
         }
     }
   else