From 0631ee73aea142c346c7a3026209ef3cc7b30b22 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 5 Sep 2006 12:32:42 +0000 Subject: [PATCH] New 'trim' module, from Davide Angelocola . --- ChangeLog | 8 +++ MODULES.html.sh | 1 + lib/ChangeLog | 5 ++ lib/trim.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/trim.h | 36 +++++++++++++ modules/trim | 24 +++++++++ 6 files changed, 206 insertions(+) create mode 100644 lib/trim.c create mode 100644 lib/trim.h create mode 100644 modules/trim diff --git a/ChangeLog b/ChangeLog index 4402bcff71..1c0556d682 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-09-05 Bruno Haible + + * MODULES.html.sh (String handling): Add trim. + +2006-09-05 Davide Angelocola + + * modules/trim: New file. + 2006-09-01 Paul Eggert * gnulib-tool (func_emit_lib_Makefile_am): Fix typos in diff --git a/MODULES.html.sh b/MODULES.html.sh index 357563370a..cf64d1de34 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -1536,6 +1536,7 @@ func_all_modules () func_module strndup func_module strsep func_module c-strstr + func_module trim #func_module fstrcmp func_module xstrndup func_end_table diff --git a/lib/ChangeLog b/lib/ChangeLog index 6513e49f1a..4c1a9bcfb8 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2006-09-05 Davide Angelocola + + * trim.h: New file. + * trim.c: New file. + 2006-09-01 Paul Eggert * getloadavg.c: Use CONFIGURING_GETLOADAVG, not gl_GETLOADAVG. diff --git a/lib/trim.c b/lib/trim.c new file mode 100644 index 0000000000..78f84b2d94 --- /dev/null +++ b/lib/trim.c @@ -0,0 +1,132 @@ +/* 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 */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if HAVE_MBRTOWC +# include +# include "mbchar.h" +# include "mbiter.h" +# include "mbuiter.h" /* FIXME: for MB_CUR_MAX */ +#else +# include +#endif + +#include "xalloc.h" +#include "trim.h" + +char * +trim2(const char *s, int how) +{ + char *d; + + d = strdup(s); + + if (!d) + xalloc_die(); + +#if HAVE_MBRTOWC + if (MB_CUR_MAX > 1) + { + mbi_iterator_t i; + + /* 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) + { + int state = 0; + char *r; + + mbi_init (i, d, strlen (d)); + + for (; mbi_avail (i); mbi_advance (i)) + { + if (state == 0 && mb_isspace (mbi_cur (i))) + { + state = 0; + continue; + } + + if (state == 0 && !mb_isspace (mbi_cur (i))) + { + state = 1; + continue; + } + + if (state == 1 && !mb_isspace (mbi_cur (i))) + { + state = 1; + 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))) + { + state = 2; + } + else + { + state = 1; + } + } + + if (state == 2) + *r = '\0'; + } + } + else +#endif /* HAVE_MBRTOWC */ + { + char *p; + + /* Trim leading whitespaces. */ + if (how != TRIM_TRAILING) { + for (p = d; *p && isspace (*p); p++) + ; + + memmove (d, p, strlen (p) + 1); + } + + /* Trim trailing whitespaces. */ + if (how != TRIM_LEADING) { + for (p = d + strlen (d) - 1; p >= d && isspace (*p); p--) + *p = '\0'; + } + } + + return d; +} + diff --git a/lib/trim.h b/lib/trim.h new file mode 100644 index 0000000000..337bcbd2e2 --- /dev/null +++ b/lib/trim.h @@ -0,0 +1,36 @@ +/* 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 */ + +/* 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); + diff --git a/modules/trim b/modules/trim new file mode 100644 index 0000000000..019a041d80 --- /dev/null +++ b/modules/trim @@ -0,0 +1,24 @@ +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 -- 2.30.2