3939#define STRINGLIB_BLOOM (mask , ch ) \
4040 ((mask & (1UL << ((ch) & (STRINGLIB_BLOOM_WIDTH -1)))))
4141
42- #if STRINGLIB_SIZEOF_CHAR == 1
42+ #ifdef STRINGLIB_FAST_MEMCHR
4343# define MEMCHR_CUT_OFF 15
4444#else
4545# define MEMCHR_CUT_OFF 40
@@ -53,8 +53,8 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
5353 p = s ;
5454 e = s + n ;
5555 if (n > MEMCHR_CUT_OFF ) {
56- #if STRINGLIB_SIZEOF_CHAR == 1
57- p = memchr (s , ch , n );
56+ #ifdef STRINGLIB_FAST_MEMCHR
57+ p = STRINGLIB_FAST_MEMCHR (s , ch , n );
5858 if (p != NULL )
5959 return (p - s );
6060 return -1 ;
@@ -102,16 +102,26 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
102102 return -1 ;
103103}
104104
105+ #undef MEMCHR_CUT_OFF
106+
107+ #if STRINGLIB_SIZEOF_CHAR == 1
108+ # define MEMRCHR_CUT_OFF 15
109+ #else
110+ # define MEMRCHR_CUT_OFF 40
111+ #endif
112+
113+
105114Py_LOCAL_INLINE (Py_ssize_t )
106115STRINGLIB (rfind_char )(const STRINGLIB_CHAR * s , Py_ssize_t n , STRINGLIB_CHAR ch )
107116{
108117 const STRINGLIB_CHAR * p ;
109118#ifdef HAVE_MEMRCHR
110- /* memrchr() is a GNU extension, available since glibc 2.1.91.
111- it doesn't seem as optimized as memchr(), but is still quite
112- faster than our hand-written loop below */
119+ /* memrchr() is a GNU extension, available since glibc 2.1.91. it
120+ doesn't seem as optimized as memchr(), but is still quite
121+ faster than our hand-written loop below. There is no wmemrchr
122+ for 4-byte chars. */
113123
114- if (n > MEMCHR_CUT_OFF ) {
124+ if (n > MEMRCHR_CUT_OFF ) {
115125#if STRINGLIB_SIZEOF_CHAR == 1
116126 p = memrchr (s , ch , n );
117127 if (p != NULL )
@@ -139,19 +149,19 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
139149 if (* p == ch )
140150 return n ;
141151 /* False positive */
142- if (n1 - n > MEMCHR_CUT_OFF )
152+ if (n1 - n > MEMRCHR_CUT_OFF )
143153 continue ;
144- if (n <= MEMCHR_CUT_OFF )
154+ if (n <= MEMRCHR_CUT_OFF )
145155 break ;
146- s1 = p - MEMCHR_CUT_OFF ;
156+ s1 = p - MEMRCHR_CUT_OFF ;
147157 while (p > s1 ) {
148158 p -- ;
149159 if (* p == ch )
150160 return (p - s );
151161 }
152162 n = p - s ;
153163 }
154- while (n > MEMCHR_CUT_OFF );
164+ while (n > MEMRCHR_CUT_OFF );
155165 }
156166#endif
157167 }
@@ -165,7 +175,7 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
165175 return -1 ;
166176}
167177
168- #undef MEMCHR_CUT_OFF
178+ #undef MEMRCHR_CUT_OFF
169179
170180/* Change to a 1 to see logging comments walk through the algorithm. */
171181#if 0 && STRINGLIB_SIZEOF_CHAR == 1
0 commit comments