mirror of
				https://github.com/python/cpython.git
				synced 2025-10-25 10:44:55 +00:00 
			
		
		
		
	
		
			
	
	
		
			54 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* stringlib: replace implementation */ | ||
|  | 
 | ||
|  | #ifndef STRINGLIB_FASTSEARCH_H
 | ||
|  | #error must include "stringlib/fastsearch.h" before including this module
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | Py_LOCAL_INLINE(void) | ||
|  | STRINGLIB(replace_1char_inplace)(STRINGLIB_CHAR* s, STRINGLIB_CHAR* end, | ||
|  |                                  Py_UCS4 u1, Py_UCS4 u2, Py_ssize_t maxcount) | ||
|  | { | ||
|  |     *s = u2; | ||
|  |     while (--maxcount && ++s != end) { | ||
|  |         /* Find the next character to be replaced.
 | ||
|  | 
 | ||
|  |            If it occurs often, it is faster to scan for it using an inline | ||
|  |            loop.  If it occurs seldom, it is faster to scan for it using a | ||
|  |            function call; the overhead of the function call is amortized | ||
|  |            across the many characters that call covers.  We start with an | ||
|  |            inline loop and use a heuristic to determine whether to fall back | ||
|  |            to a function call. */ | ||
|  |         if (*s != u1) { | ||
|  |             int attempts = 10; | ||
|  |             /* search u1 in a dummy loop */ | ||
|  |             while (1) { | ||
|  |                 if (++s == end) | ||
|  |                     return; | ||
|  |                 if (*s == u1) | ||
|  |                     break; | ||
|  |                 if (!--attempts) { | ||
|  |                     /* if u1 was not found for attempts iterations,
 | ||
|  |                        use FASTSEARCH() or memchr() */ | ||
|  | #if STRINGLIB_SIZEOF_CHAR == 1
 | ||
|  |                     s++; | ||
|  |                     s = memchr(s, u1, end - s); | ||
|  |                     if (s == NULL) | ||
|  |                         return; | ||
|  | #else
 | ||
|  |                     Py_ssize_t i; | ||
|  |                     STRINGLIB_CHAR ch1 = (STRINGLIB_CHAR) u1; | ||
|  |                     s++; | ||
|  |                     i = FASTSEARCH(s, end - s, &ch1, 1, 0, FAST_SEARCH); | ||
|  |                     if (i < 0) | ||
|  |                         return; | ||
|  |                     s += i; | ||
|  | #endif
 | ||
|  |                     /* restart the dummy loop */ | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         *s = u2; | ||
|  |     } | ||
|  | } |