New 'trim' module, from Davide Angelocola <davide.angelocola@tiscali.it>.
authorBruno Haible <bruno@clisp.org>
Tue, 5 Sep 2006 12:32:42 +0000 (12:32 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 5 Sep 2006 12:32:42 +0000 (12:32 +0000)
ChangeLog
MODULES.html.sh
lib/ChangeLog
lib/trim.c [new file with mode: 0644]
lib/trim.h [new file with mode: 0644]
modules/trim [new file with mode: 0644]

index 4402bcff7170c82e7297f4fb1c605eb859966d61..1c0556d6825074d8d3f98f653bc287e1c2902171 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-09-05  Bruno Haible  <bruno@clisp.org>
+
+       * MODULES.html.sh (String handling): Add trim.
+
+2006-09-05  Davide Angelocola <davide.angelocola@tiscali.it>
+
+       * modules/trim: New file.
+
 2006-09-01  Paul Eggert  <eggert@cs.ucla.edu>
 
        * gnulib-tool (func_emit_lib_Makefile_am): Fix typos in
index 357563370af51f535cb96bcd1b99fba2b50c6432..cf64d1de343e2a6ef8f4db3d022ccecffe5cfa80 100755 (executable)
@@ -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
index 6513e49f1a642a7fc5539929588437e691473374..4c1a9bcfb8478fc7289081ef3275d843f3a23b17 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-05  Davide Angelocola <davide.angelocola@tiscali.it>
+
+       * trim.h: New file.
+       * trim.c: New file.
+
 2006-09-01  Paul Eggert  <eggert@cs.ucla.edu>
 
        * getloadavg.c: Use CONFIGURING_GETLOADAVG, not gl_GETLOADAVG.
diff --git a/lib/trim.c b/lib/trim.c
new file mode 100644 (file)
index 0000000..78f84b2
--- /dev/null
@@ -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 <davide.angelocola@gmail.com> */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if HAVE_MBRTOWC 
+# include <stddef.h>
+# include "mbchar.h"
+# include "mbiter.h"
+# include "mbuiter.h"          /* FIXME: for MB_CUR_MAX */
+#else
+# include <ctype.h>
+#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 (file)
index 0000000..337bcbd
--- /dev/null
@@ -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 <davide.angelocola@gmail.com> */
+
+/* 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 (file)
index 0000000..019a041
--- /dev/null
@@ -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