diff options
| author | Manuel Novoa III <mjn3@codepoet.org> | 2004-09-02 14:39:38 +0000 | 
|---|---|---|
| committer | Manuel Novoa III <mjn3@codepoet.org> | 2004-09-02 14:39:38 +0000 | 
| commit | bec90733b9de6e7d75b8bda19b3f0a7117e6b78d (patch) | |
| tree | 474ca0f3b80b7990ff33e547d42c1e7dc3014e3b /libc/string/generic/strstr.c | |
| parent | c4cedfc718426337b0215c256c184d2b4e20cd06 (diff) | |
| download | uClibc-alpine-bec90733b9de6e7d75b8bda19b3f0a7117e6b78d.tar.bz2 uClibc-alpine-bec90733b9de6e7d75b8bda19b3f0a7117e6b78d.tar.xz | |
Add a couple of mips-specific string funcs.
Port the generic optimized string funcs from glibc, with some tweaks
  to cut their size a little.  The main change is making memmove
  call memcpy for forward copying to trim redundant code.
Make use of both the generic and arch-specific speed-optimized string
  funcs configurable.  Arch-specific take precedence over generic,
  and generic takes precedence over basic size-optimized uClibc funcs.
Diffstat (limited to 'libc/string/generic/strstr.c')
| -rw-r--r-- | libc/string/generic/strstr.c | 116 | 
1 files changed, 116 insertions, 0 deletions
| diff --git a/libc/string/generic/strstr.c b/libc/string/generic/strstr.c new file mode 100644 index 000000000..45a64bb9b --- /dev/null +++ b/libc/string/generic/strstr.c @@ -0,0 +1,116 @@ +/* Return the offset of one string within another. +   Copyright (C) 1994,1996,1997,2000,2001,2003 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 Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +/* + * 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 <string.h> + +typedef unsigned chartype; + +#undef strstr + +char * +strstr (phaystack, pneedle) +     const char *phaystack; +     const char *pneedle; +{ +  const unsigned char *haystack, *needle; +  chartype b; +  const unsigned char *rneedle; + +  haystack = (const unsigned char *) phaystack; + +  if ((b = *(needle = (const unsigned char *) pneedle))) +    { +      chartype c; +      haystack--;		/* possible ANSI violation */ + +      { +	chartype a; +	do +	  if (!(a = *++haystack)) +	    goto ret0; +	while (a != b); +      } + +      if (!(c = *++needle)) +	goto foundneedle; +      ++needle; +      goto jin; + +      for (;;) +	{ +	  { +	    chartype a; +	    if (0) +	    jin:{ +		if ((a = *++haystack) == c) +		  goto crest; +	      } +	    else +	      a = *++haystack; +	    do +	      { +		for (; a != b; a = *++haystack) +		  { +		    if (!a) +		      goto ret0; +		    if ((a = *++haystack) == b) +		      break; +		    if (!a) +		      goto ret0; +		  } +	      } +	    while ((a = *++haystack) != c); +	  } +	crest: +	  { +	    chartype a; +	    { +	      const unsigned char *rhaystack; +	      if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle))) +		do +		  { +		    if (!a) +		      goto foundneedle; +		    if (*++rhaystack != (a = *++needle)) +		      break; +		    if (!a) +		      goto foundneedle; +		  } +		while (*++rhaystack == (a = *++needle)); +	      needle = rneedle;	/* took the register-poor aproach */ +	    } +	    if (!a) +	      break; +	  } +	} +    } +foundneedle: +  return (char *) haystack; +ret0: +  return 0; +} | 
