home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / lib / strstr.c < prev    next >
C/C++ Source or Header  |  1992-03-08  |  2KB  |  52 lines

  1. /* strstr.c: find a string in another string.  
  2. Copyright (C) 1991 Free Software Foundation, Inc.
  3. This file was part of the GNU C Library.
  4.  
  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.
  9.  
  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.
  14.  
  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
  17. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  18. Cambridge, MA 02139, USA.  */
  19.  
  20. #include "config.h"
  21.  
  22. /* Return the first ocurrence of NEEDLE in HAYSTACK.  */
  23. char *
  24. strstr (const char *needle, const char *haystack)
  25. {
  26.   register const char *const needle_end = strchr(needle, '\0');
  27.   register const char *const haystack_end = strchr(haystack, '\0');
  28.   register const size_t needle_len = needle_end - needle;
  29.   register const size_t needle_last = needle_len - 1;
  30.   register const char *begin;
  31.  
  32.   if (needle_len == 0)
  33.     return (char *) haystack_end;
  34.   if ((size_t) (haystack_end - haystack) < needle_len)
  35.     return NULL;
  36.  
  37.   for (begin = &haystack[needle_last]; begin < haystack_end; ++begin)
  38.     {
  39.       register const char *n = &needle[needle_last];
  40.       register const char *h = begin;
  41.       do
  42.     if (*h != *n)
  43.       goto loop;
  44.       while (--n >= needle && --h >= haystack);
  45.  
  46.       return (char *) h;
  47.     loop:;
  48.     }
  49.  
  50.   return NULL;
  51. }
  52.