Remove trailing spaces.
[gnulib.git] / lib / trim.c
index b917549..9293a64 100644 (file)
@@ -1,5 +1,5 @@
 /* Removes leading and/or trailing whitespaces
-   Copyright (C) 2006 Free Software Foundation, Inc.
+   Copyright (C) 2006-2008 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>
+
+/* Specification.  */
+#include "trim.h"
+
+#include <ctype.h>
+#include <string.h>
 
-#if HAVE_MBRTOWC 
+#if HAVE_MBRTOWC
 # include <stddef.h>
+# include <stdlib.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"
+
+/* 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)
 {
   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) 
+      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) 
+      if (how != TRIM_LEADING)
        {
          int state = 0;
-         char *r;
-         
+         char *r IF_LINT (= NULL); /* used only while state = 2 */
+
          mbi_init (i, d, strlen (d));
 
-         for (; mbi_avail (i); mbi_advance (i)) 
+         for (; mbi_avail (i); mbi_advance (i))
            {
-             if (state == 0 && mb_isspace (mbi_cur (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))) 
+
+             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))) 
+             else if (state == 2 && mb_isspace (mbi_cur (i)))
                {
                  state = 2;
-               } 
-             else 
+               }
+             else
                {
                  state = 1;
                }
            }
-         
-         if (state == 2) 
+
+         if (state == 2)
            *r = '\0';
        }
     }
@@ -109,22 +117,22 @@ trim2(const char *s, int how)
 #endif /* HAVE_MBRTOWC */
     {
       char *p;
-      
+
       /* Trim leading whitespaces. */
       if (how != TRIM_TRAILING) {
-       for (p = d; *p && isspace (*p); p++)
-         ;                     
+       for (p = d; *p && isspace ((unsigned char) *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--)
+       for (p = d + strlen (d) - 1; p >= d && isspace ((unsigned char) *p); p--)
          *p = '\0';
       }
     }
-  
+
   return d;
 }
-  
+