On Friday 01 September 2006 18:58, you wrote:
> Thanks; it looks already better.
>
> In multibyte strings you cannot "go backwards". You have to write the
> algorithm in a way that progresses from the first to the last multibyte
> character. (*) In this case, you can do so by moving from first to last,
> memorizing the position of the last non-whitespace character. More
> precisely, a pointer pointing after this character. When you have
> reached the end of the string, you put a '\0' where the memoized pointer
> points to, and are done.
Done. Thanks for the suggestions.
Best regards,
-- Davide Angelocola
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
/* 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 <[EMAIL PROTECTED]> */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stddef.h>
#if HAVE_MBRTOWC
# include "mbiter.h"
#endif
#include "mbchar.h"
#include "xalloc.h"
#include "trim.h"
char *
trim2(const char *s, int how)
{
mbi_iterator_t i;
char *d;
d = xstrdup(s);
if (!d)
xalloc_die();
/* 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)
{
char *x = d + strlen(d) - 1;
for(;;)
{
mbi_init(i, x, strlen(x));
if (!mbi_avail (i))
break;
if (!mb_isspace(mbi_cur(i)))
break;
*x-- = 0;
}
}
return d;
}
int
main(void)
{
char buf[] = " a string ";
printf("trim = '%s'\n", trim(buf));
printf("trim_leading = '%s'\n", trim_leading(buf));
printf("trim_trailing = '%s'\n", trim_trailing(buf));
return 0;
}
/* 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 <[EMAIL PROTECTED]> */
/* 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);