maint: update copyright
[gnulib.git] / lib / trim.c
index b917549..742de9b 100644 (file)
@@ -1,5 +1,5 @@
 /* Removes leading and/or trailing whitespaces
-   Copyright (C) 2006 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 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
 
 /* Written by Davide Angelocola <davide.angelocola@gmail.com> */
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
 
-#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
+/* Specification.  */
+#include "trim.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdlib.h>
 
+#include "mbchar.h"
+#include "mbiter.h"
 #include "xalloc.h"
-#include "trim.h"
+
+/* Use this to suppress gcc's "...may be used before initialized" warnings. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
 
 char *
-trim2(const char *s, int how)
+trim2 (const char *s, int how)
 {
   char *d;
-    
-  d = strdup(s);
+
+  d = strdup (s);
 
   if (!d)
-    xalloc_die();
-  
-#if HAVE_MBRTOWC
+    xalloc_die ();
+
   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);
-       }
-  
+      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';
-       }
+      if (how != TRIM_LEADING)
+        {
+          unsigned int state = 0;
+          char *r IF_LINT (= NULL); /* used only while state = 2 */
+
+          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';
+        }
     }
   else
-#endif /* HAVE_MBRTOWC */
     {
       char *p;
-      
+
       /* Trim leading whitespaces. */
-      if (how != TRIM_TRAILING) {
-       for (p = d; *p && isspace (*p); p++)
-         ;                     
+      if (how != TRIM_TRAILING)
+        {
+          for (p = d; *p && isspace ((unsigned char) *p); p++)
+            ;
 
-       memmove (d, p, strlen (p) + 1);
-      }
+          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';
-      }
+      if (how != TRIM_LEADING)
+        {
+          for (p = d + strlen (d) - 1;
+               p >= d && isspace ((unsigned char) *p); p--)
+            *p = '\0';
+        }
     }
-  
+
   return d;
 }
-