diff lib/wcscspn-impl.h @ 14298:f0c82d0c08e6

New module 'wcscspn'. * modules/wcscspn: New file. * lib/wchar.in.h (wcscspn): New declaration. * lib/wcscspn.c: New file. * lib/wcscspn-impl.h: New file, from libutf8 with modifications. * m4/wcscspn.m4: New file. * m4/wchar_h.m4 (gl_WCHAR_H): Test whether wcscspn is declared. (gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSCSPN, HAVE_WCSCSPN. * modules/wchar (Makefile.am): Substitute GNULIB_WCSCSPN, HAVE_WCSCSPN. * tests/test-wchar-c++.cc: Test the declaration of wcscspn. * doc/posix-functions/wcscspn.texi: Mention the new module.
author Bruno Haible <bruno@clisp.org>
date Sun, 06 Feb 2011 14:10:45 +0100
parents
children 8250f2777afc
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/lib/wcscspn-impl.h
@@ -0,0 +1,47 @@
+/* Search a wide string for any of a set of wide characters.
+   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/>.  */
+
+size_t
+wcscspn (const wchar_t *wcs, const wchar_t *reject)
+{
+  /* Optimize two cases.  */
+  if (reject[0] == (wchar_t)'\0')
+    return wcslen (wcs);
+
+  if (reject[1] == (wchar_t)'\0')
+    {
+      wchar_t wc = reject[0];
+      const wchar_t *ptr = wcs;
+      for (; *ptr != (wchar_t)'\0'; ptr++)
+        {
+          if (*ptr == wc)
+            break;
+        }
+      return ptr - wcs;
+    }
+
+  /* General case.  */
+  {
+    const wchar_t *ptr = wcs;
+    for (; *ptr != (wchar_t)'\0'; ptr++)
+      {
+        if (wcschr (reject, *ptr))
+          break;
+      }
+    return ptr - wcs;
+  }
+}