Update.
[glibc.git] / sysdeps / generic / strstr.c
blob03d6c8e5fcfc673ea3aec3f62b86364839b03c9d
1 /* Return the offset of one string within another.
2 Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
21 * My personal strstr() implementation that beats most other algorithms.
22 * Until someone tells me otherwise, I assume that this is the
23 * fastest implementation of strstr() in C.
24 * I deliberately chose not to comment it. You should have at least
25 * as much fun trying to understand it, as I had to write it :-).
27 * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
29 #if HAVE_CONFIG_H
30 # include <config.h>
31 #endif
33 #if defined _LIBC || defined HAVE_STRING_H
34 # include <string.h>
35 #endif
37 typedef unsigned chartype;
39 #undef strstr
41 char *
42 strstr (phaystack, pneedle)
43 const char *phaystack;
44 const char *pneedle;
46 register const unsigned char *haystack, *needle;
47 register chartype b, c;
49 haystack = (const unsigned char *) phaystack;
50 needle = (const unsigned char *) pneedle;
52 b = *needle;
53 if (b != '\0')
55 haystack--; /* possible ANSI violation */
58 c = *++haystack;
59 if (c == '\0')
60 goto ret0;
62 while (c != b);
64 c = *++needle;
65 if (c == '\0')
66 goto foundneedle;
67 ++needle;
68 goto jin;
70 for (;;)
72 register chartype a;
73 register const unsigned char *rhaystack, *rneedle;
77 a = *++haystack;
78 if (a == '\0')
79 goto ret0;
80 if (a == b)
81 break;
82 a = *++haystack;
83 if (a == '\0')
84 goto ret0;
85 shloop: }
86 while (a != b);
88 jin: a = *++haystack;
89 if (a == '\0')
90 goto ret0;
92 if (a != c)
93 goto shloop;
95 rhaystack = haystack-- + 1;
96 rneedle = needle;
97 a = *rneedle;
99 if (*rhaystack == a)
102 if (a == '\0')
103 goto foundneedle;
104 ++rhaystack;
105 a = *++needle;
106 if (*rhaystack != a)
107 break;
108 if (a == '\0')
109 goto foundneedle;
110 ++rhaystack;
111 a = *++needle;
113 while (*rhaystack == a);
115 needle = rneedle; /* took the register-poor approach */
117 if (a == '\0')
118 break;
121 foundneedle:
122 return (char*) haystack;
123 ret0:
124 return 0;