On Friday 01 September 2006 18:58, you wrote: > Thanks; it looks already better. > > In multibyte strings you cannot "go backwards". You have to write the > algorithm in a way that progresses from the first to the last multibyte > character. (*) In this case, you can do so by moving from first to last, > memorizing the position of the last non-whitespace character. More > precisely, a pointer pointing after this character. When you have > reached the end of the string, you put a '\0' where the memoized pointer > points to, and are done. Done. Thanks for the suggestions.
Best regards, -- Davide Angelocola
Description: trim() removes leading and/or trailing whitespaces Files: lib/trim.c lib/trim.h Depends-on: xalloc mbiter configure.ac: Makefile.am: EXTRA_DIST += trim.h Include: #include "trim.h" License: GPL Maintainer: Davide Angelocola
/* Removes leading and/or trailing whitespaces Copyright (C) 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Davide Angelocola <[EMAIL PROTECTED]> */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <stddef.h> #if HAVE_MBRTOWC # include "mbiter.h" #endif #include "mbchar.h" #include "xalloc.h" #include "trim.h" char * trim2(const char *s, int how) { mbi_iterator_t i; char *d; d = xstrdup(s); if (!d) xalloc_die(); /* Trim leading whitespaces. */ if (how != TRIM_TRAILING) { mbi_init(i, d, strlen(d)); for (; mbi_avail(i) && mb_isspace(mbi_cur(i)); mbi_advance(i)) ; memmove(d, mbi_cur_ptr(i), strlen(mbi_cur_ptr(i)) + 1); } /* Trim trailing whitespaces. */ if (how != TRIM_LEADING) { char *x = d + strlen(d) - 1; for(;;) { mbi_init(i, x, strlen(x)); if (!mbi_avail (i)) break; if (!mb_isspace(mbi_cur(i))) break; *x-- = 0; } } return d; } int main(void) { char buf[] = " a string "; printf("trim = '%s'\n", trim(buf)); printf("trim_leading = '%s'\n", trim_leading(buf)); printf("trim_trailing = '%s'\n", trim_trailing(buf)); return 0; }
/* Removes leading and/or trailing whitespaces Copyright (C) 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Davide Angelocola <[EMAIL PROTECTED]> */ /* Trim mode. */ #define TRIM_TRAILING 0 #define TRIM_LEADING 1 #define TRIM_BOTH 2 /* Removes trailing and leading whitespaces. */ #define trim(s) trim2((s), TRIM_BOTH) /* Removes trailing whitespaces. */ #define trim_trailing(s) trim2((s), TRIM_TRAILING) /* Removes leading whitespaces. */ #define trim_leading(s) trim2((s), TRIM_LEADING) char *trim2(const char *, int);