# HG changeset patch # User Bruno Haible # Date 1157459562 0 # Node ID 448f74ab8f39a91aede64ec357ff555e0e2b79d8 # Parent b188d0ecb3999ca27637a51cb169d808920742b1 New 'trim' module, from Davide Angelocola . diff --git a/ChangeLog b/ChangeLog --- 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 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -1536,6 +1536,7 @@ 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 --- 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 --- /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 --- /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 --- /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