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);

Reply via email to