Line data Source code
1 : #include "Python.h"
2 : #include "bytes_methods.h"
3 :
4 : PyDoc_STRVAR_shared(_Py_isspace__doc__,
5 : "B.isspace() -> bool\n\
6 : \n\
7 : Return True if all characters in B are whitespace\n\
8 : and there is at least one character in B, False otherwise.");
9 :
10 : PyObject*
11 0 : _Py_bytes_isspace(const char *cptr, Py_ssize_t len)
12 : {
13 0 : register const unsigned char *p
14 : = (unsigned char *) cptr;
15 : register const unsigned char *e;
16 :
17 : /* Shortcut for single character strings */
18 0 : if (len == 1 && Py_ISSPACE(*p))
19 0 : Py_RETURN_TRUE;
20 :
21 : /* Special case for empty strings */
22 0 : if (len == 0)
23 0 : Py_RETURN_FALSE;
24 :
25 0 : e = p + len;
26 0 : for (; p < e; p++) {
27 0 : if (!Py_ISSPACE(*p))
28 0 : Py_RETURN_FALSE;
29 : }
30 0 : Py_RETURN_TRUE;
31 : }
32 :
33 :
34 : PyDoc_STRVAR_shared(_Py_isalpha__doc__,
35 : "B.isalpha() -> bool\n\
36 : \n\
37 : Return True if all characters in B are alphabetic\n\
38 : and there is at least one character in B, False otherwise.");
39 :
40 : PyObject*
41 0 : _Py_bytes_isalpha(const char *cptr, Py_ssize_t len)
42 : {
43 0 : register const unsigned char *p
44 : = (unsigned char *) cptr;
45 : register const unsigned char *e;
46 :
47 : /* Shortcut for single character strings */
48 0 : if (len == 1 && Py_ISALPHA(*p))
49 0 : Py_RETURN_TRUE;
50 :
51 : /* Special case for empty strings */
52 0 : if (len == 0)
53 0 : Py_RETURN_FALSE;
54 :
55 0 : e = p + len;
56 0 : for (; p < e; p++) {
57 0 : if (!Py_ISALPHA(*p))
58 0 : Py_RETURN_FALSE;
59 : }
60 0 : Py_RETURN_TRUE;
61 : }
62 :
63 :
64 : PyDoc_STRVAR_shared(_Py_isalnum__doc__,
65 : "B.isalnum() -> bool\n\
66 : \n\
67 : Return True if all characters in B are alphanumeric\n\
68 : and there is at least one character in B, False otherwise.");
69 :
70 : PyObject*
71 0 : _Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
72 : {
73 0 : register const unsigned char *p
74 : = (unsigned char *) cptr;
75 : register const unsigned char *e;
76 :
77 : /* Shortcut for single character strings */
78 0 : if (len == 1 && Py_ISALNUM(*p))
79 0 : Py_RETURN_TRUE;
80 :
81 : /* Special case for empty strings */
82 0 : if (len == 0)
83 0 : Py_RETURN_FALSE;
84 :
85 0 : e = p + len;
86 0 : for (; p < e; p++) {
87 0 : if (!Py_ISALNUM(*p))
88 0 : Py_RETURN_FALSE;
89 : }
90 0 : Py_RETURN_TRUE;
91 : }
92 :
93 :
94 : PyDoc_STRVAR_shared(_Py_isdigit__doc__,
95 : "B.isdigit() -> bool\n\
96 : \n\
97 : Return True if all characters in B are digits\n\
98 : and there is at least one character in B, False otherwise.");
99 :
100 : PyObject*
101 0 : _Py_bytes_isdigit(const char *cptr, Py_ssize_t len)
102 : {
103 0 : register const unsigned char *p
104 : = (unsigned char *) cptr;
105 : register const unsigned char *e;
106 :
107 : /* Shortcut for single character strings */
108 0 : if (len == 1 && Py_ISDIGIT(*p))
109 0 : Py_RETURN_TRUE;
110 :
111 : /* Special case for empty strings */
112 0 : if (len == 0)
113 0 : Py_RETURN_FALSE;
114 :
115 0 : e = p + len;
116 0 : for (; p < e; p++) {
117 0 : if (!Py_ISDIGIT(*p))
118 0 : Py_RETURN_FALSE;
119 : }
120 0 : Py_RETURN_TRUE;
121 : }
122 :
123 :
124 : PyDoc_STRVAR_shared(_Py_islower__doc__,
125 : "B.islower() -> bool\n\
126 : \n\
127 : Return True if all cased characters in B are lowercase and there is\n\
128 : at least one cased character in B, False otherwise.");
129 :
130 : PyObject*
131 0 : _Py_bytes_islower(const char *cptr, Py_ssize_t len)
132 : {
133 0 : register const unsigned char *p
134 : = (unsigned char *) cptr;
135 : register const unsigned char *e;
136 : int cased;
137 :
138 : /* Shortcut for single character strings */
139 0 : if (len == 1)
140 0 : return PyBool_FromLong(Py_ISLOWER(*p));
141 :
142 : /* Special case for empty strings */
143 0 : if (len == 0)
144 0 : Py_RETURN_FALSE;
145 :
146 0 : e = p + len;
147 0 : cased = 0;
148 0 : for (; p < e; p++) {
149 0 : if (Py_ISUPPER(*p))
150 0 : Py_RETURN_FALSE;
151 0 : else if (!cased && Py_ISLOWER(*p))
152 0 : cased = 1;
153 : }
154 0 : return PyBool_FromLong(cased);
155 : }
156 :
157 :
158 : PyDoc_STRVAR_shared(_Py_isupper__doc__,
159 : "B.isupper() -> bool\n\
160 : \n\
161 : Return True if all cased characters in B are uppercase and there is\n\
162 : at least one cased character in B, False otherwise.");
163 :
164 : PyObject*
165 0 : _Py_bytes_isupper(const char *cptr, Py_ssize_t len)
166 : {
167 0 : register const unsigned char *p
168 : = (unsigned char *) cptr;
169 : register const unsigned char *e;
170 : int cased;
171 :
172 : /* Shortcut for single character strings */
173 0 : if (len == 1)
174 0 : return PyBool_FromLong(Py_ISUPPER(*p));
175 :
176 : /* Special case for empty strings */
177 0 : if (len == 0)
178 0 : Py_RETURN_FALSE;
179 :
180 0 : e = p + len;
181 0 : cased = 0;
182 0 : for (; p < e; p++) {
183 0 : if (Py_ISLOWER(*p))
184 0 : Py_RETURN_FALSE;
185 0 : else if (!cased && Py_ISUPPER(*p))
186 0 : cased = 1;
187 : }
188 0 : return PyBool_FromLong(cased);
189 : }
190 :
191 :
192 : PyDoc_STRVAR_shared(_Py_istitle__doc__,
193 : "B.istitle() -> bool\n\
194 : \n\
195 : Return True if B is a titlecased string and there is at least one\n\
196 : character in B, i.e. uppercase characters may only follow uncased\n\
197 : characters and lowercase characters only cased ones. Return False\n\
198 : otherwise.");
199 :
200 : PyObject*
201 0 : _Py_bytes_istitle(const char *cptr, Py_ssize_t len)
202 : {
203 0 : register const unsigned char *p
204 : = (unsigned char *) cptr;
205 : register const unsigned char *e;
206 : int cased, previous_is_cased;
207 :
208 : /* Shortcut for single character strings */
209 0 : if (len == 1)
210 0 : return PyBool_FromLong(Py_ISUPPER(*p));
211 :
212 : /* Special case for empty strings */
213 0 : if (len == 0)
214 0 : Py_RETURN_FALSE;
215 :
216 0 : e = p + len;
217 0 : cased = 0;
218 0 : previous_is_cased = 0;
219 0 : for (; p < e; p++) {
220 0 : register const unsigned char ch = *p;
221 :
222 0 : if (Py_ISUPPER(ch)) {
223 0 : if (previous_is_cased)
224 0 : Py_RETURN_FALSE;
225 0 : previous_is_cased = 1;
226 0 : cased = 1;
227 : }
228 0 : else if (Py_ISLOWER(ch)) {
229 0 : if (!previous_is_cased)
230 0 : Py_RETURN_FALSE;
231 0 : previous_is_cased = 1;
232 0 : cased = 1;
233 : }
234 : else
235 0 : previous_is_cased = 0;
236 : }
237 0 : return PyBool_FromLong(cased);
238 : }
239 :
240 :
241 : PyDoc_STRVAR_shared(_Py_lower__doc__,
242 : "B.lower() -> copy of B\n\
243 : \n\
244 : Return a copy of B with all ASCII characters converted to lowercase.");
245 :
246 : void
247 0 : _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len)
248 : {
249 : Py_ssize_t i;
250 :
251 : /*
252 : newobj = PyString_FromStringAndSize(NULL, len);
253 : if (!newobj)
254 : return NULL;
255 :
256 : s = PyString_AS_STRING(newobj);
257 : */
258 :
259 0 : Py_MEMCPY(result, cptr, len);
260 :
261 0 : for (i = 0; i < len; i++) {
262 0 : int c = Py_CHARMASK(result[i]);
263 0 : if (Py_ISUPPER(c))
264 0 : result[i] = Py_TOLOWER(c);
265 : }
266 0 : }
267 :
268 :
269 : PyDoc_STRVAR_shared(_Py_upper__doc__,
270 : "B.upper() -> copy of B\n\
271 : \n\
272 : Return a copy of B with all ASCII characters converted to uppercase.");
273 :
274 : void
275 0 : _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len)
276 : {
277 : Py_ssize_t i;
278 :
279 : /*
280 : newobj = PyString_FromStringAndSize(NULL, len);
281 : if (!newobj)
282 : return NULL;
283 :
284 : s = PyString_AS_STRING(newobj);
285 : */
286 :
287 0 : Py_MEMCPY(result, cptr, len);
288 :
289 0 : for (i = 0; i < len; i++) {
290 0 : int c = Py_CHARMASK(result[i]);
291 0 : if (Py_ISLOWER(c))
292 0 : result[i] = Py_TOUPPER(c);
293 : }
294 0 : }
295 :
296 :
297 : PyDoc_STRVAR_shared(_Py_title__doc__,
298 : "B.title() -> copy of B\n\
299 : \n\
300 : Return a titlecased version of B, i.e. ASCII words start with uppercase\n\
301 : characters, all remaining cased characters have lowercase.");
302 :
303 : void
304 0 : _Py_bytes_title(char *result, char *s, Py_ssize_t len)
305 : {
306 : Py_ssize_t i;
307 0 : int previous_is_cased = 0;
308 :
309 : /*
310 : newobj = PyString_FromStringAndSize(NULL, len);
311 : if (newobj == NULL)
312 : return NULL;
313 : s_new = PyString_AsString(newobj);
314 : */
315 0 : for (i = 0; i < len; i++) {
316 0 : int c = Py_CHARMASK(*s++);
317 0 : if (Py_ISLOWER(c)) {
318 0 : if (!previous_is_cased)
319 0 : c = Py_TOUPPER(c);
320 0 : previous_is_cased = 1;
321 0 : } else if (Py_ISUPPER(c)) {
322 0 : if (previous_is_cased)
323 0 : c = Py_TOLOWER(c);
324 0 : previous_is_cased = 1;
325 : } else
326 0 : previous_is_cased = 0;
327 0 : *result++ = c;
328 : }
329 0 : }
330 :
331 :
332 : PyDoc_STRVAR_shared(_Py_capitalize__doc__,
333 : "B.capitalize() -> copy of B\n\
334 : \n\
335 : Return a copy of B with only its first character capitalized (ASCII)\n\
336 : and the rest lower-cased.");
337 :
338 : void
339 0 : _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len)
340 : {
341 : Py_ssize_t i;
342 :
343 : /*
344 : newobj = PyString_FromStringAndSize(NULL, len);
345 : if (newobj == NULL)
346 : return NULL;
347 : s_new = PyString_AsString(newobj);
348 : */
349 0 : if (0 < len) {
350 0 : int c = Py_CHARMASK(*s++);
351 0 : if (Py_ISLOWER(c))
352 0 : *result = Py_TOUPPER(c);
353 : else
354 0 : *result = c;
355 0 : result++;
356 : }
357 0 : for (i = 1; i < len; i++) {
358 0 : int c = Py_CHARMASK(*s++);
359 0 : if (Py_ISUPPER(c))
360 0 : *result = Py_TOLOWER(c);
361 : else
362 0 : *result = c;
363 0 : result++;
364 : }
365 0 : }
366 :
367 :
368 : PyDoc_STRVAR_shared(_Py_swapcase__doc__,
369 : "B.swapcase() -> copy of B\n\
370 : \n\
371 : Return a copy of B with uppercase ASCII characters converted\n\
372 : to lowercase ASCII and vice versa.");
373 :
374 : void
375 0 : _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len)
376 : {
377 : Py_ssize_t i;
378 :
379 : /*
380 : newobj = PyString_FromStringAndSize(NULL, len);
381 : if (newobj == NULL)
382 : return NULL;
383 : s_new = PyString_AsString(newobj);
384 : */
385 0 : for (i = 0; i < len; i++) {
386 0 : int c = Py_CHARMASK(*s++);
387 0 : if (Py_ISLOWER(c)) {
388 0 : *result = Py_TOUPPER(c);
389 : }
390 0 : else if (Py_ISUPPER(c)) {
391 0 : *result = Py_TOLOWER(c);
392 : }
393 : else
394 0 : *result = c;
395 0 : result++;
396 : }
397 0 : }
398 :
|