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.
/* 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