blob: 7233cea40957f18ffe96e48bd7da28d159d6e429 [file] [log] [blame]
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001#include "Python.h"
2#include "bytes_methods.h"
3
Gregory P. Smith60d241f2007-10-16 06:31:30 +00004PyDoc_STRVAR_shared(_Py_isspace__doc__,
5"B.isspace() -> bool\n\
6\n\
7Return True if all characters in B are whitespace\n\
8and there is at least one character in B, False otherwise.");
9
10PyObject*
11_Py_bytes_isspace(const char *cptr, Py_ssize_t len)
12{
13 register const unsigned char *p
14 = (unsigned char *) cptr;
15 register const unsigned char *e;
16
17 /* Shortcut for single character strings */
Eric Smith6dc46f52009-04-27 20:39:49 +000018 if (len == 1 && Py_ISSPACE(*p))
Gregory P. Smith60d241f2007-10-16 06:31:30 +000019 Py_RETURN_TRUE;
20
21 /* Special case for empty strings */
22 if (len == 0)
23 Py_RETURN_FALSE;
24
25 e = p + len;
26 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 if (!Py_ISSPACE(*p))
Gregory P. Smith60d241f2007-10-16 06:31:30 +000028 Py_RETURN_FALSE;
29 }
30 Py_RETURN_TRUE;
31}
32
33
34PyDoc_STRVAR_shared(_Py_isalpha__doc__,
35"B.isalpha() -> bool\n\
36\n\
37Return True if all characters in B are alphabetic\n\
38and there is at least one character in B, False otherwise.");
39
40PyObject*
41_Py_bytes_isalpha(const char *cptr, Py_ssize_t len)
42{
43 register const unsigned char *p
44 = (unsigned char *) cptr;
45 register const unsigned char *e;
46
47 /* Shortcut for single character strings */
Eric Smith6dc46f52009-04-27 20:39:49 +000048 if (len == 1 && Py_ISALPHA(*p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 Py_RETURN_TRUE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000050
51 /* Special case for empty strings */
52 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000054
55 e = p + len;
56 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 if (!Py_ISALPHA(*p))
58 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000059 }
60 Py_RETURN_TRUE;
61}
62
63
64PyDoc_STRVAR_shared(_Py_isalnum__doc__,
65"B.isalnum() -> bool\n\
66\n\
67Return True if all characters in B are alphanumeric\n\
68and there is at least one character in B, False otherwise.");
69
70PyObject*
71_Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
72{
73 register const unsigned char *p
74 = (unsigned char *) cptr;
75 register const unsigned char *e;
76
77 /* Shortcut for single character strings */
Eric Smith6dc46f52009-04-27 20:39:49 +000078 if (len == 1 && Py_ISALNUM(*p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 Py_RETURN_TRUE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000080
81 /* Special case for empty strings */
82 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000084
85 e = p + len;
86 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 if (!Py_ISALNUM(*p))
88 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +000089 }
90 Py_RETURN_TRUE;
91}
92
93
94PyDoc_STRVAR_shared(_Py_isdigit__doc__,
95"B.isdigit() -> bool\n\
96\n\
97Return True if all characters in B are digits\n\
98and there is at least one character in B, False otherwise.");
99
100PyObject*
101_Py_bytes_isdigit(const char *cptr, Py_ssize_t len)
102{
103 register const unsigned char *p
104 = (unsigned char *) cptr;
105 register const unsigned char *e;
106
107 /* Shortcut for single character strings */
Eric Smith6dc46f52009-04-27 20:39:49 +0000108 if (len == 1 && Py_ISDIGIT(*p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 Py_RETURN_TRUE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000110
111 /* Special case for empty strings */
112 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000114
115 e = p + len;
116 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 if (!Py_ISDIGIT(*p))
118 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000119 }
120 Py_RETURN_TRUE;
121}
122
123
124PyDoc_STRVAR_shared(_Py_islower__doc__,
125"B.islower() -> bool\n\
126\n\
127Return True if all cased characters in B are lowercase and there is\n\
128at least one cased character in B, False otherwise.");
129
130PyObject*
131_Py_bytes_islower(const char *cptr, Py_ssize_t len)
132{
133 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 if (len == 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 return PyBool_FromLong(Py_ISLOWER(*p));
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000141
142 /* Special case for empty strings */
143 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000145
146 e = p + len;
147 cased = 0;
148 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 if (Py_ISUPPER(*p))
150 Py_RETURN_FALSE;
151 else if (!cased && Py_ISLOWER(*p))
152 cased = 1;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000153 }
154 return PyBool_FromLong(cased);
155}
156
157
158PyDoc_STRVAR_shared(_Py_isupper__doc__,
159"B.isupper() -> bool\n\
160\n\
161Return True if all cased characters in B are uppercase and there is\n\
162at least one cased character in B, False otherwise.");
163
164PyObject*
165_Py_bytes_isupper(const char *cptr, Py_ssize_t len)
166{
167 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 if (len == 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 return PyBool_FromLong(Py_ISUPPER(*p));
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000175
176 /* Special case for empty strings */
177 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000179
180 e = p + len;
181 cased = 0;
182 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (Py_ISLOWER(*p))
184 Py_RETURN_FALSE;
185 else if (!cased && Py_ISUPPER(*p))
186 cased = 1;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000187 }
188 return PyBool_FromLong(cased);
189}
190
191
192PyDoc_STRVAR_shared(_Py_istitle__doc__,
193"B.istitle() -> bool\n\
194\n\
195Return True if B is a titlecased string and there is at least one\n\
196character in B, i.e. uppercase characters may only follow uncased\n\
197characters and lowercase characters only cased ones. Return False\n\
198otherwise.");
199
200PyObject*
201_Py_bytes_istitle(const char *cptr, Py_ssize_t len)
202{
203 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 if (len == 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 return PyBool_FromLong(Py_ISUPPER(*p));
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000211
212 /* Special case for empty strings */
213 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 Py_RETURN_FALSE;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000215
216 e = p + len;
217 cased = 0;
218 previous_is_cased = 0;
219 for (; p < e; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 register const unsigned char ch = *p;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 if (Py_ISUPPER(ch)) {
223 if (previous_is_cased)
224 Py_RETURN_FALSE;
225 previous_is_cased = 1;
226 cased = 1;
227 }
228 else if (Py_ISLOWER(ch)) {
229 if (!previous_is_cased)
230 Py_RETURN_FALSE;
231 previous_is_cased = 1;
232 cased = 1;
233 }
234 else
235 previous_is_cased = 0;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000236 }
237 return PyBool_FromLong(cased);
238}
239
240
241PyDoc_STRVAR_shared(_Py_lower__doc__,
242"B.lower() -> copy of B\n\
243\n\
244Return a copy of B with all ASCII characters converted to lowercase.");
245
246void
247_Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len)
248{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000249 Py_ssize_t i;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000250
Antoine Pitrou9b491922010-08-15 17:38:46 +0000251 Py_MEMCPY(result, cptr, len);
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000252
Antoine Pitrou9b491922010-08-15 17:38:46 +0000253 for (i = 0; i < len; i++) {
254 int c = Py_CHARMASK(result[i]);
255 if (Py_ISUPPER(c))
256 result[i] = Py_TOLOWER(c);
257 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000258}
259
260
261PyDoc_STRVAR_shared(_Py_upper__doc__,
262"B.upper() -> copy of B\n\
263\n\
264Return a copy of B with all ASCII characters converted to uppercase.");
265
266void
267_Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len)
268{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000269 Py_ssize_t i;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000270
Antoine Pitrou9b491922010-08-15 17:38:46 +0000271 Py_MEMCPY(result, cptr, len);
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000272
Antoine Pitrou9b491922010-08-15 17:38:46 +0000273 for (i = 0; i < len; i++) {
274 int c = Py_CHARMASK(result[i]);
275 if (Py_ISLOWER(c))
276 result[i] = Py_TOUPPER(c);
277 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000278}
279
280
281PyDoc_STRVAR_shared(_Py_title__doc__,
282"B.title() -> copy of B\n\
283\n\
284Return a titlecased version of B, i.e. ASCII words start with uppercase\n\
285characters, all remaining cased characters have lowercase.");
286
287void
288_Py_bytes_title(char *result, char *s, Py_ssize_t len)
289{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000290 Py_ssize_t i;
291 int previous_is_cased = 0;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000292
Antoine Pitrou9b491922010-08-15 17:38:46 +0000293 for (i = 0; i < len; i++) {
294 int c = Py_CHARMASK(*s++);
295 if (Py_ISLOWER(c)) {
296 if (!previous_is_cased)
297 c = Py_TOUPPER(c);
298 previous_is_cased = 1;
299 } else if (Py_ISUPPER(c)) {
300 if (previous_is_cased)
301 c = Py_TOLOWER(c);
302 previous_is_cased = 1;
303 } else
304 previous_is_cased = 0;
305 *result++ = c;
306 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000307}
308
309
310PyDoc_STRVAR_shared(_Py_capitalize__doc__,
311"B.capitalize() -> copy of B\n\
312\n\
Senthil Kumarane51ee8a2010-07-05 12:00:56 +0000313Return a copy of B with only its first character capitalized (ASCII)\n\
314and the rest lower-cased.");
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000315
316void
317_Py_bytes_capitalize(char *result, char *s, Py_ssize_t len)
318{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000319 Py_ssize_t i;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000320
Antoine Pitrou9b491922010-08-15 17:38:46 +0000321 if (0 < len) {
322 int c = Py_CHARMASK(*s++);
323 if (Py_ISLOWER(c))
324 *result = Py_TOUPPER(c);
325 else
326 *result = c;
327 result++;
328 }
329 for (i = 1; i < len; i++) {
330 int c = Py_CHARMASK(*s++);
331 if (Py_ISUPPER(c))
332 *result = Py_TOLOWER(c);
333 else
334 *result = c;
335 result++;
336 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000337}
338
339
340PyDoc_STRVAR_shared(_Py_swapcase__doc__,
341"B.swapcase() -> copy of B\n\
342\n\
343Return a copy of B with uppercase ASCII characters converted\n\
344to lowercase ASCII and vice versa.");
345
346void
347_Py_bytes_swapcase(char *result, char *s, Py_ssize_t len)
348{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000349 Py_ssize_t i;
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000350
Antoine Pitrou9b491922010-08-15 17:38:46 +0000351 for (i = 0; i < len; i++) {
352 int c = Py_CHARMASK(*s++);
353 if (Py_ISLOWER(c)) {
354 *result = Py_TOUPPER(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 }
Antoine Pitrou9b491922010-08-15 17:38:46 +0000356 else if (Py_ISUPPER(c)) {
357 *result = Py_TOLOWER(c);
358 }
359 else
360 *result = c;
361 result++;
362 }
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000363}
364
Georg Brandlabc38772009-04-12 15:51:51 +0000365
366PyDoc_STRVAR_shared(_Py_maketrans__doc__,
367"B.maketrans(frm, to) -> translation table\n\
368\n\
Senthil Kumaran84e3ccc2011-06-27 09:06:45 -0700369Return a translation table (a bytes object of length 256) suitable\n\
370for use in the bytes or bytearray translate method where each byte\n\
371in frm is mapped to the byte at the same position in to.\n\
372The bytes objects frm and to must be of the same length.");
Georg Brandlabc38772009-04-12 15:51:51 +0000373
374static Py_ssize_t
375_getbuffer(PyObject *obj, Py_buffer *view)
376{
377 PyBufferProcs *buffer = Py_TYPE(obj)->tp_as_buffer;
378
379 if (buffer == NULL || buffer->bf_getbuffer == NULL)
380 {
381 PyErr_Format(PyExc_TypeError,
382 "Type %.100s doesn't support the buffer API",
383 Py_TYPE(obj)->tp_name);
384 return -1;
385 }
386
387 if (buffer->bf_getbuffer(obj, view, PyBUF_SIMPLE) < 0)
Antoine Pitrou9b491922010-08-15 17:38:46 +0000388 return -1;
Georg Brandlabc38772009-04-12 15:51:51 +0000389 return view->len;
390}
391
392PyObject *
393_Py_bytes_maketrans(PyObject *args)
394{
Antoine Pitrou9b491922010-08-15 17:38:46 +0000395 PyObject *frm, *to, *res = NULL;
396 Py_buffer bfrm, bto;
397 Py_ssize_t i;
398 char *p;
Georg Brandlabc38772009-04-12 15:51:51 +0000399
Antoine Pitrou9b491922010-08-15 17:38:46 +0000400 bfrm.len = -1;
401 bto.len = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402
Antoine Pitrou9b491922010-08-15 17:38:46 +0000403 if (!PyArg_ParseTuple(args, "OO:maketrans", &frm, &to))
404 return NULL;
405 if (_getbuffer(frm, &bfrm) < 0)
406 return NULL;
407 if (_getbuffer(to, &bto) < 0)
408 goto done;
409 if (bfrm.len != bto.len) {
410 PyErr_Format(PyExc_ValueError,
411 "maketrans arguments must have same length");
412 goto done;
413 }
414 res = PyBytes_FromStringAndSize(NULL, 256);
415 if (!res) {
416 goto done;
417 }
418 p = PyBytes_AS_STRING(res);
419 for (i = 0; i < 256; i++)
Antoine Pitrou47019e52010-08-15 17:41:31 +0000420 p[i] = (char) i;
Antoine Pitrou9b491922010-08-15 17:38:46 +0000421 for (i = 0; i < bfrm.len; i++) {
422 p[((unsigned char *)bfrm.buf)[i]] = ((char *)bto.buf)[i];
423 }
Georg Brandlabc38772009-04-12 15:51:51 +0000424
Antoine Pitrou9b491922010-08-15 17:38:46 +0000425done:
426 if (bfrm.len != -1)
427 PyBuffer_Release(&bfrm);
428 if (bto.len != -1)
429 PyBuffer_Release(&bto);
430 return res;
Georg Brandlabc38772009-04-12 15:51:51 +0000431}