summaryrefslogtreecommitdiff
path: root/missing/strstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'missing/strstr.c')
-rw-r--r--missing/strstr.c83
1 files changed, 18 insertions, 65 deletions
diff --git a/missing/strstr.c b/missing/strstr.c
index c54349983e..1673518f06 100644
--- a/missing/strstr.c
+++ b/missing/strstr.c
@@ -1,73 +1,26 @@
-/*
- * strstr.c --
- *
- * Source code for the "strstr" library routine.
- *
- * Copyright 1988-1991 Regents of the University of California
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appears in all copies. The University of California
- * makes no representations about the suitability of this
- * software for any purpose. It is provided "as is" without
- * express or implied warranty.
- */
-
-#ifndef lint
-static char rcsid[] = "$Header$ SPRITE (Berkeley)";
-#endif /* not lint */
-
-/*
- *----------------------------------------------------------------------
- *
- * strstr --
- *
- * Locate the first instance of a substring in a string.
- *
- * Results:
- * If string contains substring, the return value is the
- * location of the first matching instance of substring
- * in string. If string doesn't contain substring, the
- * return value is 0. Matching is done on an exact
- * character-for-character basis with no wildcards or special
- * characters.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
+/* public domain rewrite of strstr(3) */
char *
-strstr(string, substring)
- register char *string; /* String to search. */
- char *substring; /* Substring to try to find in string. */
+strstr(haystack, needle)
+ char *haystack, *needle;
{
- register char *a, *b;
-
- /* First scan quickly through the two strings looking for a
- * single-character match. When it's found, then compare the
- * rest of the substring.
- */
+ char *hend;
+ char *a, *b;
- b = substring;
- if (*b == 0) {
- return string;
- }
- for ( ; *string != 0; string += 1) {
- if (*string != *b) {
- continue;
- }
- a = string;
- while (1) {
- if (*b == 0) {
- return string;
- }
- if (*a++ != *b++) {
- break;
+ if (*needle == 0) return haystack;
+ hend = haystack + strlen(haystack) - strlen(needle) + 1;
+ while (haystack < hend) {
+ if (*haystack == *needle) {
+ a = haystack;
+ b = needle;
+ for (;;) {
+ if (*b == 0) return haystack;
+ if (*a++ != *b++) {
+ break;
+ }
}
}
- b = substring;
+ haystack++;
}
- return (char *) 0;
+ return 0;
}