New module 'wcstok'.
authorBruno Haible <bruno@clisp.org>
Sun, 6 Feb 2011 14:25:58 +0000 (15:25 +0100)
committerBruno Haible <bruno@clisp.org>
Mon, 7 Feb 2011 22:36:08 +0000 (23:36 +0100)
* modules/wcstok: New file.
* lib/wchar.in.h (wcstok): New declaration.
* lib/wcstok.c: New file.
* lib/wcstok-impl.h: New file, from libutf8 with modifications.
* m4/wcstok.m4: New file.
* m4/wchar_h.m4 (gl_WCHAR_H): Test whether wcstok is declared.
(gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSTOK, HAVE_WCSTOK.
* modules/wchar (Makefile.am): Substitute GNULIB_WCSTOK, HAVE_WCSTOK.
* tests/test-wchar-c++.cc: Test the declaration of wcstok.
* doc/posix-functions/wcstok.texi: Mention the new module.

ChangeLog
doc/posix-functions/wcstok.texi
lib/wchar.in.h
lib/wcstok-impl.h [new file with mode: 0644]
lib/wcstok.c [new file with mode: 0644]
m4/wchar_h.m4
m4/wcstok.m4 [new file with mode: 0644]
modules/wchar
modules/wcstok [new file with mode: 0644]
tests/test-wchar-c++.cc

index 23694c5e01ee5b445847a6f6727a534d401700b1..c6b8a83cd32c4e4345ddd92c65dabbc54af4d44c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2011-02-06  Bruno Haible  <bruno@clisp.org>
+
+       New module 'wcstok'.
+       * modules/wcstok: New file.
+       * lib/wchar.in.h (wcstok): New declaration.
+       * lib/wcstok.c: New file.
+       * lib/wcstok-impl.h: New file, from libutf8 with modifications.
+       * m4/wcstok.m4: New file.
+       * m4/wchar_h.m4 (gl_WCHAR_H): Test whether wcstok is declared.
+       (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSTOK, HAVE_WCSTOK.
+       * modules/wchar (Makefile.am): Substitute GNULIB_WCSTOK, HAVE_WCSTOK.
+       * tests/test-wchar-c++.cc: Test the declaration of wcstok.
+       * doc/posix-functions/wcstok.texi: Mention the new module.
+
 2011-02-06  Bruno Haible  <bruno@clisp.org>
 
        New module 'wcsstr'.
 2011-02-06  Bruno Haible  <bruno@clisp.org>
 
        New module 'wcsstr'.
index 2d9c69ff44c23a793537f5b90a2c063c60166637..d19fb432a19ff706d960c6da2eab7ddc813366e4 100644 (file)
@@ -4,18 +4,18 @@
 
 POSIX specification:@* @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstok.html}
 
 
 POSIX specification:@* @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcstok.html}
 
-Gnulib module: ---
+Gnulib module: wcstok
 
 Portability problems fixed by Gnulib:
 @itemize
 
 Portability problems fixed by Gnulib:
 @itemize
+@item
+This function is missing on some platforms:
+IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
 @item
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
 @item
-This function is missing on some platforms:
-IRIX 5.3, Solaris 2.5.1, Cygwin 1.5.x.
-@item
 On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
 accommodate all Unicode characters.
 @end itemize
 On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
 accommodate all Unicode characters.
 @end itemize
index b175ab7ec59e87d7cb5f2bf30c96900b6d76da53..13e4d7fed5d89b5cd146083ae7bb4ab6d5278a19 100644 (file)
@@ -873,6 +873,24 @@ _GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - "
 #endif
 
 
 #endif
 
 
+/* Divide WCS into tokens separated by characters in DELIM.  */
+#if @GNULIB_WCSTOK@
+# if !@HAVE_WCSTOK@
+_GL_FUNCDECL_SYS (wcstok, wchar_t *,
+                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+# endif
+_GL_CXXALIAS_SYS (wcstok, wchar_t *,
+                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+_GL_CXXALIASWARN (wcstok);
+#elif defined GNULIB_POSIXCHECK
+# undef wcstok
+# if HAVE_RAW_DECL_WCSTOK
+_GL_WARN_ON_USE (wcstok, "wcstok is unportable - "
+                 "use gnulib module wcstok for portability");
+# endif
+#endif
+
+
 #endif /* _GL_WCHAR_H */
 #endif /* _GL_WCHAR_H */
 #endif
 #endif /* _GL_WCHAR_H */
 #endif /* _GL_WCHAR_H */
 #endif
diff --git a/lib/wcstok-impl.h b/lib/wcstok-impl.h
new file mode 100644 (file)
index 0000000..afb9046
--- /dev/null
@@ -0,0 +1,50 @@
+/* Split a wide string into tokens.
+   Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+   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 3 of the License, 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.  If not, see <http://www.gnu.org/licenses/>.  */
+
+wchar_t *
+wcstok (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)
+{
+  if (wcs == NULL)
+    {
+      wcs = *ptr;
+      if (wcs == NULL)
+        return NULL; /* reminder that end of token sequence has been reached */
+    }
+
+  /* Skip leading delimiters.  */
+  wcs += wcsspn (wcs, delim);
+
+  /* Found a token?  */
+  if (*wcs == (wchar_t)'\0')
+    {
+      *ptr = NULL;
+      return NULL;
+    }
+  /* Move past the token.  */
+  {
+    wchar_t *token_end = wcspbrk (wcs, delim);
+    if (token_end)
+      {
+        /* NUL-terminate the token.  */
+        *token_end = (wchar_t)'\0';
+        *ptr = token_end + 1;
+      }
+    else
+      *ptr = NULL;
+  }
+  return wcs;
+}
diff --git a/lib/wcstok.c b/lib/wcstok.c
new file mode 100644 (file)
index 0000000..e61a3ff
--- /dev/null
@@ -0,0 +1,23 @@
+/* Split a wide string into tokens.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+   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 3 of the License, 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.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <wchar.h>
+
+#include "wcstok-impl.h"
index 9e5fbcdd5e5d0624bc0e2601144be577a19d3f74..f320dd7931003d42ec2ab5d908588dfdf784dad3 100644 (file)
@@ -53,7 +53,7 @@ AC_DEFUN([gl_WCHAR_H],
      wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset
      wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
      wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
      wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset
      wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
      wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
-     wcscspn wcsspn wcspbrk wcsstr
+     wcscspn wcsspn wcspbrk wcsstr wcstok
     ])
 ])
 
     ])
 ])
 
@@ -174,6 +174,7 @@ AC_DEFUN([gl_WCHAR_H_DEFAULTS],
   GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
   GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
   GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
   GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
   GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
   GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
+  GNULIB_WCSTOK=0;      AC_SUBST([GNULIB_WCSTOK])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
   HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
   HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
@@ -210,6 +211,7 @@ AC_DEFUN([gl_WCHAR_H_DEFAULTS],
   HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
   HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
   HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
   HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
   HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
   HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
+  HAVE_WCSTOK=1;        AC_SUBST([HAVE_WCSTOK])
   HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
   HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
   REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
   HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
   HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
   REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
diff --git a/m4/wcstok.m4 b/m4/wcstok.m4
new file mode 100644 (file)
index 0000000..4c91c4f
--- /dev/null
@@ -0,0 +1,15 @@
+# wcstok.m4 serial 1
+dnl Copyright (C) 2011 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_WCSTOK],
+[
+  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+  AC_CHECK_FUNCS_ONCE([wcstok])
+  if test $ac_cv_func_wcstok = no; then
+    HAVE_WCSTOK=0
+    AC_LIBOBJ([wcstok])
+  fi
+])
index f2a4a0c37328c27dd24304e2e3b756bc648907ac..bd9719fc760ca4995fdb3b02871e624fdd7140c6 100644 (file)
@@ -67,6 +67,7 @@ wchar.h: wchar.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
              -e 's|@''GNULIB_WCSSPN''@|$(GNULIB_WCSSPN)|g' \
              -e 's|@''GNULIB_WCSPBRK''@|$(GNULIB_WCSPBRK)|g' \
              -e 's|@''GNULIB_WCSSTR''@|$(GNULIB_WCSSTR)|g' \
              -e 's|@''GNULIB_WCSSPN''@|$(GNULIB_WCSSPN)|g' \
              -e 's|@''GNULIB_WCSPBRK''@|$(GNULIB_WCSPBRK)|g' \
              -e 's|@''GNULIB_WCSSTR''@|$(GNULIB_WCSSTR)|g' \
+             -e 's|@''GNULIB_WCSTOK''@|$(GNULIB_WCSTOK)|g' \
              -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
              -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
              -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
              -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
              -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
              -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
@@ -103,6 +104,7 @@ wchar.h: wchar.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
              -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
              -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
              -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
              -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
              -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
              -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
+             -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \
              -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
              -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
              -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
              -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
              -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
              -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
diff --git a/modules/wcstok b/modules/wcstok
new file mode 100644 (file)
index 0000000..6f92b05
--- /dev/null
@@ -0,0 +1,27 @@
+Description:
+wcstok() function: split a wide string into tokens.
+
+Files:
+lib/wcstok.c
+lib/wcstok-impl.h
+m4/wcstok.m4
+
+Depends-on:
+wchar
+wcsspn
+wcspbrk
+
+configure.ac:
+gl_FUNC_WCSTOK
+gl_WCHAR_MODULE_INDICATOR([wcstok])
+
+Makefile.am:
+
+Include:
+<wchar.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
index 495a6b45e3ef207697a868fc69f3a37b91408a2b..e8fd2ac95e555fccb999e4f36e7116720f2e9f6c 100644 (file)
@@ -202,6 +202,11 @@ SIGNATURE_CHECK (GNULIB_NAMESPACE::wcsstr, wchar_t *,
                  (const wchar_t *, const wchar_t *));
 #endif
 
                  (const wchar_t *, const wchar_t *));
 #endif
 
+#if GNULIB_TEST_WCSTOK
+SIGNATURE_CHECK (GNULIB_NAMESPACE::wcstok, wchar_t *,
+                 (wchar_t *, const wchar_t *, wchar_t **));
+#endif
+
 
 int
 main ()
 
 int
 main ()