summary refs log tree commit diff
path: root/wcsmbs/wcsstr.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-04-02 13:27:17 +0000
committerRoland McGrath <roland@gnu.org>1996-04-02 13:27:17 +0000
commit30de3b18a526acc837957865129b7fa6d8ac91d1 (patch)
treeddf650f2b280f8ce0e52157e98f459a13e16931c /wcsmbs/wcsstr.c
parentb80510574cffbf64378fbcb25574955ebc4b92e9 (diff)
downloadglibc-30de3b18a526acc837957865129b7fa6d8ac91d1.tar.gz
glibc-30de3b18a526acc837957865129b7fa6d8ac91d1.tar.xz
glibc-30de3b18a526acc837957865129b7fa6d8ac91d1.zip
Mon Apr 1 13:34:55 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> cvs/libc-960403
	* stdio-common/tst-printf.c (main): Add new test case.

	* sysdeps/generic/setenv.c (unsetenv): Use old-style definition.

Mon Apr  1 11:39:10  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* stdlib/strtod.c (STRTOD): Fix handling of American style FP
	numbers.

	* stdio-common/vfprintf.c (vfprintf): Don't increment format
	string pointer twice after seeing `*'.

Sun Mar 31 17:31:54 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* MakeTAGS (po/SYS_libc.pot): Prepend header processed from
 	po/header.pot.

Sun Mar 31 18:07:32 1996  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* locale/Makefile (others, install-bin): Compiling locale works
        again.
	(locale-modules): locale has no --dump option anymore.  Remove
	ctypedump.

	* locale/programs/config.h: Don't declare euidaccess.
	Use #include_next to get libc's config.h.

	* locale/programs/ctypedump.c: Not needed anymore.  Dump option
	of locale is removed.

	* locale/programs/locale.c: Adapt for new locale implementation.

	* stdio-common/_itoa.h (_itoa_word): Define as inline function.
	* stdio-common/_itoa.c (_itoa_lower_digits, _itoa_upper_digits):
	Don't declare static because used in _itoa_word inline function.

	* stdio-common/printf-parse.h: Prepare for use in wide-char
	stdio implementation.
	(find_spec): Take additional argument to work with mbrlen instead
	of mblen.
	(parse_one_spec): Ditto.

	* stdio-common/printf-prs.c: Prepare for use in wide-char
	stdio implementation.

	* stdio-common/printf.h: Mark change for wide-char handling.
	Changing it now would result in incompatibilities.

	* stdio-common/vfprintf.c: New and fast implementation.

	* wcsmbs/Makefile (routines): Remove pre-ISO C multibyte functions
	mbsadvance, mbscat, mbschr, mbscmp, mbscpy, mbsdup, mbslen,
	mbsncat, mbsncmp, mbsncpy, mbsrchr, mbstomb.
	Change wcswcs to wcsstr.
	Add wmemchr, wmemcmp, wmemcpy, wmemmove, wmemset, btowc, wctob,
	mbsinit, mbrlen, mbrtowc, wcrtomb, mbsrtowcs, wcsrtombs.

	* wcsmbs/btowc.c, wcsmbs/mbrlen.c, wcsmbs/mbrtowc.c,
        wcsmbs/mbsinit.c, wcsmbs/mbsrtowcs.c, wcsmbs/wchar.h,
        wcsmbs/wcrtomb.c, wcsmbs/wcsrtombs.c, wcsmbs/wcsstr.c,
        wcsmbs/wctob.c, wcsmbs/wmemchr.c, wcsmbs/wmemcmp.c,
        wcsmbs/wmemcpy.c, wcsmbs/wmemmove.c, wcsmbs/wmemset.c: New
        function according to ISO C amendment 1.
	* wchar.h: Wrapper around "wcsmbs/wchar.h".

	* wcsmbs/wcscat.c, wcsmbs/wcschr.c, wcsmbs/wcscmp.c,
        wcsmbs/wcscpy.c, wcsmbs/wcscspn.c, wcsmbs/wcsdup.c,
        wcsmbs/wcslen.c, wcsmbs/wcsncat.c, wcsmbs/wcsncmp.c,
        wcsmbs/wcsncpy.c, wcsmbs/wcspbrk.c, wcsmbs/wcsrchr.c,
        wcsmbs/wcsspn.c, wcsmbs/wcstok.c: Changed to conform with ISO C
        amendment 1.

	* wcsmbs/mbsadvance.c, wcsmbs/mbscat.c, wcsmbs/mbschr.c,
        wcsmbs/mbscmp.c, wcsmbs/mbscpy.c, wcsmbs/mbsdup.c,
        wcsmbs/mbslen.c, wcsmbs/mbsncat.c, wcsmbs/mbsncmp.c,
        wcsmbs/mbsncpy.c, wcsmbs/mbsrchr.c, wcsmbs/mbstomb.c,
        wcsmbs/mbstr.h, wcsmbs/wcstr.h, wcsmbs/wcswcs.c: Removed.
        Implement functions from early drafts, not part of final standard.

Sun Mar 31 16:50:41 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* setjmp/setjmp.h (jmp_buf): Change gratuitous struct tag name to
	__jmp_bug_tag so its C++ implicit typedef does not conflict with the
	__jmp_buf typedef.

	* Makerules (BUILD_CFLAGS) [! objdir]: Use $(..)config.h when
	compiling in the source directories.

Fri Mar 29 16:26:35 1996  Roland McGrath  <roland@whiz-bang.gnu.ai.mit.edu>

	* sysdeps/libm-ieee754/w_gamma.c: Use signgam instead of __signgam.
	* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
Diffstat (limited to 'wcsmbs/wcsstr.c')
-rw-r--r--wcsmbs/wcsstr.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/wcsmbs/wcsstr.c b/wcsmbs/wcsstr.c
new file mode 100644
index 0000000000..d2c863fff3
--- /dev/null
+++ b/wcsmbs/wcsstr.c
@@ -0,0 +1,97 @@
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.	 If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/*
+ * The original strstr() file contains the following comment:
+ *
+ * My personal strstr() implementation that beats most other algorithms.
+ * Until someone tells me otherwise, I assume that this is the
+ * fastest implementation of strstr() in C.
+ * I deliberately chose not to comment it.  You should have at least
+ * as much fun trying to understand it, as I had to write it :-).
+ *
+ * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
+
+#include <wchar.h>
+
+wchar_t *
+wcsstr (haystack, needle)
+     const wchar_t *haystack;
+     const wchar_t *needle;
+{
+  register wchar_t b, c;
+
+  if ((b = *needle) != L'\0')
+    {
+      haystack--;				/* possible ANSI violation */
+      do
+	if ((c = *++haystack) == L'\0')
+	  goto ret0;
+      while (c != b);
+
+      if (!(c = *++needle))
+	goto foundneedle;
+      ++needle;
+      goto jin;
+
+      for (;;)
+	{
+	  register wchar_t a;
+	  register const wchar_t *rhaystack, *rneedle;
+
+	  do
+	    {
+	      if (!(a = *++haystack))
+		goto ret0;
+	      if (a == b)
+		break;
+	      if ((a = *++haystack) == L'\0')
+		goto ret0;
+shloop:	      ;
+	    }
+	  while (a != b);
+
+jin:	  if (!(a = *++haystack))
+	    goto ret0;
+
+	  if (a != c)
+	    goto shloop;
+
+	  if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle)))
+	    do
+	      {
+		if (a == L'\0')
+		  goto foundneedle;
+		if (*++rhaystack != (a = *++needle))
+		  break;
+		if (a == L'\0')
+		  goto foundneedle;
+	      }
+	    while (*++rhaystack == (a = *++needle));
+
+	  needle = rneedle;		  /* took the register-poor approach */
+
+	  if (a == L'\0')
+	    break;
+	}
+    }
+foundneedle:
+  return (wchar_t*) haystack;
+ret0:
+  return NULL;
+}