mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	2008-03-29 Eric Blake <ebb9@byu.net> Rewrite string searches to O(n) rather than O(n^2). * string/str-two-way.h: New file. For linear fixed-allocation string searching. * string/memmem.c: New implementation. * string/strstr.c: New implementation. * string/strcasestr.c: New implementation. * sysdeps/posix/getaddrinfo.c (getaddrinfo): Call _res_hconf_init
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2008 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.  */
 | |
| 
 | |
| /* This particular implementation was written by Eric Blake, 2008.  */
 | |
| 
 | |
| #ifndef _LIBC
 | |
| # include <config.h>
 | |
| #endif
 | |
| 
 | |
| /* Specification of memmem.  */
 | |
| #include <string.h>
 | |
| 
 | |
| #ifndef _LIBC
 | |
| # define __builtin_expect(expr, val)   (expr)
 | |
| #endif
 | |
| 
 | |
| #define RETURN_TYPE void *
 | |
| #define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
 | |
| #include "str-two-way.h"
 | |
| 
 | |
| #undef memmem
 | |
| 
 | |
| /* Return the first occurrence of NEEDLE in HAYSTACK.  Return HAYSTACK
 | |
|    if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
 | |
|    HAYSTACK.  */
 | |
| void *
 | |
| memmem (const void *haystack_start, size_t haystack_len,
 | |
| 	const void *needle_start, size_t needle_len)
 | |
| {
 | |
|   /* Abstract memory is considered to be an array of 'unsigned char' values,
 | |
|      not an array of 'char' values.  See ISO C 99 section 6.2.6.1.  */
 | |
|   const unsigned char *haystack = (const unsigned char *) haystack_start;
 | |
|   const unsigned char *needle = (const unsigned char *) needle_start;
 | |
| 
 | |
|   if (needle_len == 0)
 | |
|     /* The first occurrence of the empty string is deemed to occur at
 | |
|        the beginning of the string.  */
 | |
|     return (void *) haystack;
 | |
| 
 | |
|   /* Sanity check, otherwise the loop might search through the whole
 | |
|      memory.  */
 | |
|   if (__builtin_expect (haystack_len < needle_len, 0))
 | |
|     return NULL;
 | |
| 
 | |
|   /* Use optimizations in memchr when possible, to reduce the search
 | |
|      size of haystack using a linear algorithm with a smaller
 | |
|      coefficient.  However, avoid memchr for long needles, since we
 | |
|      can often achieve sublinear performance.  */
 | |
|   if (needle_len < LONG_NEEDLE_THRESHOLD)
 | |
|     {
 | |
|       haystack = memchr (haystack, *needle, haystack_len);
 | |
|       if (!haystack || __builtin_expect (needle_len == 1, 0))
 | |
| 	return (void *) haystack;
 | |
|       haystack_len -= haystack - (const unsigned char *) haystack_start;
 | |
|       if (haystack_len < needle_len)
 | |
| 	return NULL;
 | |
|       return two_way_short_needle (haystack, haystack_len, needle, needle_len);
 | |
|     }
 | |
|   else
 | |
|     return two_way_long_needle (haystack, haystack_len, needle, needle_len);
 | |
| }
 | |
| 
 | |
| #undef LONG_NEEDLE_THRESHOLD
 |