(root)/
glibc-2.38/
wcsmbs/
wcsstr.c
       1  /* Copyright (C) 1995-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  /*
      19   * The original strstr() file contains the following comment:
      20   *
      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 :-).
      26   *
      27   * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
      28  
      29  #include <wchar.h>
      30  
      31  wchar_t *
      32  wcsstr (const wchar_t *haystack, const wchar_t *needle)
      33  {
      34    wchar_t b, c;
      35  
      36    if ((b = *needle) != L'\0')
      37      {
      38        haystack--;				/* possible ANSI violation */
      39        do
      40  	if ((c = *++haystack) == L'\0')
      41  	  goto ret0;
      42        while (c != b);
      43  
      44        if (!(c = *++needle))
      45  	goto foundneedle;
      46        ++needle;
      47        goto jin;
      48  
      49        for (;;)
      50  	{
      51  	  wchar_t a;
      52  	  const wchar_t *rhaystack, *rneedle;
      53  
      54  	  do
      55  	    {
      56  	      if (!(a = *++haystack))
      57  		goto ret0;
      58  	      if (a == b)
      59  		break;
      60  	      if ((a = *++haystack) == L'\0')
      61  		goto ret0;
      62  shloop:	      ;
      63  	    }
      64  	  while (a != b);
      65  
      66  jin:	  if (!(a = *++haystack))
      67  	    goto ret0;
      68  
      69  	  if (a != c)
      70  	    goto shloop;
      71  
      72  	  if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle)))
      73  	    do
      74  	      {
      75  		if (a == L'\0')
      76  		  goto foundneedle;
      77  		if (*++rhaystack != (a = *++needle))
      78  		  break;
      79  		if (a == L'\0')
      80  		  goto foundneedle;
      81  	      }
      82  	    while (*++rhaystack == (a = *++needle));
      83  
      84  	  needle = rneedle;		  /* took the register-poor approach */
      85  
      86  	  if (a == L'\0')
      87  	    break;
      88  	}
      89      }
      90  foundneedle:
      91    return (wchar_t*) haystack;
      92  ret0:
      93    return NULL;
      94  }
      95  /* This alias is for backward compatibility with drafts of the ISO C
      96     standard.  Unfortunately the Unix(TM) standard requires this name.  */
      97  weak_alias (wcsstr, wcswcs)