You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

423 lines
9.8 KiB

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