X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ftrim.c;h=452d8bc740b23b7c3d912240f78e28bbc65ee776;hb=fa3486514bd8f15f8eb4c49821d0356b52e5a335;hp=3813ca88ab86644bf7184278e36437afe8f285b8;hpb=da7ca7f1991964ba2de6a6c49ba6239697f3a4cc;p=gnulib.git diff --git a/lib/trim.c b/lib/trim.c index 3813ca88a..452d8bc74 100644 --- a/lib/trim.c +++ b/lib/trim.c @@ -23,98 +23,100 @@ #include #include +#include +#include -#if HAVE_MBRTOWC -# include -# include -# include "mbchar.h" -# include "mbiter.h" -#endif - +#include "mbchar.h" +#include "mbiter.h" #include "xalloc.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; /* used only while state = 2 */ - + 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'; } } else -#endif /* HAVE_MBRTOWC */ { char *p; - + /* Trim leading whitespaces. */ if (how != TRIM_TRAILING) { for (p = d; *p && isspace ((unsigned char) *p); p++) - ; + ; memmove (d, p, strlen (p) + 1); } @@ -125,7 +127,7 @@ trim2(const char *s, int how) *p = '\0'; } } - + return d; } - +