39
39
#define STRINGLIB_BLOOM (mask , ch ) \
40
40
((mask & (1UL << ((ch) & (STRINGLIB_BLOOM_WIDTH -1)))))
41
41
42
- #if STRINGLIB_SIZEOF_CHAR == 1
42
+ #ifdef STRINGLIB_FAST_MEMCHR
43
43
# define MEMCHR_CUT_OFF 15
44
44
#else
45
45
# define MEMCHR_CUT_OFF 40
@@ -53,8 +53,8 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
53
53
p = s ;
54
54
e = s + n ;
55
55
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 );
58
58
if (p != NULL )
59
59
return (p - s );
60
60
return -1 ;
@@ -102,16 +102,26 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
102
102
return -1 ;
103
103
}
104
104
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
+
105
114
Py_LOCAL_INLINE (Py_ssize_t )
106
115
STRINGLIB (rfind_char )(const STRINGLIB_CHAR * s , Py_ssize_t n , STRINGLIB_CHAR ch )
107
116
{
108
117
const STRINGLIB_CHAR * p ;
109
118
#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. */
113
123
114
- if (n > MEMCHR_CUT_OFF ) {
124
+ if (n > MEMRCHR_CUT_OFF ) {
115
125
#if STRINGLIB_SIZEOF_CHAR == 1
116
126
p = memrchr (s , ch , n );
117
127
if (p != NULL )
@@ -139,19 +149,19 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
139
149
if (* p == ch )
140
150
return n ;
141
151
/* False positive */
142
- if (n1 - n > MEMCHR_CUT_OFF )
152
+ if (n1 - n > MEMRCHR_CUT_OFF )
143
153
continue ;
144
- if (n <= MEMCHR_CUT_OFF )
154
+ if (n <= MEMRCHR_CUT_OFF )
145
155
break ;
146
- s1 = p - MEMCHR_CUT_OFF ;
156
+ s1 = p - MEMRCHR_CUT_OFF ;
147
157
while (p > s1 ) {
148
158
p -- ;
149
159
if (* p == ch )
150
160
return (p - s );
151
161
}
152
162
n = p - s ;
153
163
}
154
- while (n > MEMCHR_CUT_OFF );
164
+ while (n > MEMRCHR_CUT_OFF );
155
165
}
156
166
#endif
157
167
}
@@ -165,7 +175,7 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch)
165
175
return -1 ;
166
176
}
167
177
168
- #undef MEMCHR_CUT_OFF
178
+ #undef MEMRCHR_CUT_OFF
169
179
170
180
/* Change to a 1 to see logging comments walk through the algorithm. */
171
181
#if 0 && STRINGLIB_SIZEOF_CHAR == 1
0 commit comments