14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String (str/bytes) object implementation */ 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SSIZE_T_CLEAN 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <ctype.h> 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stddef.h> 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_ssize_t null_strings, one_strings; 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStringObject *characters[UCHAR_MAX + 1]; 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStringObject *nullstring; 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This dictionary holds all interned strings. Note that references to 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strings in this dictionary are *not* counted in the string's ob_refcnt. 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm When the interned string reaches a refcnt of 0 the string deallocation 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function will delete the reference from this dictionary. 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Another way to look at this is that to say that the actual reference 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count of a string is: s->ob_refcnt + (s->ob_sstate?2:0) 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *interned; 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PyStringObject_SIZE gives the basic size of a string; any memory allocation 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for a string of length n should request PyStringObject_SIZE + n bytes. 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Using PyStringObject_SIZE instead of sizeof(PyStringObject) saves 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3 bytes per string allocation on a typical system. 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PyStringObject_SIZE (offsetof(PyStringObject, ob_sval) + 1) 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For PyString_FromString(), the parameter `str' points to a null-terminated 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string containing exactly `size' bytes. 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For PyString_FromStringAndSize(), the parameter the parameter `str' is 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm either NULL or else points to a string containing at least `size' bytes. 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For PyString_FromStringAndSize(), the string in the `str' parameter does 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm not have to be null-terminated. (Therefore it is safe to construct a 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm substring by calling `PyString_FromStringAndSize(origstring, substrlen)'.) 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If `str' is NULL then PyString_FromStringAndSize() will allocate `size+1' 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bytes (setting the last byte to the null terminating character) and you can 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill in the data yourself. If `str' is non-NULL then the resulting 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString object must be treated as immutable and you must not fill in nor 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm alter the data yourself, since the strings may be shared. 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The PyObject member `op->ob_size', which denotes the number of "extra 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items" in a variable-size object, will contain the number of bytes 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm allocated for string data, not counting the null terminating character. 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm It is therefore equal to the `size' parameter (for 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize()) or the length of the string in the `str' 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm parameter (for PyString_FromString()). 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromStringAndSize(const char *str, Py_ssize_t size) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *op; 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size < 0) { 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_SystemError, 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Negative size passed to PyString_FromStringAndSize"); 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0 && (op = nullstring) != NULL) { 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm null_strings++; 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)op; 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 1 && str != NULL && 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (op = characters[*str & UCHAR_MAX]) != NULL) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm one_strings++; 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)op; 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) { 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "string is too large"); 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Inline PyObject_NewVar */ 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size); 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == NULL) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_INIT_VAR(op, &PyString_Type, size); 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_shash = -1; 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sstate = SSTATE_NOT_INTERNED; 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str != NULL) 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval, str, size); 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sval[size] = '\0'; 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* share short strings */ 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0) { 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *t = (PyObject *)op; 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&t); 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)t; 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nullstring = op; 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (size == 1 && str != NULL) { 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *t = (PyObject *)op; 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&t); 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)t; 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm characters[*str & UCHAR_MAX] = op; 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) op; 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromString(const char *str) 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register size_t size; 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *op; 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(str != NULL); 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = strlen(str); 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) { 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "string is too long for a Python string"); 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0 && (op = nullstring) != NULL) { 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm null_strings++; 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)op; 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm one_strings++; 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)op; 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Inline PyObject_NewVar */ 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size); 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == NULL) 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_INIT_VAR(op, &PyString_Type, size); 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_shash = -1; 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sstate = SSTATE_NOT_INTERNED; 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval, str, size+1); 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* share short strings */ 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == 0) { 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *t = (PyObject *)op; 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&t); 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)t; 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nullstring = op; 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (size == 1) { 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *t = (PyObject *)op; 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&t); 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)t; 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm characters[*str & UCHAR_MAX] = op; 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(op); 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) op; 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromFormatV(const char *format, va_list vargs) 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_list count; 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n = 0; 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* f; 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* string; 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef VA_LIST_IS_ARRAY 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(count, vargs, sizeof(va_list)); 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __va_copy 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __va_copy(count, vargs); 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = vargs; 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* step 1: figure out how large a buffer we need */ 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (f = format; *f; f++) { 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*f == '%') { 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int longlongflag = 0; 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* p = f; 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (*++f && *f != '%' && !isalpha(Py_CHARMASK(*f))) 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ; 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * they don't affect the amount of space we reserve. 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*f == 'l') { 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (f[1] == 'd' || f[1] == 'u') { 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++f; 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (f[1] == 'l' && 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (f[2] == 'd' || f[2] == 'u')) { 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm longlongflag = 1; 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f += 2; 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) { 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++f; 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (*f) { 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'c': 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void)va_arg(count, int); 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* fall through... */ 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '%': 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n++; 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'd': case 'u': case 'i': case 'x': 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void) va_arg(count, int); 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Need at most 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ceil(log10(256)*SIZEOF_LONG_LONG) digits, 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm plus 1 for the sign. 53/22 is an upper 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bound for log10(256). */ 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (longlongflag) 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += 2 + (SIZEOF_LONG_LONG*53-1) / 22; 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* 20 bytes is enough to hold a 64-bit 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm integer. Decimal takes the most 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm space. This isn't enough for 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm octal. */ 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += 20; 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 's': 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = va_arg(count, char*); 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += strlen(s); 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'p': 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void) va_arg(count, int); 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* maximum 64-bit pointer representation: 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 0xffffffffffffffff 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * so 19 characters is enough. 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX I count 18 -- what's the extra for? 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += 19; 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* if we stumble upon an unknown 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm formatting code, copy the rest of 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the format string to the output 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string. (we cannot just skip the 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm code, since there's no way to know 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm what's in the argument list) */ 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n += strlen(p); 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto expand; 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n++; 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expand: 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* step 2: fill the buffer */ 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Since we've analyzed how much space we need for the worst case, 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm use sprintf directly instead of the slower PyOS_snprintf. */ 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string = PyString_FromStringAndSize(NULL, n); 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!string) 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = PyString_AsString(string); 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (f = format; *f; f++) { 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*f == '%') { 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* p = f++; 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int longflag = 0; 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int longlongflag = 0; 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int size_tflag = 0; 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* parse the width.precision part (we're only 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interested in the precision value, if any) */ 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 0; 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (isdigit(Py_CHARMASK(*f))) 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = (n*10) + *f++ - '0'; 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*f == '.') { 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f++; 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 0; 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (isdigit(Py_CHARMASK(*f))) 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = (n*10) + *f++ - '0'; 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (*f && *f != '%' && !isalpha(Py_CHARMASK(*f))) 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f++; 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Handle %ld, %lu, %lld and %llu. */ 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*f == 'l') { 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (f[1] == 'd' || f[1] == 'u') { 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm longflag = 1; 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++f; 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (f[1] == 'l' && 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (f[2] == 'd' || f[2] == 'u')) { 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm longlongflag = 1; 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f += 2; 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* handle the size_t flag. */ 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) { 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_tflag = 1; 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++f; 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (*f) { 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'c': 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = va_arg(vargs, int); 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'd': 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (longflag) 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%ld", va_arg(vargs, long)); 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (longlongflag) 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%" PY_FORMAT_LONG_LONG "d", 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, PY_LONG_LONG)); 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (size_tflag) 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%" PY_FORMAT_SIZE_T "d", 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, Py_ssize_t)); 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%d", va_arg(vargs, int)); 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (longflag) 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%lu", 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, unsigned long)); 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (longlongflag) 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%" PY_FORMAT_LONG_LONG "u", 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, PY_LONG_LONG)); 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (size_tflag) 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%" PY_FORMAT_SIZE_T "u", 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, size_t)); 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%u", 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_arg(vargs, unsigned int)); 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'i': 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%i", va_arg(vargs, int)); 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'x': 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%x", va_arg(vargs, int)); 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 's': 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = va_arg(vargs, char*); 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = strlen(p); 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > 0 && i > n) 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = n; 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(s, p, i); 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += i; 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'p': 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(s, "%p", va_arg(vargs, void*)); 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* %p is ill-defined: ensure leading 0x. */ 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s[1] == 'X') 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = 'x'; 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (s[1] != 'x') { 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memmove(s+2, s, strlen(s)+1); 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[0] = '0'; 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[1] = 'x'; 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '%': 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = '%'; 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(s, p); 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s += strlen(s); 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto end; 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s++ = *f; 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end: 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&string, s - PyString_AS_STRING(string))) 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return string; 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_FromFormat(const char *format, ...) 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* ret; 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_list vargs; 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_STDARG_PROTOTYPES 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_start(vargs, format); 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_start(vargs); 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = PyString_FromFormatV(format, vargs); 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_end(vargs); 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret; 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_Decode(const char *s, 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size, 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v, *str; 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyString_FromStringAndSize(s, size); 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str == NULL) 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsDecodedString(str, encoding, errors); 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(str); 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsDecodedObject(PyObject *str, 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(str)) { 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadArgument(); 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (encoding == NULL) { 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encoding = PyUnicode_GetDefaultEncoding(); 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, "no encoding specified"); 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Decode via the codec registry */ 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyCodec_Decode(str, encoding, errors); 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsDecodedString(PyObject *str, 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsDecodedObject(str, encoding, errors); 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Convert Unicode to a string using the default encoding */ 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(v)) { 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = v; 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyUnicode_AsEncodedString(v, NULL, NULL); 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v)) { 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "decoder did not return a string object (type=%.400s)", 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(v)->tp_name); 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_Encode(const char *s, 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size, 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v, *str; 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyString_FromStringAndSize(s, size); 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str == NULL) 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsEncodedString(str, encoding, errors); 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(str); 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsEncodedObject(PyObject *str, 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(str)) { 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadArgument(); 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (encoding == NULL) { 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm encoding = PyUnicode_GetDefaultEncoding(); 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, "no encoding specified"); 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Encode via the codec registry */ 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyCodec_Encode(str, encoding, errors); 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_AsEncodedString(PyObject *str, 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *encoding, 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors) 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsEncodedObject(str, encoding, errors); 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Convert Unicode to a string using the default encoding */ 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(v)) { 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = v; 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyUnicode_AsEncodedString(v, NULL, NULL); 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v)) { 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "encoder did not return a string object (type=%.400s)", 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(v)->tp_name); 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_dealloc(PyObject *op) 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (PyString_CHECK_INTERNED(op)) { 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_NOT_INTERNED: 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_INTERNED_MORTAL: 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* revive dead object temporarily for DelItem */ 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_REFCNT(op) = 3; 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_DelItem(interned, op) != 0) 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError( 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "deletion of interned string failed"); 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_INTERNED_IMMORTAL: 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Immortal interned string died."); 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Inconsistent interned string state."); 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(op)->tp_free(op); 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Unescape a backslash-escaped string. If unicode is non-zero, 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the string is a u-literal. If recode_encoding is non-zero, 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the string is UTF-8 encoded and should be re-encoded in the 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm specified encoding. */ 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *PyString_DecodeEscape(const char *s, 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len, 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *errors, 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t unicode, 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *recode_encoding) 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c; 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p, *buf; 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *end; 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t newlen = recode_encoding ? 4*len:len; 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromStringAndSize((char *)NULL, newlen); 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = buf = PyString_AsString(v); 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = s + len; 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (s < end) { 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*s != '\\') { 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm non_esc: 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (recode_encoding && (*s & 0x80)) { 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *u, *w; 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *r; 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* t; 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t rn; 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = s; 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Decode non-ASCII bytes as UTF-8. */ 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (t < end && (*t & 0x80)) t++; 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = PyUnicode_DecodeUTF8(s, t - s, errors); 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(!u) goto failed; 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Recode them in target encoding. */ 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = PyUnicode_AsEncodedString( 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u, recode_encoding, errors); 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(u); 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!w) goto failed; 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Append bytes to output buffer. */ 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyString_Check(w)); 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r = PyString_AS_STRING(w); 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rn = PyString_GET_SIZE(w); 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(p, r, rn); 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p += rn; 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(w); 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = t; 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = *s++; 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = *s++; 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s++; 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s==end) { 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Trailing \\ in string"); 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto failed; 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (*s++) { 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX This assumes ASCII! */ 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '\n': break; 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '\\': *p++ = '\\'; break; 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '\'': *p++ = '\''; break; 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '\"': *p++ = '\"'; break; 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'b': *p++ = '\b'; break; 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'f': *p++ = '\014'; break; /* FF */ 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 't': *p++ = '\t'; break; 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'n': *p++ = '\n'; break; 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'r': *p++ = '\r'; break; 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'v': *p++ = '\013'; break; /* VT */ 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'a': *p++ = '\007'; break; /* BEL, not classic C */ 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '0': case '1': case '2': case '3': 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '4': case '5': case '6': case '7': 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = s[-1] - '0'; 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s < end && '0' <= *s && *s <= '7') { 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (c<<3) + *s++ - '0'; 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s < end && '0' <= *s && *s <= '7') 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (c<<3) + *s++ - '0'; 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = c; 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'x': 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s+1 < end && 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isxdigit(Py_CHARMASK(s[0])) && 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isxdigit(Py_CHARMASK(s[1]))) 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned int x = 0; 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*s); 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s++; 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isdigit(c)) 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = c - '0'; 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (islower(c)) 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 10 + c - 'a'; 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 10 + c - 'A'; 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = x << 4; 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*s); 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s++; 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isdigit(c)) 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x += c - '0'; 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (islower(c)) 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x += 10 + c - 'a'; 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x += 10 + c - 'A'; 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = x; 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!errors || strcmp(errors, "strict") == 0) { 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "invalid \\x escape"); 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto failed; 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (strcmp(errors, "replace") == 0) { 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '?'; 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (strcmp(errors, "ignore") == 0) 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* do nothing */; 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "decoding error; " 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "unknown error handling code: %.400s", 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errors); 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto failed; 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_USING_UNICODE 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'U': 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'N': 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (unicode) { 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Unicode escapes not legal " 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "when Unicode disabled"); 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto failed; 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\'; 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s--; 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto non_esc; /* an arbitrary number of unescaped 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm UTF-8 bytes may follow. */ 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p-buf < newlen && _PyString_Resize(&v, p - buf)) 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto failed; 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm failed: 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* -------------------------------------------------------------------- */ 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* object api */ 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getsize(register PyObject *op) 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len; 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_AsStringAndSize(op, &s, &len)) 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return len; 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic /*const*/ char * 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getbuffer(register PyObject *op) 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len; 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_AsStringAndSize(op, &s, &len)) 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return s; 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_ssize_t 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Size(register PyObject *op) 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(op)) 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return string_getsize(op); 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_SIZE(op); 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*const*/ char * 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_AsString(register PyObject *op) 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(op)) 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return string_getbuffer(op); 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ((PyStringObject *)op) -> ob_sval; 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_AsStringAndSize(register PyObject *obj, 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register char **s, 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t *len) 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) { 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadInternalCall(); 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(obj)) { 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(obj)) { 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = _PyUnicode_AsDefaultEncodedString(obj, NULL); 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (obj == NULL) 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "expected string or Unicode object, " 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%.200s found", Py_TYPE(obj)->tp_name); 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s = PyString_AS_STRING(obj); 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len != NULL) 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *len = PyString_GET_SIZE(obj); 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (strlen(*s) != (size_t)PyString_GET_SIZE(obj)) { 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "expected string without null bytes"); 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* -------------------------------------------------------------------- */ 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Methods */ 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/stringdefs.h" 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/fastsearch.h" 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/count.h" 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/find.h" 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/partition.h" 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/split.h" 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_InsertThousandsGrouping _PyString_InsertThousandsGrouping 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/localeutil.h" 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_print(PyStringObject *op, FILE *fp, int flags) 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, str_len; 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char c; 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int quote; 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX Ought to check for interrupts when writing long strings */ 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! PyString_CheckExact(op)) { 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int ret; 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* A str subclass may have its own __str__ method. */ 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *) PyObject_Str((PyObject *)op); 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == NULL) 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = string_print(op, fp, flags); 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(op); 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret; 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags & Py_PRINT_RAW) { 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *data = op->ob_sval; 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t size = Py_SIZE(op); 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BEGIN_ALLOW_THREADS 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (size > INT_MAX) { 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Very long strings cannot be written atomically. 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * But don't write exactly INT_MAX bytes at a time 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * to avoid memory aligment issues. 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const int chunk_size = INT_MAX & ~0x3FFF; 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fwrite(data, 1, chunk_size, fp); 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data += chunk_size; 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size -= chunk_size; 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size) fwrite(data, (int)size, 1, fp); 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fwrite(data, 1, (int)size, fp); 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_END_ALLOW_THREADS 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* figure out which quote to use; single is preferred */ 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm quote = '\''; 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (memchr(op->ob_sval, '\'', Py_SIZE(op)) && 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !memchr(op->ob_sval, '"', Py_SIZE(op))) 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm quote = '"'; 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str_len = Py_SIZE(op); 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BEGIN_ALLOW_THREADS 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fputc(quote, fp); 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < str_len; i++) { 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Since strings are immutable and the caller should have a 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reference, accessing the interal buffer should not be an issue 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with the GIL released. */ 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = op->ob_sval[i]; 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == quote || c == '\\') 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(fp, "\\%c", c); 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\t') 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(fp, "\\t"); 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\n') 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(fp, "\\n"); 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\r') 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(fp, "\\r"); 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c < ' ' || c >= 0x7f) 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(fp, "\\x%02x", c & 0xff); 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fputc(c, fp); 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fputc(quote, fp); 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_END_ALLOW_THREADS 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Repr(PyObject *obj, int smartquotes) 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject* op = (PyStringObject*) obj; 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t newsize = 2 + 4 * Py_SIZE(op); 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newsize > PY_SSIZE_T_MAX || newsize / 4 != Py_SIZE(op)) { 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "string is too large to make repr"); 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromStringAndSize((char *)NULL, newsize); 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t i; 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register char c; 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register char *p; 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int quote; 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* figure out which quote to use; single is preferred */ 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm quote = '\''; 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (smartquotes && 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memchr(op->ob_sval, '\'', Py_SIZE(op)) && 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !memchr(op->ob_sval, '"', Py_SIZE(op))) 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm quote = '"'; 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyString_AS_STRING(v); 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = quote; 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < Py_SIZE(op); i++) { 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* There's at least enough room for a hex escape 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and a closing quote. */ 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(newsize - (p - PyString_AS_STRING(v)) >= 5); 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = op->ob_sval[i]; 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == quote || c == '\\') 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\', *p++ = c; 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\t') 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\', *p++ = 't'; 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\n') 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\', *p++ = 'n'; 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c == '\r') 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = '\\', *p++ = 'r'; 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c < ' ' || c >= 0x7f) { 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* For performance, we don't want to call 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf here (extra layers of 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function call). */ 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(p, "\\x%02x", c & 0xff); 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p += 4; 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = c; 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(newsize - (p - PyString_AS_STRING(v)) >= 1); 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p++ = quote; 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p = '\0'; 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&v, (p - PyString_AS_STRING(v)))) 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_repr(PyObject *op) 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_Repr(op, 1); 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_str(PyObject *s) 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyString_Check(s)); 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CheckExact(s)) { 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(s); 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return s; 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Subtype -- return genuine string with the same value. */ 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *t = (PyStringObject *) s; 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize(t->ob_sval, Py_SIZE(t)); 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_length(PyStringObject *a) 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_SIZE(a); 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_concat(register PyStringObject *a, register PyObject *bb) 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t size; 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *op; 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(bb)) { 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(bb)) 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Concat((PyObject *)a, bb); 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyByteArray_Check(bb)) 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyByteArray_Concat((PyObject *)a, bb); 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cannot concatenate 'str' and '%.200s' objects", 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(bb)->tp_name); 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define b ((PyStringObject *)bb) 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Optimize cases with empty left or right operand */ 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((Py_SIZE(a) == 0 || Py_SIZE(b) == 0) && 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_CheckExact(a) && PyString_CheckExact(b)) { 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_SIZE(a) == 0) { 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(bb); 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return bb; 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(a); 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)a; 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = Py_SIZE(a) + Py_SIZE(b); 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check that string sizes are not negative, to prevent an 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm overflow in cases where we are passed incorrectly-created 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strings with negative lengths (due to a bug in other code). 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_SIZE(a) < 0 || Py_SIZE(b) < 0 || 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) { 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "strings are too large to concat"); 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Inline PyObject_NewVar */ 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size > PY_SSIZE_T_MAX - PyStringObject_SIZE) { 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "strings are too large to concat"); 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size); 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == NULL) 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_INIT_VAR(op, &PyString_Type, size); 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_shash = -1; 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sstate = SSTATE_NOT_INTERNED; 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a)); 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval + Py_SIZE(a), b->ob_sval, Py_SIZE(b)); 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sval[size] = '\0'; 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) op; 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef b 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_repeat(register PyStringObject *a, register Py_ssize_t n) 10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t i; 10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t j; 10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t size; 10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *op; 10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t nbytes; 10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n < 0) 10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 0; 10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* watch out for overflows: the size can overflow int, 10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * and the # of bytes needed can overflow size_t 10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = Py_SIZE(a) * n; 10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n && size / n != Py_SIZE(a)) { 10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "repeated string is too long"); 10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (size == Py_SIZE(a) && PyString_CheckExact(a)) { 10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(a); 10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)a; 10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nbytes = (size_t)size; 10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nbytes + PyStringObject_SIZE <= nbytes) { 10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "repeated string is too long"); 10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + nbytes); 10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == NULL) 11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_INIT_VAR(op, &PyString_Type, size); 11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_shash = -1; 11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sstate = SSTATE_NOT_INTERNED; 11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm op->ob_sval[size] = '\0'; 11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_SIZE(a) == 1 && n > 0) { 11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memset(op->ob_sval, a->ob_sval[0] , n); 11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) op; 11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < size) { 11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a)); 11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = Py_SIZE(a); 11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (i < size) { 11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = (i <= size-i) ? i : size-i; 11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(op->ob_sval+i, op->ob_sval, j); 11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i += j; 11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *) op; 11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String slice a[i:j] consists of characters a[i] ... a[j-1] */ 11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_slice(register PyStringObject *a, register Py_ssize_t i, 11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t j) 11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* j -- may be negative! */ 11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (j < 0) 11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = 0; /* Avoid signed/unsigned bug in next line */ 11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (j > Py_SIZE(a)) 11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = Py_SIZE(a); 11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == 0 && j == Py_SIZE(a) && PyString_CheckExact(a)) { 11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* It's the same as a */ 11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(a); 11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)a; 11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (j < i) 11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = i; 11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize(a->ob_sval + i, j-i); 11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_contains(PyObject *str_obj, PyObject *sub_obj) 11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_CheckExact(sub_obj)) { 11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(sub_obj)) 11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Contains(str_obj, sub_obj); 11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(sub_obj)) { 11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "'in <string>' requires string as left operand, " 11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not %.200s", Py_TYPE(sub_obj)->tp_name); 11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_contains_obj(str_obj, sub_obj); 11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_item(PyStringObject *a, register Py_ssize_t i) 11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char pchar; 11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0 || i >= Py_SIZE(a)) { 11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_IndexError, "string index out of range"); 11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pchar = a->ob_sval[i]; 11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = (PyObject *)characters[pchar & UCHAR_MAX]; 11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromStringAndSize(&pchar, 1); 11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm one_strings++; 11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v); 11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_richcompare(PyStringObject *a, PyStringObject *b, int op) 11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c; 11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len_a, len_b; 11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t min_len; 11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Make sure both arguments are strings. */ 11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(PyString_Check(a) && PyString_Check(b))) { 11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_NotImplemented; 11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto out; 11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (a == b) { 12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (op) { 12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_EQ:case Py_LE:case Py_GE: 12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_True; 12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto out; 12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_NE:case Py_LT:case Py_GT: 12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_False; 12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto out; 12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (op == Py_EQ) { 12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Supporting Py_NE here as well does not save 12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm much time, since Py_NE is rarely used. */ 12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_SIZE(a) == Py_SIZE(b) 12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm && (a->ob_sval[0] == b->ob_sval[0] 12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0)) { 12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_True; 12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_False; 12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto out; 12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len_a = Py_SIZE(a); len_b = Py_SIZE(b); 12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm min_len = (len_a < len_b) ? len_a : len_b; 12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (min_len > 0) { 12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval); 12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c==0) 12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = memcmp(a->ob_sval, b->ob_sval, min_len); 12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = 0; 12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == 0) 12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0; 12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (op) { 12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_LT: c = c < 0; break; 12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_LE: c = c <= 0; break; 12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_EQ: assert(0); break; /* unreachable */ 12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_NE: c = c != 0; break; 12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_GT: c = c > 0; break; 12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case Py_GE: c = c >= 0; break; 12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_NotImplemented; 12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto out; 12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = c ? Py_True : Py_False; 12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm out: 12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(result); 12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Eq(PyObject *o1, PyObject *o2) 12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *a = (PyStringObject*) o1; 12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *b = (PyStringObject*) o2; 12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_SIZE(a) == Py_SIZE(b) 12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm && *a->ob_sval == *b->ob_sval 12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0; 12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic long 12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_hash(PyStringObject *a) 12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t len; 12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register unsigned char *p; 12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register long x; 12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (a->ob_shash != -1) 12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return a->ob_shash; 12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = Py_SIZE(a); 12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = (unsigned char *) a->ob_sval; 12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = *p << 7; 12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--len >= 0) 12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = (1000003*x) ^ *p++; 12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x ^= Py_SIZE(a); 12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == -1) 12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = -2; 12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a->ob_shash = x; 12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return x; 12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_subscript(PyStringObject* self, PyObject* item) 12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyIndex_Check(item)) { 12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); 12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == -1 && PyErr_Occurred()) 12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < 0) 12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i += PyString_GET_SIZE(self); 12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return string_item(self, i); 12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PySlice_Check(item)) { 12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start, stop, step, slicelength, cur, i; 12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char* source_buf; 12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char* result_buf; 12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* result; 12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PySlice_GetIndicesEx((PySliceObject*)item, 12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(self), 12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &start, &stop, &step, &slicelength) < 0) { 12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (slicelength <= 0) { 13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize("", 0); 13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (start == 0 && step == 1 && 13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slicelength == PyString_GET_SIZE(self) && 13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_CheckExact(self)) { 13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)self; 13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (step == 1) { 13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize( 13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self) + start, 13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slicelength); 13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm source_buf = PyString_AsString((PyObject*)self); 13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_buf = (char *)PyMem_Malloc(slicelength); 13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result_buf == NULL) 13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (cur = start, i = 0; i < slicelength; 13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cur += step, i++) { 13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_buf[i] = source_buf[cur]; 13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyString_FromStringAndSize(result_buf, 13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slicelength); 13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMem_Free(result_buf); 13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "string indices must be integers, not %.200s", 13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(item)->tp_name); 13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getreadbuf(PyStringObject *self, Py_ssize_t index, const void **ptr) 13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( index != 0 ) { 13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_SystemError, 13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "accessing non-existent string segment"); 13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *ptr = (void *)self->ob_sval; 13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_SIZE(self); 13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getwritebuf(PyStringObject *self, Py_ssize_t index, const void **ptr) 13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Cannot use string as modifiable buffer"); 13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getsegcount(PyStringObject *self, Py_ssize_t *lenp) 13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( lenp ) 13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *lenp = Py_SIZE(self); 13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic Py_ssize_t 13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getcharbuf(PyStringObject *self, Py_ssize_t index, const char **ptr) 13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( index != 0 ) { 13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_SystemError, 13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "accessing non-existent string segment"); 13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *ptr = self->ob_sval; 13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_SIZE(self); 13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_buffer_getbuffer(PyStringObject *self, Py_buffer *view, int flags) 13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBuffer_FillInfo(view, (PyObject*)self, 13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void *)self->ob_sval, Py_SIZE(self), 13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1, flags); 13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PySequenceMethods string_as_sequence = { 13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lenfunc)string_length, /*sq_length*/ 13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (binaryfunc)string_concat, /*sq_concat*/ 13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizeargfunc)string_repeat, /*sq_repeat*/ 13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizeargfunc)string_item, /*sq_item*/ 13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ssizessizeargfunc)string_slice, /*sq_slice*/ 13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*sq_ass_item*/ 13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*sq_ass_slice*/ 13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (objobjproc)string_contains /*sq_contains*/ 13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMappingMethods string_as_mapping = { 14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (lenfunc)string_length, 14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (binaryfunc)string_subscript, 14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyBufferProcs string_as_buffer = { 14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (readbufferproc)string_buffer_getreadbuf, 14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (writebufferproc)string_buffer_getwritebuf, 14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (segcountproc)string_buffer_getsegcount, 14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (charbufferproc)string_buffer_getcharbuf, 14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (getbufferproc)string_buffer_getbuffer, 14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* XXX */ 14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LEFTSTRIP 0 14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define RIGHTSTRIP 1 14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define BOTHSTRIP 2 14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Arrays indexed by above */ 14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"}; 14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define STRIPNAME(i) (stripformat[i]+3) 14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(split__doc__, 14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.split([sep [,maxsplit]]) -> list of strings\n\ 14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the words in the string S, using sep as the\n\ 14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdelimiter string. If maxsplit is given, at most maxsplit\n\ 14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsplits are done. If sep is not specified or is None, any\n\ 14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace string is a separator and empty strings are removed\n\ 14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom the result."); 14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_split(PyStringObject *self, PyObject *args) 14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len = PyString_GET_SIZE(self), n; 14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxsplit = -1; 14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *s = PyString_AS_STRING(self), *sub; 14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *subobj = Py_None; 14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit)) 14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maxsplit < 0) 14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxsplit = PY_SSIZE_T_MAX; 14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (subobj == Py_None) 14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit); 14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(subobj)) { 14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = PyString_AS_STRING(subobj); 14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyString_GET_SIZE(subobj); 14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(subobj)) 14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Split((PyObject *)self, subobj, maxsplit); 14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(subobj, &sub, &n)) 14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_split((PyObject*) self, s, len, sub, n, maxsplit); 14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(partition__doc__, 14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.partition(sep) -> (head, sep, tail)\n\ 14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSearch for the separator sep in S, and return the part before it,\n\ 14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe separator itself, and the part after it. If the separator is not\n\ 14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfound, return S and two empty strings."); 14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_partition(PyStringObject *self, PyObject *sep_obj) 14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *sep; 14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t sep_len; 14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(sep_obj)) { 14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep = PyString_AS_STRING(sep_obj); 14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep_len = PyString_GET_SIZE(sep_obj); 14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(sep_obj)) 14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Partition((PyObject *) self, sep_obj); 14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) 14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_partition( 14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject*) self, 14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), PyString_GET_SIZE(self), 14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep_obj, sep, sep_len 14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ); 14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rpartition__doc__, 14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rpartition(sep) -> (head, sep, tail)\n\ 14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSearch for the separator sep in S, starting at the end of S, and return\n\ 14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe part before it, the separator itself, and the part after it. If the\n\ 14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmseparator is not found, return two empty strings and S."); 15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rpartition(PyStringObject *self, PyObject *sep_obj) 15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *sep; 15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t sep_len; 15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(sep_obj)) { 15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep = PyString_AS_STRING(sep_obj); 15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep_len = PyString_GET_SIZE(sep_obj); 15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(sep_obj)) 15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_RPartition((PyObject *) self, sep_obj); 15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) 15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_rpartition( 15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject*) self, 15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), PyString_GET_SIZE(self), 15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sep_obj, sep, sep_len 15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ); 15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rsplit__doc__, 15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rsplit([sep [,maxsplit]]) -> list of strings\n\ 15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the words in the string S, using sep as the\n\ 15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdelimiter string, starting at the end of the string and working\n\ 15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the front. If maxsplit is given, at most maxsplit splits are\n\ 15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdone. If sep is not specified or is None, any whitespace string\n\ 15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis a separator."); 15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rsplit(PyStringObject *self, PyObject *args) 15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len = PyString_GET_SIZE(self), n; 15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxsplit = -1; 15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *s = PyString_AS_STRING(self), *sub; 15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *subobj = Py_None; 15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit)) 15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maxsplit < 0) 15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxsplit = PY_SSIZE_T_MAX; 15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (subobj == Py_None) 15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit); 15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(subobj)) { 15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = PyString_AS_STRING(subobj); 15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyString_GET_SIZE(subobj); 15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(subobj)) 15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_RSplit((PyObject *)self, subobj, maxsplit); 15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(subobj, &sub, &n)) 15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_rsplit((PyObject*) self, s, len, sub, n, maxsplit); 15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(join__doc__, 15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.join(iterable) -> string\n\ 15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a string which is the concatenation of the strings in the\n\ 15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmiterable. The separator between elements is S."); 15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_join(PyStringObject *self, PyObject *orig) 15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *sep = PyString_AS_STRING(self); 15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const Py_ssize_t seplen = PyString_GET_SIZE(self); 15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *res = NULL; 15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t seqlen = 0; 15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t sz = 0; 15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *seq, *item; 15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq = PySequence_Fast(orig, ""); 15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (seq == NULL) { 15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seqlen = PySequence_Size(seq); 15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (seqlen == 0) { 15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromString(""); 15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (seqlen == 1) { 15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = PySequence_Fast_GET_ITEM(seq, 0); 15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CheckExact(item) || PyUnicode_CheckExact(item)) { 15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(item); 15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return item; 15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* There are at least two things to join, or else we have a subclass 16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of the builtin types in the sequence. 16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Do a pre-pass to figure out the total amount of space we'll 16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * need (sz), see whether any argument is absurd, and defer to 16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the Unicode join if appropriate. 16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < seqlen; i++) { 16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const size_t old_sz = sz; 16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = PySequence_Fast_GET_ITEM(seq, i); 16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(item)){ 16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(item)) { 16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Defer to Unicode join. 16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * CAUTION: There's no gurantee that the 16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * original sequence can be iterated over 16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * again, so we must pass seq here. 16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyUnicode_Join((PyObject *)self, seq); 16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "sequence item %zd: expected string," 16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " %.80s found", 16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i, Py_TYPE(item)->tp_name); 16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sz += PyString_GET_SIZE(item); 16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i != 0) 16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sz += seplen; 16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sz < old_sz || sz > PY_SSIZE_T_MAX) { 16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "join() result is too long for a Python string"); 16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Allocate result space. */ 16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyString_FromStringAndSize((char*)NULL, sz); 16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (res == NULL) { 16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Catenate everything. */ 16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyString_AS_STRING(res); 16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < seqlen; ++i) { 16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t n; 16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = PySequence_Fast_GET_ITEM(seq, i); 16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyString_GET_SIZE(item); 16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(p, PyString_AS_STRING(item), n); 16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p += n; 16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i < seqlen - 1) { 16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(p, sep, seplen); 16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p += seplen; 16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(seq); 16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Join(PyObject *sep, PyObject *x) 16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(sep != NULL && PyString_Check(sep)); 16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(x != NULL); 16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return string_join((PyStringObject *)sep, x); 16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* helper macro to fixup start/end slice values */ 16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define ADJUST_INDICES(start, end, len) \ 16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (end > len) \ 16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = len; \ 16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (end < 0) { \ 16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end += len; \ 16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (end < 0) \ 16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = 0; \ 16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (start < 0) { \ 16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += len; \ 16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (start < 0) \ 16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = 0; \ 16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(Py_ssize_t) 16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_find_internal(PyStringObject *self, PyObject *args, int dir) 16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *subobj; 16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *sub; 16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t sub_len; 16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start=0, end=PY_SSIZE_T_MAX; 16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!stringlib_parse_args_finds("find/rfind/index/rindex", 16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args, &subobj, &start, &end)) 16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -2; 17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(subobj)) { 17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = PyString_AS_STRING(subobj); 17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub_len = PyString_GET_SIZE(subobj); 17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(subobj)) 17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Find( 17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject *)self, subobj, start, end, dir); 17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len)) 17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX - the "expected a character buffer object" is pretty 17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm confusing for a non-expert. remap to something else ? */ 17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -2; 17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dir > 0) 17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_find_slice( 17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), PyString_GET_SIZE(self), 17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub, sub_len, start, end); 17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_rfind_slice( 17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), PyString_GET_SIZE(self), 17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub, sub_len, start, end); 17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(find__doc__, 17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.find(sub [,start [,end]]) -> int\n\ 17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the lowest index in S where substring sub is found,\n\ 17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuch that sub is contained within s[start:end]. Optional\n\ 17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarguments start and end are interpreted as in slice notation.\n\ 17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn -1 on failure."); 17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_find(PyStringObject *self, PyObject *args) 17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t result = string_find_internal(self, args, +1); 17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -2) 17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(result); 17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(index__doc__, 17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.index(sub [,start [,end]]) -> int\n\ 17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike S.find() but raise ValueError when the substring is not found."); 17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_index(PyStringObject *self, PyObject *args) 17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t result = string_find_internal(self, args, +1); 17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -2) 17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) { 17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "substring not found"); 17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(result); 17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rfind__doc__, 17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rfind(sub [,start [,end]]) -> int\n\ 17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the highest index in S where substring sub is found,\n\ 17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuch that sub is contained within s[start:end]. Optional\n\ 17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmarguments start and end are interpreted as in slice notation.\n\ 17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn -1 on failure."); 17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rfind(PyStringObject *self, PyObject *args) 17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t result = string_find_internal(self, args, -1); 17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -2) 17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(result); 17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rindex__doc__, 17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rindex(sub [,start [,end]]) -> int\n\ 17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLike S.rfind() but raise ValueError when the substring is not found."); 17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rindex(PyStringObject *self, PyObject *args) 17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t result = string_find_internal(self, args, -1); 17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -2) 17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) { 17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "substring not found"); 17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(result); 18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *) 18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_xstrip(PyStringObject *self, int striptype, PyObject *sepobj) 18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s = PyString_AS_STRING(self); 18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len = PyString_GET_SIZE(self); 18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *sep = PyString_AS_STRING(sepobj); 18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t seplen = PyString_GET_SIZE(sepobj); 18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, j; 18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (striptype != RIGHTSTRIP) { 18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) { 18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i++; 18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = len; 18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (striptype != LEFTSTRIP) { 18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j--; 18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen)); 18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j++; 18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == 0 && j == len && PyString_CheckExact(self)) { 18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*)self; 18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize(s+i, j-i); 18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *) 18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_strip(PyStringObject *self, int striptype) 18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s = PyString_AS_STRING(self); 18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len = PyString_GET_SIZE(self), i, j; 18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; 18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (striptype != RIGHTSTRIP) { 18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (i < len && isspace(Py_CHARMASK(s[i]))) { 18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i++; 18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = len; 18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (striptype != LEFTSTRIP) { 18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j--; 18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (j >= i && isspace(Py_CHARMASK(s[j]))); 18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j++; 18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == 0 && j == len && PyString_CheckExact(self)) { 18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*)self; 18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize(s+i, j-i); 18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *) 18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdo_argstrip(PyStringObject *self, int striptype, PyObject *args) 18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sep = NULL; 18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, (char *)stripformat[striptype], &sep)) 18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sep != NULL && sep != Py_None) { 18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(sep)) 18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_xstrip(self, striptype, sep); 18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(sep)) { 18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *uniself = PyUnicode_FromObject((PyObject *)self); 18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *res; 18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (uniself==NULL) 18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = _PyUnicode_XStrip((PyUnicodeObject *)uniself, 18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm striptype, sep); 18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(uniself); 18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%s arg must be None, str or unicode", 18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%s arg must be None or str", 18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm STRIPNAME(striptype)); 18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_strip(self, striptype); 19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(strip__doc__, 19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.strip([chars]) -> string or unicode\n\ 19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with leading and trailing\n\ 19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhitespace removed.\n\ 19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\ 19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping"); 19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_strip(PyStringObject *self, PyObject *args) 19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_GET_SIZE(args) == 0) 19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_strip(self, BOTHSTRIP); /* Common case */ 19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_argstrip(self, BOTHSTRIP, args); 19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(lstrip__doc__, 19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.lstrip([chars]) -> string or unicode\n\ 19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with leading whitespace removed.\n\ 19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\ 19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping"); 19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_lstrip(PyStringObject *self, PyObject *args) 19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_GET_SIZE(args) == 0) 19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_strip(self, LEFTSTRIP); /* Common case */ 19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_argstrip(self, LEFTSTRIP, args); 19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rstrip__doc__, 19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rstrip([chars]) -> string or unicode\n\ 19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with trailing whitespace removed.\n\ 19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is given and not None, remove characters in chars instead.\n\ 19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf chars is unicode, S will be converted to unicode before stripping"); 19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rstrip(PyStringObject *self, PyObject *args) 19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_GET_SIZE(args) == 0) 19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_strip(self, RIGHTSTRIP); /* Common case */ 19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return do_argstrip(self, RIGHTSTRIP, args); 19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(lower__doc__, 19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.lower() -> string\n\ 19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S converted to lowercase."); 19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _tolower and _toupper are defined by SUSv2, but they're not ISO C */ 19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef _tolower 19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _tolower tolower 19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_lower(PyStringObject *self) 19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n = PyString_GET_SIZE(self); 19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj; 19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyString_FromStringAndSize(NULL, n); 19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!newobj) 19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = PyString_AS_STRING(newobj); 19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(s, PyString_AS_STRING(self), n); 19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n; i++) { 19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(s[i]); 19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isupper(c)) 19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[i] = _tolower(c); 19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return newobj; 19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(upper__doc__, 19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.upper() -> string\n\ 19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S converted to uppercase."); 19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef _toupper 19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _toupper toupper 19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_upper(PyStringObject *self) 20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n = PyString_GET_SIZE(self); 20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj; 20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyString_FromStringAndSize(NULL, n); 20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!newobj) 20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = PyString_AS_STRING(newobj); 20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(s, PyString_AS_STRING(self), n); 20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n; i++) { 20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(s[i]); 20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (islower(c)) 20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s[i] = _toupper(c); 20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return newobj; 20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(title__doc__, 20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.title() -> string\n\ 20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a titlecased version of S, i.e. words start with uppercase\n\ 20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacters, all remaining cased characters have lowercase."); 20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_title(PyStringObject *self) 20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s = PyString_AS_STRING(self), *s_new; 20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n = PyString_GET_SIZE(self); 20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int previous_is_cased = 0; 20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj; 20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyString_FromStringAndSize(NULL, n); 20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newobj == NULL) 20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new = PyString_AsString(newobj); 20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n; i++) { 20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(*s++); 20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (islower(c)) { 20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!previous_is_cased) 20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = toupper(c); 20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 1; 20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (isupper(c)) { 20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (previous_is_cased) 20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = tolower(c); 20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 1; 20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 0; 20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new++ = c; 20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return newobj; 20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(capitalize__doc__, 20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.capitalize() -> string\n\ 20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with only its first character\n\ 20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcapitalized."); 20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_capitalize(PyStringObject *self) 20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s = PyString_AS_STRING(self), *s_new; 20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n = PyString_GET_SIZE(self); 20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj; 20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyString_FromStringAndSize(NULL, n); 20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newobj == NULL) 20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new = PyString_AsString(newobj); 20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (0 < n) { 20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(*s++); 20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (islower(c)) 20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = toupper(c); 20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = c; 20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new++; 20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 1; i < n; i++) { 20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(*s++); 20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isupper(c)) 20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = tolower(c); 20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = c; 20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new++; 20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return newobj; 20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(count__doc__, 20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.count(sub[, start[, end]]) -> int\n\ 20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the number of non-overlapping occurrences of substring sub in\n\ 20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring S[start:end]. Optional arguments start and end are interpreted\n\ 21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmas in slice notation."); 21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_count(PyStringObject *self, PyObject *args) 21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sub_obj; 21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *str = PyString_AS_STRING(self), *sub; 21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t sub_len; 21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start = 0, end = PY_SSIZE_T_MAX; 21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end)) 21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(sub_obj)) { 21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = PyString_AS_STRING(sub_obj); 21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub_len = PyString_GET_SIZE(sub_obj); 21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(sub_obj)) { 21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count; 21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = PyUnicode_Count((PyObject *)self, sub_obj, start, end); 21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count == -1) 21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(count); 21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len)) 21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ADJUST_INDICES(start, end, PyString_GET_SIZE(self)); 21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t( 21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX) 21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ); 21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(swapcase__doc__, 21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.swapcase() -> string\n\ 21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S with uppercase characters\n\ 21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconverted to lowercase and vice versa."); 21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_swapcase(PyStringObject *self) 21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s = PyString_AS_STRING(self), *s_new; 21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n = PyString_GET_SIZE(self); 21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj; 21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyString_FromStringAndSize(NULL, n); 21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newobj == NULL) 21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new = PyString_AsString(newobj); 21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n; i++) { 21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = Py_CHARMASK(*s++); 21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (islower(c)) { 21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = toupper(c); 21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (isupper(c)) { 21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = tolower(c); 21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *s_new = c; 21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s_new++; 21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return newobj; 21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(translate__doc__, 21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.translate(table [,deletechars]) -> string\n\ 21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of the string S, where all characters occurring\n\ 21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin the optional argument deletechars are removed, and the\n\ 21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmremaining characters have been mapped through the given\n\ 21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtranslation table, which must be a string of length 256."); 21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_translate(PyStringObject *self, PyObject *args) 21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register char *input, *output; 21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *table; 21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register Py_ssize_t i, c, changed = 0; 21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *input_obj = (PyObject*)self; 21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *output_start, *del_table=NULL; 21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t inlen, tablen, dellen = 0; 21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int trans_table[256]; 21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tableobj, *delobj = NULL; 21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "translate", 1, 2, 21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &tableobj, &delobj)) 21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(tableobj)) { 21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm table = PyString_AS_STRING(tableobj); 21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tablen = PyString_GET_SIZE(tableobj); 21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (tableobj == Py_None) { 22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm table = NULL; 22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tablen = 256; 22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(tableobj)) { 22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Unicode .translate() does not support the deletechars 22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm parameter; instead a mapping to None will cause characters 22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to be deleted. */ 22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (delobj != NULL) { 22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "deletions are implemented differently for unicode"); 22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Translate((PyObject *)self, tableobj, NULL); 22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(tableobj, &table, &tablen)) 22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tablen != 256) { 22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "translation table must be 256 characters long"); 22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (delobj != NULL) { 22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(delobj)) { 22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del_table = PyString_AS_STRING(delobj); 22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dellen = PyString_GET_SIZE(delobj); 22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(delobj)) { 22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "deletions are implemented differently for unicode"); 22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen)) 22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del_table = NULL; 22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dellen = 0; 22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inlen = PyString_GET_SIZE(input_obj); 22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyString_FromStringAndSize((char *)NULL, inlen); 22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm output_start = output = PyString_AsString(result); 22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm input = PyString_AS_STRING(input_obj); 22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dellen == 0 && table != NULL) { 22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If no deletions are required, use faster code */ 22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = inlen; --i >= 0; ) { 22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*input++); 22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_CHARMASK((*output++ = table[c])) != c) 22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm changed = 1; 22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (changed || !PyString_CheckExact(input_obj)) 22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(input_obj); 22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return input_obj; 22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (table == NULL) { 22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < 256; i++) 22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm trans_table[i] = Py_CHARMASK(i); 22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < 256; i++) 22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm trans_table[i] = Py_CHARMASK(table[i]); 22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < dellen; i++) 22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm trans_table[(int) Py_CHARMASK(del_table[i])] = -1; 22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = inlen; --i >= 0; ) { 22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*input++); 22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (trans_table[c] != -1) 22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c) 22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue; 22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm changed = 1; 22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!changed && PyString_CheckExact(input_obj)) { 22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(input_obj); 22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return input_obj; 22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fix the size of the resulting string */ 22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (inlen > 0 && _PyString_Resize(&result, output - output_start)) 22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* find and count characters and substrings */ 22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define findchar(target, target_len, c) \ 22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((char *)memchr((const void *)(target), c, target_len)) 23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* String ops must return a string. */ 23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If the object is subclass of string, create a copy */ 23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreturn_self(PyStringObject *self) 23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CheckExact(self)) { 23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self; 23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyStringObject *)PyString_FromStringAndSize( 23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), 23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(self)); 23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(Py_ssize_t) 23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcountchar(const char *target, int target_len, char c, Py_ssize_t maxcount) 23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count=0; 23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *start=target; 23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *end=target+target_len; 23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while ( (start=findchar(start, end-start, c)) != NULL ) { 23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count++; 23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count >= maxcount) 23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += 1; 23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return count; 23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Algorithms for different cases of string replacement */ 23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */ 23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_interleave(PyStringObject *self, 23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *to_s, Py_ssize_t to_len, 23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) 23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s; 23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, result_len; 23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count, i, product; 23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* 1 at the end plus 1 after every character */ 23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = self_len+1; 23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maxcount < count) 23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = maxcount; 23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check for overflow */ 23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* result_len = count * to_len + self_len; */ 23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm product = count * to_len; 23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (product / to_len != count) { 23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "replace string is too long"); 23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_len = product + self_len; 23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result_len < 0) { 23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "replace string is too long"); 23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! (result = (PyStringObject *) 23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(NULL, result_len)) ) 23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* TODO: special case single character, which doesn't need memcpy */ 23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Lay the first one down (guaranteed this will occur) */ 23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count -= 1; 23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=0; i<count; i++) { 23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *result_s++ = *self_s++; 23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Copy the rest of the original string */ 23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, self_s, self_len-i); 23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Special case for deleting a single character */ 23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==1, to="", maxcount>=1 */ 23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_delete_single_character(PyStringObject *self, 23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char from_c, Py_ssize_t maxcount) 23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s; 24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *start, *next, *end; 24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, result_len; 24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count; 24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = countchar(self_s, self_len, from_c, maxcount); 24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count == 0) { 24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_len = self_len - count; /* from_len == 1 */ 24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(result_len>=0); 24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( (result = (PyStringObject *) 24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(NULL, result_len)) == NULL) 24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = self_s; 24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = self_s + self_len; 24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (count-- > 0) { 24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = findchar(start, end-start, from_c); 24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == NULL) 24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, next-start); 24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += (next-start); 24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = next+1; 24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, end-start); 24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */ 24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_delete_substring(PyStringObject *self, 24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *from_s, Py_ssize_t from_len, 24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) { 24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s; 24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *start, *next, *end; 24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, result_len; 24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count, offset; 24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = stringlib_count(self_s, self_len, 24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxcount); 24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count == 0) { 24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* no matches */ 24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_len = self_len - (count * from_len); 24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert (result_len>=0); 24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( (result = (PyStringObject *) 24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(NULL, result_len)) == NULL ) 24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = self_s; 24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = self_s + self_len; 24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (count-- > 0) { 24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset = stringlib_find(start, end-start, 24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0); 24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset == -1) 24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = start + offset; 24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, next-start); 24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += (next-start); 24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = next+from_len; 24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, end-start); 24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */ 24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_single_character_in_place(PyStringObject *self, 24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char from_c, char to_c, 24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) 24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s, *start, *end, *next; 24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len; 24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The result string will be the same size */ 24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = findchar(self_s, self_len, from_c); 25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == NULL) { 25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* No matches; return the original string */ 25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Need to make a new string */ 25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len); 25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, self_s, self_len); 25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* change everything in-place, starting with this one */ 25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = result_s + (next-self_s); 25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *start = to_c; 25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start++; 25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = result_s + self_len; 25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--maxcount > 0) { 25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = findchar(start, end-start, from_c); 25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == NULL) 25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *next = to_c; 25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = next+1; 25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */ 25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_substring_in_place(PyStringObject *self, 25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *from_s, Py_ssize_t from_len, 25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *to_s, Py_ssize_t to_len, 25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) 25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *result_s, *start, *end; 25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s; 25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, offset; 25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The result string will be the same size */ 25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset = stringlib_find(self_s, self_len, 25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0); 25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset == -1) { 25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* No matches; return the original string */ 25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Need to make a new string */ 25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len); 25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, self_s, self_len); 25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* change everything in-place, starting with this one */ 25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = result_s + offset; 25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(start, to_s, from_len); 25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += from_len; 25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = result_s + self_len; 25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while ( --maxcount > 0) { 25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset = stringlib_find(start, end-start, 25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0); 25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset==-1) 25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(start+offset, to_s, from_len); 25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += offset+from_len; 25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */ 25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_single_character(PyStringObject *self, 25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char from_c, 25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *to_s, Py_ssize_t to_len, 25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) 25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s; 25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *start, *next, *end; 25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, result_len; 25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count, product; 25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = countchar(self_s, self_len, from_c, maxcount); 26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count == 0) { 26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* no matches, return unchanged */ 26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* use the difference between current and new, hence the "-1" */ 26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* result_len = self_len + count * (to_len-1) */ 26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm product = count * (to_len-1); 26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (product / (to_len-1) != count) { 26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "replace string is too long"); 26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_len = self_len + product; 26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result_len < 0) { 26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "replace string is too long"); 26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( (result = (PyStringObject *) 26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(NULL, result_len)) == NULL) 26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = self_s; 26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = self_s + self_len; 26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (count-- > 0) { 26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = findchar(start, end-start, from_c); 26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == NULL) 26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == start) { 26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* replace with the 'to' */ 26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += 1; 26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* copy the unchanged old then the 'to' */ 26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, next-start); 26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += (next-start); 26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = next+1; 26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Copy the remainder of the remaining string */ 26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, end-start); 26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */ 26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace_substring(PyStringObject *self, 26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *from_s, Py_ssize_t from_len, 26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *to_s, Py_ssize_t to_len, 26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) { 26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *self_s, *result_s; 26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *start, *next, *end; 26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t self_len, result_len; 26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count, offset, product; 26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *result; 26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_s = PyString_AS_STRING(self); 26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self_len = PyString_GET_SIZE(self); 26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count = stringlib_count(self_s, self_len, 26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxcount); 26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (count == 0) { 26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* no matches, return unchanged */ 26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check for overflow */ 26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* result_len = self_len + count * (to_len-from_len) */ 26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm product = count * (to_len-from_len); 26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (product / (to_len-from_len) != count) { 26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "replace string is too long"); 26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_len = self_len + product; 26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result_len < 0) { 26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "replace string is too long"); 26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ( (result = (PyStringObject *) 26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromStringAndSize(NULL, result_len)) == NULL) 26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s = PyString_AS_STRING(result); 26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = self_s; 26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm end = self_s + self_len; 26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (count-- > 0) { 26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset = stringlib_find(start, end-start, 26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0); 26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset == -1) 27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm next = start+offset; 27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (next == start) { 27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* replace with the 'to' */ 27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start += from_len; 27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* copy the unchanged old then the 'to' */ 27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, next-start); 27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += (next-start); 27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, to_s, to_len); 27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result_s += to_len; 27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = next+from_len; 27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Copy the remainder of the remaining string */ 27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(result_s, start, end-start); 27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(PyStringObject *) 27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreplace(PyStringObject *self, 27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *from_s, Py_ssize_t from_len, 27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *to_s, Py_ssize_t to_len, 27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t maxcount) 27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maxcount < 0) { 27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxcount = PY_SSIZE_T_MAX; 27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else if (maxcount == 0 || PyString_GET_SIZE(self) == 0) { 27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing to do; return the original string */ 27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maxcount == 0 || 27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (from_len == 0 && to_len == 0)) { 27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing to do; return the original string */ 27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Handle zero-length special cases */ 27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (from_len == 0) { 27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* insert the 'to' string everywhere. */ 27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* >>> "Python".replace("", ".") */ 27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* '.P.y.t.h.o.n.' */ 27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_interleave(self, to_s, to_len, maxcount); 27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Except for "".replace("", "A") == "A" there is no way beyond this */ 27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* point for an empty self string to generate a non-empty string */ 27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case so the remaining code always gets a non-empty string */ 27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) { 27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return return_self(self); 27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (to_len == 0) { 27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* delete all occurances of 'from' string */ 27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (from_len == 1) { 27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_delete_single_character( 27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self, from_s[0], maxcount); 27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_delete_substring(self, from_s, from_len, maxcount); 27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Handle special case where both strings have the same length */ 27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (from_len == to_len) { 27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (from_len == 1) { 27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_single_character_in_place( 27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self, 27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s[0], 27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to_s[0], 27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm maxcount); 27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_substring_in_place( 27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self, from_s, from_len, to_s, to_len, maxcount); 27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Otherwise use the more generic algorithms */ 27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (from_len == 1) { 27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_single_character(self, from_s[0], 27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to_s, to_len, maxcount); 27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* len('from')>=2, len('to')>=1 */ 27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return replace_substring(self, from_s, from_len, to_s, to_len, maxcount); 27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(replace__doc__, 27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.replace(old, new[, count]) -> string\n\ 27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of string S with all occurrences of substring\n\ 27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmold replaced by new. If the optional argument count is\n\ 27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgiven, only the first count occurrences are replaced."); 27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_replace(PyStringObject *self, PyObject *args) 28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t count = -1; 28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *from, *to; 28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *from_s, *to_s; 28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t from_len, to_len; 28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count)) 28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(from)) { 28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s = PyString_AS_STRING(from); 28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_len = PyString_GET_SIZE(from); 28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(from)) 28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Replace((PyObject *)self, 28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from, to, count); 28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(from, &from_s, &from_len)) 28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(to)) { 28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to_s = PyString_AS_STRING(to); 28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to_len = PyString_GET_SIZE(to); 28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(to)) 28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Replace((PyObject *)self, 28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from, to, count); 28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(to, &to_s, &to_len)) 28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)replace((PyStringObject *) self, 28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm from_s, from_len, 28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to_s, to_len, count); 28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/** End DALKE **/ 28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Matches the end (direction >= 0) or start (direction < 0) of self 28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * against substr, using the start and end arguments. Returns 28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * -1 on error, 0 if not found and 1 if found. 28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL(int) 28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_string_tailmatch(PyStringObject *self, PyObject *substr, Py_ssize_t start, 28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t end, int direction) 28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len = PyString_GET_SIZE(self); 28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t slen; 28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* sub; 28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char* str; 28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(substr)) { 28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sub = PyString_AS_STRING(substr); 28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm slen = PyString_GET_SIZE(substr); 28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyUnicode_Check(substr)) 28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyUnicode_Tailmatch((PyObject *)self, 28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm substr, start, end, direction); 28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyObject_AsCharBuffer(substr, &sub, &slen)) 28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyString_AS_STRING(self); 28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ADJUST_INDICES(start, end, len); 28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (direction < 0) { 28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* startswith */ 28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (start+slen > len) 28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* endswith */ 28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (end-start < slen || start > len) 28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (end-slen > start) 28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start = end - slen; 28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (end-start >= slen) 28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ! memcmp(str+start, sub, slen); 28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(startswith__doc__, 28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.startswith(prefix[, start[, end]]) -> bool\n\ 28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S starts with the specified prefix, False otherwise.\n\ 28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional start, test S beginning at that position.\n\ 28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional end, stop comparing S at that position.\n\ 28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprefix can also be a tuple of strings to try."); 28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_startswith(PyStringObject *self, PyObject *args) 28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start = 0; 29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t end = PY_SSIZE_T_MAX; 29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *subobj; 29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int result; 29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end)) 29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(subobj)) { 29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { 29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = _string_tailmatch(self, 29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_GET_ITEM(subobj, i), 29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start, end, -1); 29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) 29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (result) { 29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_TRUE; 29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_FALSE; 29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = _string_tailmatch(self, subobj, start, end, -1); 29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) { 29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_TypeError)) 29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, "startswith first arg must be str, " 29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name); 29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(result); 29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(endswith__doc__, 29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.endswith(suffix[, start[, end]]) -> bool\n\ 29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S ends with the specified suffix, False otherwise.\n\ 29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional start, test S beginning at that position.\n\ 29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWith optional end, stop comparing S at that position.\n\ 29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsuffix can also be a tuple of strings to try."); 29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_endswith(PyStringObject *self, PyObject *args) 29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t start = 0; 29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t end = PY_SSIZE_T_MAX; 29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *subobj; 29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int result; 29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end)) 29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(subobj)) { 29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { 29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = _string_tailmatch(self, 29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_GET_ITEM(subobj, i), 29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start, end, +1); 29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) 29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (result) { 29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_TRUE; 29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_FALSE; 29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = _string_tailmatch(self, subobj, start, end, +1); 29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == -1) { 29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_TypeError)) 29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, "endswith first arg must be str, " 29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name); 29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(result); 29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(encode__doc__, 29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.encode([encoding[,errors]]) -> object\n\ 29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmEncodes S using the codec registered for encoding. encoding defaults\n\ 29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the default encoding. errors may be given to set a different error\n\ 29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandling scheme. Default is 'strict' meaning that encoding errors raise\n\ 29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\ 29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'xmlcharrefreplace' as well as any other name registered with\n\ 29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcodecs.register_error that is able to handle UnicodeEncodeErrors."); 29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_encode(PyStringObject *self, PyObject *args, PyObject *kwargs) 29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"encoding", "errors", 0}; 29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *encoding = NULL; 29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *errors = NULL; 29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode", 29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwlist, &encoding, &errors)) 29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsEncodedObject((PyObject *)self, encoding, errors); 29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v) && !PyUnicode_Check(v)) { 30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "encoder did not return a string/unicode object " 30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "(type=%.400s)", 30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(v)->tp_name); 30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(decode__doc__, 30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.decode([encoding[,errors]]) -> object\n\ 30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDecodes S using the codec registered for encoding. encoding defaults\n\ 30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the default encoding. errors may be given to set a different error\n\ 30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandling scheme. Default is 'strict' meaning that encoding errors raise\n\ 30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ 30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmas well as any other name registered with codecs.register_error that is\n\ 30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmable to handle UnicodeDecodeErrors."); 30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_decode(PyStringObject *self, PyObject *args, PyObject *kwargs) 30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"encoding", "errors", 0}; 30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *encoding = NULL; 30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *errors = NULL; 30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode", 30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwlist, &encoding, &errors)) 30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_AsDecodedObject((PyObject *)self, encoding, errors); 30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto onError; 30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v) && !PyUnicode_Check(v)) { 30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "decoder did not return a string/unicode object " 30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "(type=%.400s)", 30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(v)->tp_name); 30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError: 30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(expandtabs__doc__, 30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.expandtabs([tabsize]) -> string\n\ 30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a copy of S where all tab characters are expanded using spaces.\n\ 30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf tabsize is not given, a tab size of 8 characters is assumed."); 30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_expandtabs(PyStringObject *self, PyObject *args) 30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *e, *p, *qe; 30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *q; 30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, j, incr; 30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *u; 30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int tabsize = 8; 30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) 30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* First pass: determine size of output string */ 30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = 0; /* chars up to and including most recent \n or \r */ 30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = 0; /* chars since most recent \n or \r (use in tab calculations) */ 30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = PyString_AS_STRING(self) + PyString_GET_SIZE(self); /* end of input */ 30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (p = PyString_AS_STRING(self); p < e; p++) 30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*p == '\t') { 30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tabsize > 0) { 30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm incr = tabsize - (j % tabsize); 30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (j > PY_SSIZE_T_MAX - incr) 30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow1; 30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j += incr; 30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (j > PY_SSIZE_T_MAX - 1) 30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow1; 30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j++; 30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*p == '\n' || *p == '\r') { 30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i > PY_SSIZE_T_MAX - j) 30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow1; 30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i += j; 30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = 0; 30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i > PY_SSIZE_T_MAX - j) 30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow1; 30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Second pass: create output string and fill it */ 31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = PyString_FromStringAndSize(NULL, i + j); 31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!u) 31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = 0; /* same as in first pass */ 31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = PyString_AS_STRING(u); /* next output char */ 31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm qe = PyString_AS_STRING(u) + PyString_GET_SIZE(u); /* end of output */ 31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (p = PyString_AS_STRING(self); p < e; p++) 31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*p == '\t') { 31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tabsize > 0) { 31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = tabsize - (j % tabsize); 31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j += i; 31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (i--) { 31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (q >= qe) 31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow2; 31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *q++ = ' '; 31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (q >= qe) 31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto overflow2; 31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *q++ = *p; 31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j++; 31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*p == '\n' || *p == '\r') 31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm j = 0; 31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return u; 31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm overflow2: 31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(u); 31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm overflow1: 31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, "new string is too long"); 31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *) 31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill) 31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *u; 31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (left < 0) 31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left = 0; 31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (right < 0) 31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm right = 0; 31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (left == 0 && right == 0 && PyString_CheckExact(self)) { 31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)self; 31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = PyString_FromStringAndSize(NULL, 31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left + PyString_GET_SIZE(self) + right); 31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (u) { 31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (left) 31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memset(PyString_AS_STRING(u), fill, left); 31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(PyString_AS_STRING(u) + left, 31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), 31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(self)); 31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (right) 31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memset(PyString_AS_STRING(u) + left + PyString_GET_SIZE(self), 31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill, right); 31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return u; 31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(ljust__doc__, 31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.ljust(width[, fillchar]) -> string\n" 31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S left-justified in a string of length width. Padding is\n" 31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space)."); 31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_ljust(PyStringObject *self, PyObject *args) 31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t width; 31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fillchar = ' '; 31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "n|c:ljust", &width, &fillchar)) 31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { 31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) self; 31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return pad(self, 0, width - PyString_GET_SIZE(self), fillchar); 31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(rjust__doc__, 31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.rjust(width[, fillchar]) -> string\n" 31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S right-justified in a string of length width. Padding is\n" 31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space)"); 31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_rjust(PyStringObject *self, PyObject *args) 32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t width; 32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fillchar = ' '; 32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "n|c:rjust", &width, &fillchar)) 32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { 32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) self; 32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return pad(self, width - PyString_GET_SIZE(self), 0, fillchar); 32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(center__doc__, 32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.center(width[, fillchar]) -> string\n" 32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Return S centered in a string of length width. Padding is\n" 32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"done using the specified fill character (default is a space)"); 32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_center(PyStringObject *self, PyObject *args) 32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t marg, left; 32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t width; 32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fillchar = ' '; 32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "n|c:center", &width, &fillchar)) 32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { 32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) self; 32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm marg = width - PyString_GET_SIZE(self); 32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left = marg / 2 + (marg & width & 1); 32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return pad(self, left, marg - left, fillchar); 32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(zfill__doc__, 32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.zfill(width) -> string\n" 32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Pad a numeric string S with zeros on the left, to fill a field\n" 32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"of the specified width. The string S is never truncated."); 32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_zfill(PyStringObject *self, PyObject *args) 32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t fill; 32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *s; 32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t width; 32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "n:zfill", &width)) 32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) >= width) { 32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CheckExact(self)) { 32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(self); 32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) self; 32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromStringAndSize( 32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(self), 32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(self) 32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ); 32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill = width - PyString_GET_SIZE(self); 32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = pad(self, fill, 0, '0'); 32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) 32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyString_AS_STRING(s); 32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p[fill] == '+' || p[fill] == '-') { 32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* move sign to beginning of string */ 32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p[0] = p[fill]; 32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p[fill] = '0'; 32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*) s; 32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isspace__doc__, 32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isspace() -> bool\n\ 32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are whitespace\n\ 32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise."); 32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isspace(PyStringObject *self) 32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1 && 33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isspace(*p)) 33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isspace(*p)) 33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isalpha__doc__, 33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isalpha() -> bool\n\ 33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are alphabetic\n\ 33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise."); 33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isalpha(PyStringObject *self) 33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1 && 33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isalpha(*p)) 33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isalpha(*p)) 33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isalnum__doc__, 33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isalnum() -> bool\n\ 33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are alphanumeric\n\ 33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise."); 33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isalnum(PyStringObject *self) 33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1 && 33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isalnum(*p)) 33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isalnum(*p)) 33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isdigit__doc__, 33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isdigit() -> bool\n\ 33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all characters in S are digits\n\ 33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand there is at least one character in S, False otherwise."); 33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isdigit(PyStringObject *self) 33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1 && 33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isdigit(*p)) 34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isdigit(*p)) 34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(1); 34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(islower__doc__, 34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.islower() -> bool\n\ 34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all cased characters in S are lowercase and there is\n\ 34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmat least one cased character in S, False otherwise."); 34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_islower(PyStringObject *self) 34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int cased; 34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1) 34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(islower(*p) != 0); 34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 0; 34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isupper(*p)) 34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (!cased && islower(*p)) 34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 1; 34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(cased); 34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(isupper__doc__, 34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.isupper() -> bool\n\ 34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if all cased characters in S are uppercase and there is\n\ 34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmat least one cased character in S, False otherwise."); 34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_isupper(PyStringObject *self) 34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int cased; 34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1) 34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(isupper(*p) != 0); 34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 0; 34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (islower(*p)) 34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (!cased && isupper(*p)) 34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 1; 34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(cased); 34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(istitle__doc__, 34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.istitle() -> bool\n\ 34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn True if S is a titlecased string and there is at least one\n\ 34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacter in S, i.e. uppercase characters may only follow uncased\n\ 34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcharacters and lowercase characters only cased ones. Return False\n\ 34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmotherwise."); 34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_istitle(PyStringObject *self, PyObject *uncased) 34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *p 34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm = (unsigned char *) PyString_AS_STRING(self); 34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char *e; 34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int cased, previous_is_cased; 34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Shortcut for single character strings */ 35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 1) 35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(isupper(*p) != 0); 35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Special case for empty strings */ 35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_GET_SIZE(self) == 0) 35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = p + PyString_GET_SIZE(self); 35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 0; 35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 0; 35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (; p < e; p++) { 35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register const unsigned char ch = *p; 35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isupper(ch)) { 35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (previous_is_cased) 35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 1; 35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 1; 35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (islower(ch)) { 35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!previous_is_cased) 35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(0); 35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 1; 35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cased = 1; 35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm previous_is_cased = 0; 35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(cased); 35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(splitlines__doc__, 35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.splitlines([keepends]) -> list of strings\n\ 35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a list of the lines in S, breaking at line boundaries.\n\ 35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmLine breaks are not included in the resulting list unless keepends\n\ 35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis given and true."); 35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_splitlines(PyStringObject *self, PyObject *args) 35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int keepends = 0; 35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) 35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return stringlib_splitlines( 35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject*) self, PyString_AS_STRING(self), PyString_GET_SIZE(self), 35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm keepends 35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ); 35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sizeof__doc__, 35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.__sizeof__() -> size of S in memory, in bytes"); 35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_sizeof(PyStringObject *v) 35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t res; 35604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize; 35614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(res); 35624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 35654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_getnewargs(PyStringObject *v) 35664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_BuildValue("(s#)", v->ob_sval, Py_SIZE(v)); 35684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 35694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "stringlib/string_format.h" 35724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(format__doc__, 35744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.format(*args, **kwargs) -> string\n\ 35754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 35764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a formatted version of S, using substitutions from args and kwargs.\n\ 35774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe substitutions are identified by braces ('{' and '}')."); 35784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 35804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring__format__(PyObject* self, PyObject* args) 35814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 35824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *format_spec; 35834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result = NULL; 35844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tmp = NULL; 35854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 35864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If 2.x, convert format_spec to the same type as value */ 35874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* This is to allow things like u''.format('') */ 35884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) 35894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 35904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(PyString_Check(format_spec) || PyUnicode_Check(format_spec))) { 35914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, "__format__ arg must be str " 35924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "or unicode, not %s", Py_TYPE(format_spec)->tp_name); 35934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 35944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 35954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp = PyObject_Str(format_spec); 35964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tmp == NULL) 35974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 35984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm format_spec = tmp; 35994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = _PyBytes_FormatAdvanced(self, 36014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AS_STRING(format_spec), 36024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(format_spec)); 36034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdone: 36044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tmp); 36054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 36064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 36074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(p_format__doc__, 36094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"S.__format__(format_spec) -> string\n\ 36104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 36114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a formatted version of S as described by format_spec."); 36124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef 36154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_methods[] = { 36164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Counterparts of the obsolete stropmodule functions; except 36174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string.maketrans(). */ 36184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"join", (PyCFunction)string_join, METH_O, join__doc__}, 36194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"split", (PyCFunction)string_split, METH_VARARGS, split__doc__}, 36204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rsplit", (PyCFunction)string_rsplit, METH_VARARGS, rsplit__doc__}, 36214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"lower", (PyCFunction)string_lower, METH_NOARGS, lower__doc__}, 36224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"upper", (PyCFunction)string_upper, METH_NOARGS, upper__doc__}, 36234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"islower", (PyCFunction)string_islower, METH_NOARGS, islower__doc__}, 36244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"isupper", (PyCFunction)string_isupper, METH_NOARGS, isupper__doc__}, 36254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"isspace", (PyCFunction)string_isspace, METH_NOARGS, isspace__doc__}, 36264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"isdigit", (PyCFunction)string_isdigit, METH_NOARGS, isdigit__doc__}, 36274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"istitle", (PyCFunction)string_istitle, METH_NOARGS, istitle__doc__}, 36284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"isalpha", (PyCFunction)string_isalpha, METH_NOARGS, isalpha__doc__}, 36294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"isalnum", (PyCFunction)string_isalnum, METH_NOARGS, isalnum__doc__}, 36304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"capitalize", (PyCFunction)string_capitalize, METH_NOARGS, 36314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm capitalize__doc__}, 36324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"count", (PyCFunction)string_count, METH_VARARGS, count__doc__}, 36334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"endswith", (PyCFunction)string_endswith, METH_VARARGS, 36344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm endswith__doc__}, 36354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"partition", (PyCFunction)string_partition, METH_O, partition__doc__}, 36364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"find", (PyCFunction)string_find, METH_VARARGS, find__doc__}, 36374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"index", (PyCFunction)string_index, METH_VARARGS, index__doc__}, 36384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"lstrip", (PyCFunction)string_lstrip, METH_VARARGS, lstrip__doc__}, 36394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"replace", (PyCFunction)string_replace, METH_VARARGS, replace__doc__}, 36404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rfind", (PyCFunction)string_rfind, METH_VARARGS, rfind__doc__}, 36414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rindex", (PyCFunction)string_rindex, METH_VARARGS, rindex__doc__}, 36424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rstrip", (PyCFunction)string_rstrip, METH_VARARGS, rstrip__doc__}, 36434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rpartition", (PyCFunction)string_rpartition, METH_O, 36444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rpartition__doc__}, 36454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"startswith", (PyCFunction)string_startswith, METH_VARARGS, 36464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm startswith__doc__}, 36474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"strip", (PyCFunction)string_strip, METH_VARARGS, strip__doc__}, 36484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"swapcase", (PyCFunction)string_swapcase, METH_NOARGS, 36494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm swapcase__doc__}, 36504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"translate", (PyCFunction)string_translate, METH_VARARGS, 36514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm translate__doc__}, 36524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"title", (PyCFunction)string_title, METH_NOARGS, title__doc__}, 36534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"ljust", (PyCFunction)string_ljust, METH_VARARGS, ljust__doc__}, 36544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"rjust", (PyCFunction)string_rjust, METH_VARARGS, rjust__doc__}, 36554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"center", (PyCFunction)string_center, METH_VARARGS, center__doc__}, 36564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"zfill", (PyCFunction)string_zfill, METH_VARARGS, zfill__doc__}, 36574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"format", (PyCFunction) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__}, 36584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"__format__", (PyCFunction) string__format__, METH_VARARGS, p_format__doc__}, 36594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"_formatter_field_name_split", (PyCFunction) formatter_field_name_split, METH_NOARGS}, 36604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"_formatter_parser", (PyCFunction) formatter_parser, METH_NOARGS}, 36614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"encode", (PyCFunction)string_encode, METH_VARARGS | METH_KEYWORDS, encode__doc__}, 36624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"decode", (PyCFunction)string_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__}, 36634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"expandtabs", (PyCFunction)string_expandtabs, METH_VARARGS, 36644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expandtabs__doc__}, 36654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"splitlines", (PyCFunction)string_splitlines, METH_VARARGS, 36664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm splitlines__doc__}, 36674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"__sizeof__", (PyCFunction)string_sizeof, METH_NOARGS, 36684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof__doc__}, 36694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"__getnewargs__", (PyCFunction)string_getnewargs, METH_NOARGS}, 36704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} /* sentinel */ 36714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 36724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 36744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstr_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 36754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 36774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 36784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 36794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *x = NULL; 36804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"object", 0}; 36814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type != &PyString_Type) 36834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return str_subtype_new(type, args, kwds); 36844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:str", kwlist, &x)) 36854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 36864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == NULL) 36874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromString(""); 36884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyObject_Str(x); 36894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 36904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 36924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstr_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 36934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 36944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tmp, *pnew; 36954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n; 36964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 36974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyType_IsSubtype(type, &PyString_Type)); 36984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp = string_new(&PyString_Type, args, kwds); 36994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tmp == NULL) 37004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 37014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyString_CheckExact(tmp)); 37024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyString_GET_SIZE(tmp); 37034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pnew = type->tp_alloc(type, n); 37044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (pnew != NULL) { 37054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(PyString_AS_STRING(pnew), PyString_AS_STRING(tmp), n+1); 37064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((PyStringObject *)pnew)->ob_shash = 37074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((PyStringObject *)tmp)->ob_shash; 37084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((PyStringObject *)pnew)->ob_sstate = SSTATE_NOT_INTERNED; 37094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 37104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tmp); 37114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return pnew; 37124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 37154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbasestring_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 37164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 37184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "The basestring type cannot be instantiated"); 37194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 37204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 37234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstring_mod(PyObject *v, PyObject *w) 37244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 37254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v)) { 37264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_NotImplemented); 37274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_NotImplemented; 37284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 37294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_Format(v, w); 37304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 37314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(basestring_doc, 37334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Type basestring cannot be instantiated; it is the base for str and unicode."); 37344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyNumberMethods string_as_number = { 37364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*nb_add*/ 37374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*nb_subtract*/ 37384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*nb_multiply*/ 37394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /*nb_divide*/ 37404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_mod, /*nb_remainder*/ 37414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 37424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyTypeObject PyBaseString_Type = { 37454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(&PyType_Type, 0) 37464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "basestring", 37474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 37484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, 37494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dealloc */ 37504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 37514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 37524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 37534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 37544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 37554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 37564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 37574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 37584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 37594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_call */ 37604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 37614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattro */ 37624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 37634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 37644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ 37654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm basestring_doc, /* tp_doc */ 37664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_traverse */ 37674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 37684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_richcompare */ 37694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 37704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 37714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 37724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_methods */ 37734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_members */ 37744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 37754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &PyBaseObject_Type, /* tp_base */ 37764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 37774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 37784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 37794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 37804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 37814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 37824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm basestring_new, /* tp_new */ 37834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_free */ 37844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 37854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(string_doc, 37874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"str(object) -> string\n\ 37884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 37894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a nice string representation of the object.\n\ 37904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the argument is a string, the return value is the same object."); 37914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 37924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyTypeObject PyString_Type = { 37934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(&PyType_Type, 0) 37944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "str", 37954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject_SIZE, 37964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(char), 37974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_dealloc, /* tp_dealloc */ 37984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (printfunc)string_print, /* tp_print */ 37994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 38004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 38014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 38024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_repr, /* tp_repr */ 38034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &string_as_number, /* tp_as_number */ 38044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &string_as_sequence, /* tp_as_sequence */ 38054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &string_as_mapping, /* tp_as_mapping */ 38064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (hashfunc)string_hash, /* tp_hash */ 38074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_call */ 38084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_str, /* tp_str */ 38094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericGetAttr, /* tp_getattro */ 38104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 38114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &string_as_buffer, /* tp_as_buffer */ 38124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | 38134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_BASETYPE | Py_TPFLAGS_STRING_SUBCLASS | 38144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */ 38154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_doc, /* tp_doc */ 38164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_traverse */ 38174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 38184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (richcmpfunc)string_richcompare, /* tp_richcompare */ 38194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 38204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 38214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 38224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_methods, /* tp_methods */ 38234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_members */ 38244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 38254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &PyBaseString_Type, /* tp_base */ 38264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 38274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 38284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 38294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 38304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 38314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 38324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string_new, /* tp_new */ 38334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Del, /* tp_free */ 38344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 38354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 38374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Concat(register PyObject **pv, register PyObject *w) 38384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyObject *v; 38404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*pv == NULL) 38414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 38424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (w == NULL || !PyString_Check(*pv)) { 38434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(*pv); 38444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pv = NULL; 38454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 38464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = string_concat((PyStringObject *) *pv, w); 38484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(*pv); 38494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pv = v; 38504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 38514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 38534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_ConcatAndDel(register PyObject **pv, register PyObject *w) 38544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_Concat(pv, w); 38564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(w); 38574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 38584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* The following function breaks the notion that strings are immutable: 38614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm it changes the size of a string. We get away with this only if there 38624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm is only one module referencing the object. You can also think of it 38634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm as creating a new string object and destroying the old one, only 38644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm more efficiently. In any case, don't use this if the string may 38654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm already be known to some other part of the code... 38664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Note that if there's not enough memory to resize the string, the original 38674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm string object at *pv is deallocated, *pv is set to NULL, an "out of 38684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memory" exception is set, and -1 is returned. Else (on success) 0 is 38694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm returned, and the value in *pv may or may not be the same as on input. 38704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm As always, an extra byte is allocated for a trailing \0 byte (newsize 38714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm does *not* include that), and a trailing \0 byte is stored. 38724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 38734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 38744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 38754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_Resize(PyObject **pv, Py_ssize_t newsize) 38764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 38774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyObject *v; 38784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *sv; 38794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = *pv; 38804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(v) || Py_REFCNT(v) != 1 || newsize < 0 || 38814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_CHECK_INTERNED(v)) { 38824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pv = 0; 38834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 38844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadInternalCall(); 38854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 38864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX UNREF/NEWREF interface should be more symmetrical */ 38884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_DEC_REFTOTAL; 38894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_ForgetReference(v); 38904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pv = (PyObject *) 38914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_REALLOC((char *)v, PyStringObject_SIZE + newsize); 38924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*pv == NULL) { 38934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Del(v); 38944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 38954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 38964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 38974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_NewReference(*pv); 38984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sv = (PyStringObject *) *pv; 38994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_SIZE(sv) = newsize; 39004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sv->ob_sval[newsize] = '\0'; 39014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sv->ob_shash = -1; /* invalidate cached hash value */ 39024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 39034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Helpers for formatstring */ 39064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(PyObject *) 39084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx) 39094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t argidx = *p_argidx; 39114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argidx < arglen) { 39124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (*p_argidx)++; 39134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arglen < 0) 39144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return args; 39154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 39164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyTuple_GetItem(args, argidx); 39174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 39194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not enough arguments for format string"); 39204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 39214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Format codes 39244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_LJUST '-' 39254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_SIGN '+' 39264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_BLANK ' ' 39274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_ALT '#' 39284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * F_ZERO '0' 39294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 39304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_LJUST (1<<0) 39314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_SIGN (1<<1) 39324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_BLANK (1<<2) 39334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_ALT (1<<3) 39344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_ZERO (1<<4) 39354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Returns a new reference to a PyString object, or NULL on failure. */ 39374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 39394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatfloat(PyObject *v, int flags, int prec, int type) 39404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 39424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 39434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm double x; 39444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = PyFloat_AsDouble(v); 39464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == -1.0 && PyErr_Occurred()) { 39474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, "float argument required, " 39484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not %.200s", Py_TYPE(v)->tp_name); 39494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 39504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 39514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (prec < 0) 39534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = 6; 39544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = PyOS_double_to_string(x, type, prec, 39564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL); 39574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) 39594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 39604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyString_FromStringAndSize(p, strlen(p)); 39614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMem_Free(p); 39624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 39634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 39644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _PyString_FormatLong emulates the format codes d, u, o, x and X, and 39664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the F_ALT flag, for Python's long (unbounded) ints. It's not used for 39674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Python's regular ints. 39684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Return value: a new PyString*, or NULL if error. 39694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * . *pbuf is set to point into it, 39704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * *plen set to the # of chars following that. 39714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Caller must decref it when done using pbuf. 39724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The string starting at *pbuf is of the form 39734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * "-"? ("0x" | "0X")? digit+ 39744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * "0x"/"0X" are present only for x and X conversions, with F_ALT 39754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * set in flags. The case of hex digits will be correct, 39764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * There will be at least prec digits, zero-filled on the left if 39774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * necessary to get that many. 39784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * val object to be converted 39794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * flags bitmask of format flags; only F_ALT is looked at 39804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * prec minimum number of digits; 0-fill on left if needed 39814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * type a character in [duoxX]; u acts the same as d 39824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 39834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * CAUTION: o, x and X conversions on regular ints can never 39844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * produce a '-' sign, but can for Python's unbounded ints. 39854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 39864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject* 39874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PyString_FormatLong(PyObject *val, int flags, int prec, int type, 39884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char **pbuf, int *plen) 39894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 39904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result = NULL; 39914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *buf; 39924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i; 39934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int sign; /* 1 if '-', else 0 */ 39944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int len; /* number of characters */ 39954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t llen; 39964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int numdigits; /* len == numnondigits + numdigits */ 39974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int numnondigits = 0; 39984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 39994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (type) { 40004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'd': 40014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 40024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_TYPE(val)->tp_str(val); 40034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 40044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'o': 40054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_TYPE(val)->tp_as_number->nb_oct(val); 40064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 40074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'x': 40084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'X': 40094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm numnondigits = 2; 40104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = Py_TYPE(val)->tp_as_number->nb_hex(val); 40114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 40124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 40134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(!"'type' not in [duoxX]"); 40144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!result) 40164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 40174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf = PyString_AsString(result); 40194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!buf) { 40204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 40214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 40224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* To modify the string in-place, there can only be one reference. */ 40254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_REFCNT(result) != 1) { 40264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadInternalCall(); 40274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 40284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm llen = PyString_Size(result); 40304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (llen > INT_MAX) { 40314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong"); 40324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 40334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = (int)llen; 40354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (buf[len-1] == 'L') { 40364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --len; 40374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf[len] = '\0'; 40384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = buf[0] == '-'; 40404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm numnondigits += sign; 40414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm numdigits = len - numnondigits; 40424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(numdigits > 0); 40434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get rid of base marker unless F_ALT */ 40454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((flags & F_ALT) == 0) { 40464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Need to skip 0x, 0X or 0. */ 40474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int skipped = 0; 40484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (type) { 40494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'o': 40504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(buf[sign] == '0'); 40514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If 0 is only digit, leave it alone. */ 40524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (numdigits > 1) { 40534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm skipped = 1; 40544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --numdigits; 40554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 40574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'x': 40584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'X': 40594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(buf[sign] == '0'); 40604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(buf[sign + 1] == 'x'); 40614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm skipped = 2; 40624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm numnondigits -= 2; 40634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 40644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (skipped) { 40664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf += skipped; 40674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len -= skipped; 40684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign) 40694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf[0] = '-'; 40704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(len == numnondigits + numdigits); 40724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(numdigits > 0); 40734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fill with leading zeroes to meet minimum width. */ 40764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (prec > numdigits) { 40774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *r1 = PyString_FromStringAndSize(NULL, 40784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm numnondigits + prec); 40794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *b1; 40804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!r1) { 40814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 40824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 40834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b1 = PyString_AS_STRING(r1); 40854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < numnondigits; ++i) 40864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *b1++ = *buf++; 40874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < prec - numdigits; i++) 40884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *b1++ = '0'; 40894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < numdigits; i++) 40904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *b1++ = *buf++; 40914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *b1 = '\0'; 40924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 40934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = r1; 40944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf = PyString_AS_STRING(result); 40954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = numnondigits + prec; 40964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 40974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 40984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fix up case for hex conversions. */ 40994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (type == 'X') { 41004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Need to convert all lower case letters to upper case. 41014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and need to convert 0x to 0X (and -0x to -0X). */ 41024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < len; i++) 41034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (buf[i] >= 'a' && buf[i] <= 'x') 41044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf[i] -= 'a'-'A'; 41054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *pbuf = buf; 41074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *plen = len; 41084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 41094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(int) 41124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatint(char *buf, size_t buflen, int flags, 41134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int prec, int type, PyObject *v) 41144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* fmt = '%#.' + `prec` + 'l' + `type` 41164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm worst case length = 3 + 19 (worst len of INT_MAX on 64-bit machine) 41174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm + 1 + 1 = 24 */ 41184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fmt[64]; /* plenty big enough! */ 41194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *sign; 41204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long x; 41214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = PyInt_AsLong(v); 41234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x == -1 && PyErr_Occurred()) { 41244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, "int argument required, not %.200s", 41254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(v)->tp_name); 41264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 41274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x < 0 && type == 'u') { 41294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type = 'd'; 41304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (x < 0 && (type == 'x' || type == 'X' || type == 'o')) 41324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = "-"; 41334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 41344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = ""; 41354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (prec < 0) 41364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = 1; 41374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((flags & F_ALT) && 41394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (type == 'x' || type == 'X')) { 41404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* When converting under %#x or %#X, there are a number 41414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of issues that cause pain: 41424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * - when 0 is being converted, the C standard leaves off 41434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the '0x' or '0X', which is inconsistent with other 41444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * %#x/%#X conversions and inconsistent with Python's 41454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * hex() function 41464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * - there are platforms that violate the standard and 41474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * convert 0 with the '0x' or '0X' 41484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * (Metrowerks, Compaq Tru64) 41494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * - there are platforms that give '0x' when converting 41504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * under %#X, but convert 0 in accordance with the 41514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * standard (OS/2 EMX) 41524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 41534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * We can achieve the desired consistency by inserting our 41544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * own '0x' or '0X' prefix, and substituting %x/%X in place 41554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * of %#x/%#X. 41564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 41574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Note that this is the same approach as used in 41584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * formatint() in unicodeobject.c 41594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 41604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(fmt, sizeof(fmt), "%s0%c%%.%dl%c", 41614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign, type, prec, type); 41624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 41644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(fmt, sizeof(fmt), "%s%%%s.%dl%c", 41654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign, (flags&F_ALT) ? "#" : "", 41664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec, type); 41674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* buf = '+'/'-'/'' + '0'/'0x'/'' + '[0-9]'*max(prec, len(x in octal)) 41704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * worst case buf = '-0x' + [0-9]*prec, where prec >= 11 41714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 41724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (buflen <= 14 || buflen <= (size_t)3 + (size_t)prec) { 41734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_OverflowError, 41744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "formatted integer is too long (precision too large?)"); 41754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 41764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign[0]) 41784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(buf, buflen, fmt, -x); 41794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 41804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(buf, buflen, fmt, x); 41814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (int)strlen(buf); 41824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 41844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_LOCAL_INLINE(int) 41854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmformatchar(char *buf, size_t buflen, PyObject *v) 41864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 41874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* presume that the buffer is at least 2 characters long */ 41884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_Check(v)) { 41894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0])) 41904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 41914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 41934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0])) 41944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 41954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 41964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buf[1] = '\0'; 41974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 41984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 41994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) 42014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FORMATBUFLEN is the length of the buffer in which the ints & 42034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm chars are formatted. XXX This is a magic number. Each formatting 42044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm routine does bounds checking to ensure no overflow, but a better 42054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm solution may be to malloc a buffer of appropriate size for each 42064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm format. For now, the current solution is sufficient. 42074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 42084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FORMATBUFLEN (size_t)120 42094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 42114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Format(PyObject *format, PyObject *args) 42124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 42134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *fmt, *res; 42144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t arglen, argidx; 42154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t reslen, rescnt, fmtcnt; 42164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int args_owned = 0; 42174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result, *orig_args; 42184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 42194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v, *w; 42204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 42214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *dict = NULL; 42224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (format == NULL || !PyString_Check(format) || args == NULL) { 42234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_BadInternalCall(); 42244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 42254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm orig_args = args; 42274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt = PyString_AS_STRING(format); 42284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmtcnt = PyString_GET_SIZE(format); 42294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reslen = rescnt = fmtcnt + 100; 42304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyString_FromStringAndSize((char *)NULL, reslen); 42314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 42324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 42334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyString_AsString(result); 42344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(args)) { 42354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglen = PyTuple_GET_SIZE(args); 42364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = 0; 42374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 42394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglen = -1; 42404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = -2; 42414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) && 42434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !PyObject_TypeCheck(args, &PyBaseString_Type)) 42444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dict = args; 42454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--fmtcnt >= 0) { 42464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*fmt != '%') { 42474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (--rescnt < 0) { 42484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt = fmtcnt + 100; 42494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reslen += rescnt; 42504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&result, reslen)) 42514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 42524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyString_AS_STRING(result) 42534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm + reslen - rescnt; 42544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --rescnt; 42554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = *fmt++; 42574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 42594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Got a format specifier */ 42604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int flags = 0; 42614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t width = -1; 42624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int prec = -1; 42634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int c = '\0'; 42644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int fill; 42654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int isnumok; 4266de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel PyObject *v = NULL; 4267de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel PyObject *temp = NULL; 4268de08c53b0f65f212c25f0eea13d6cdf4bd9c7fb4Daryl McDaniel char *pbuf = NULL; 42694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int sign; 42704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t len; 42714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char formatbuf[FORMATBUFLEN]; 42724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* For format{int,char}() */ 42734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 42744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *fmt_start = fmt; 42754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t argidx_start = argidx; 42764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 42774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt++; 42794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*fmt == '(') { 42804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *keystart; 42814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t keylen; 42824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *key; 42834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pcount = 1; 42844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 42854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict == NULL) { 42864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 42874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "format requires a mapping"); 42884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 42894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 42904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++fmt; 42914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --fmtcnt; 42924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm keystart = fmt; 42934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Skip over balanced parentheses */ 42944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (pcount > 0 && --fmtcnt >= 0) { 42954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*fmt == ')') 42964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --pcount; 42974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (*fmt == '(') 42984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ++pcount; 42994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt++; 43004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm keylen = fmt - keystart - 1; 43024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fmtcnt < 0 || pcount > 0) { 43034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 43044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "incomplete format key"); 43054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key = PyString_FromStringAndSize(keystart, 43084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm keylen); 43094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (key == NULL) 43104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args_owned) { 43124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 43134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args_owned = 0; 43144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = PyObject_GetItem(dict, key); 43164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(key); 43174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == NULL) { 43184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args_owned = 1; 43214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglen = -1; 43224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = -2; 43234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--fmtcnt >= 0) { 43254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (c = *fmt++) { 43264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '-': flags |= F_LJUST; continue; 43274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '+': flags |= F_SIGN; continue; 43284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case ' ': flags |= F_BLANK; continue; 43294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '#': flags |= F_ALT; continue; 43304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '0': flags |= F_ZERO; continue; 43314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 43334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == '*') { 43354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = getnextarg(args, arglen, &argidx); 43364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 43374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyInt_Check(v)) { 43394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 43404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "* wants int"); 43414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = PyInt_AsLong(v); 43444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (width < 0) { 43454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags |= F_LJUST; 43464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = -width; 43474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (--fmtcnt >= 0) 43494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = *fmt++; 43504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c >= 0 && isdigit(c)) { 43524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = c - '0'; 43534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--fmtcnt >= 0) { 43544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*fmt++); 43554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isdigit(c)) 43564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 43574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((width*10) / 10 != width) { 43584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString( 43594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyExc_ValueError, 43604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "width too big"); 43614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = width*10 + (c - '0'); 43644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == '.') { 43674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = 0; 43684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (--fmtcnt >= 0) 43694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = *fmt++; 43704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == '*') { 43714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = getnextarg(args, arglen, &argidx); 43724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 43734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyInt_Check(v)) { 43754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString( 43764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyExc_TypeError, 43774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "* wants int"); 43784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = PyInt_AsLong(v); 43814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (prec < 0) 43824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = 0; 43834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (--fmtcnt >= 0) 43844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = *fmt++; 43854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (c >= 0 && isdigit(c)) { 43874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = c - '0'; 43884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--fmtcnt >= 0) { 43894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = Py_CHARMASK(*fmt++); 43904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isdigit(c)) 43914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 43924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((prec*10) / 10 != prec) { 43934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString( 43944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyExc_ValueError, 43954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "prec too big"); 43964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 43974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 43984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec = prec*10 + (c - '0'); 43994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } /* prec */ 44024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fmtcnt >= 0) { 44034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == 'h' || c == 'l' || c == 'L') { 44044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (--fmtcnt >= 0) 44054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = *fmt++; 44064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fmtcnt < 0) { 44094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 44104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "incomplete format"); 44114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 44124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c != '%') { 44144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = getnextarg(args, arglen, &argidx); 44154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 44164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 44174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = 0; 44194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill = ' '; 44204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (c) { 44214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case '%': 44224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf = "%"; 44234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = 1; 44244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 44254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 's': 44264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 44274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(v)) { 44284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt = fmt_start; 44294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = argidx_start; 44304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto unicode; 44314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 44334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = _PyObject_Str(v); 44344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 44354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp != NULL && PyUnicode_Check(temp)) { 44364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 44374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt = fmt_start; 44384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = argidx_start; 44394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto unicode; 44404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 44424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fall through */ 44434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'r': 44444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == 'r') 44454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = PyObject_Repr(v); 44464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp == NULL) 44474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 44484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(temp)) { 44494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 44504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%s argument has non-string str()"); 44514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(temp); 44524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 44534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf = PyString_AS_STRING(temp); 44554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = PyString_GET_SIZE(temp); 44564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (prec >= 0 && len > prec) 44574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = prec; 44584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 44594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'i': 44604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'd': 44614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'u': 44624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'o': 44634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'x': 44644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'X': 44654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (c == 'i') 44664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = 'd'; 44674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isnumok = 0; 44684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyNumber_Check(v)) { 44694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *iobj=NULL; 44704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyInt_Check(v) || (PyLong_Check(v))) { 44724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iobj = v; 44734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(iobj); 44744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 44764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iobj = PyNumber_Int(v); 44774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (iobj==NULL) iobj = PyNumber_Long(v); 44784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (iobj!=NULL) { 44804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyInt_Check(iobj)) { 44814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isnumok = 1; 44824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf = formatbuf; 44834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = formatint(pbuf, 44844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(formatbuf), 44854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags, prec, c, iobj); 44864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(iobj); 44874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 0) 44884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 44894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = 1; 44904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 44914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyLong_Check(iobj)) { 44924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int ilen; 44934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm isnumok = 1; 44954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = _PyString_FormatLong(iobj, flags, 44964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm prec, c, &pbuf, &ilen); 44974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(iobj); 44984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = ilen; 44994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!temp) 45004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 45014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = 1; 45024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 45044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(iobj); 45054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!isnumok) { 45094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 45104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%%%c format: a number is required, " 45114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not %.200s", c, Py_TYPE(v)->tp_name); 45124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 45134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags & F_ZERO) 45154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill = '0'; 45164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 45174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'e': 45184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'E': 45194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'f': 45204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'F': 45214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'g': 45224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'G': 45234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = formatfloat(v, flags, prec, c); 45244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp == NULL) 45254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 45264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf = PyString_AS_STRING(temp); 45274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = PyString_GET_SIZE(temp); 45284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = 1; 45294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags & F_ZERO) 45304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fill = '0'; 45314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 45324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case 'c': 45334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 45344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(v)) { 45354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmt = fmt_start; 45364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argidx = argidx_start; 45374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto unicode; 45384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 45404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pbuf = formatbuf; 45414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = formatchar(pbuf, sizeof(formatbuf), v); 45424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (len < 0) 45434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 45444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 45454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 45464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_ValueError, 45474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "unsupported format character '%c' (0x%x) " 45484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "at index %zd", 45494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c, c, 45504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Py_ssize_t)(fmt - 1 - 45514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_AsString(format))); 45524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 45534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign) { 45554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*pbuf == '-' || *pbuf == '+') { 45564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = *pbuf++; 45574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len--; 45584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (flags & F_SIGN) 45604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = '+'; 45614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (flags & F_BLANK) 45624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = ' '; 45634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 45644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sign = 0; 45654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (width < len) 45674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = len; 45684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (rescnt - (sign != 0) < width) { 45694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reslen -= rescnt; 45704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt = width + fmtcnt + 100; 45714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm reslen += rescnt; 45724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (reslen < 0) { 45734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 45744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(temp); 45754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_NoMemory(); 45764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&result, reslen)) { 45784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(temp); 45794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 45804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyString_AS_STRING(result) 45824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm + reslen - rescnt; 45834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign) { 45854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fill != ' ') 45864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = sign; 45874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt--; 45884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (width > len) 45894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width--; 45904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((flags & F_ALT) && (c == 'x' || c == 'X')) { 45924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(pbuf[0] == '0'); 45934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(pbuf[1] == c); 45944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fill != ' ') { 45954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = *pbuf++; 45964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = *pbuf++; 45974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 45984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt -= 2; 45994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width -= 2; 46004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (width < 0) 46014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm width = 0; 46024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len -= 2; 46034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (width > len && !(flags & F_LJUST)) { 46054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { 46064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --rescnt; 46074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = fill; 46084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (--width > len); 46094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fill == ' ') { 46114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sign) 46124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = sign; 46134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((flags & F_ALT) && 46144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (c == 'x' || c == 'X')) { 46154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(pbuf[0] == '0'); 46164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(pbuf[1] == c); 46174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = *pbuf++; 46184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = *pbuf++; 46194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_MEMCPY(res, pbuf, len); 46224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res += len; 46234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt -= len; 46244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--width >= len) { 46254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --rescnt; 46264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *res++ = ' '; 46274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dict && (argidx < arglen) && c != '%') { 46294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 46304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not all arguments converted during string formatting"); 46314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(temp); 46324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(temp); 46354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } /* '%' */ 46364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } /* until end */ 46374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argidx < arglen && !dict) { 46384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 46394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "not all arguments converted during string formatting"); 46404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args_owned) { 46434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 46444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&result, reslen - rescnt)) 46464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 46474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 46484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 46504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unicode: 46514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args_owned) { 46524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 46534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args_owned = 0; 46544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Fiddle args right (remove the first argidx arguments) */ 46564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(orig_args) && argidx > 0) { 46574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 46584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n = PyTuple_GET_SIZE(orig_args) - argidx; 46594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyTuple_New(n); 46604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 46614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (--n >= 0) { 46634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *w = PyTuple_GET_ITEM(orig_args, n + argidx); 46644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(w); 46654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(v, n, w); 46664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = v; 46684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 46694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(orig_args); 46704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args = orig_args; 46714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 46724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args_owned = 1; 46734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Take what we have of the result and let the Unicode formatting 46744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function format the rest of the input. */ 46754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rescnt = res - PyString_AS_STRING(result); 46764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (_PyString_Resize(&result, rescnt)) 46774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fmtcnt = PyString_GET_SIZE(format) - \ 46794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (fmt - PyString_AS_STRING(format)); 46804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL); 46814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (format == NULL) 46824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyUnicode_Format(format, args); 46844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(format); 46854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 46864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto error; 46874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Paste what we have (result) to what the Unicode formatting 46884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm function returned (v) and return the result (or error) */ 46894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = PyUnicode_Concat(result, v); 46904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 46914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 46924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 46934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return w; 46944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_USING_UNICODE */ 46954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 46964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm error: 46974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 46984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args_owned) { 46994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 47004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 47024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 47034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 47054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternInPlace(PyObject **p) 47064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 47074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm register PyStringObject *s = (PyStringObject *)(*p); 47084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *t; 47094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL || !PyString_Check(s)) 47104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("PyString_InternInPlace: strings only please!"); 47114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If it's a string subclass, we don't really know what putting 47124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm it in the interned dict might do. */ 47134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_CheckExact(s)) 47144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CHECK_INTERNED(s)) 47164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interned == NULL) { 47184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interned = PyDict_New(); 47194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interned == NULL) { 47204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); /* Don't leave an exception */ 47214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t = PyDict_GetItem(interned, (PyObject *)s); 47254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (t) { 47264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(t); 47274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(*p); 47284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *p = t; 47294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItem(interned, (PyObject *)s, (PyObject *)s) < 0) { 47334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 47344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The two references in interned are not counted by refcnt. 47374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The string deallocator will take care of this */ 47384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_REFCNT(s) -= 2; 47394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_CHECK_INTERNED(s) = SSTATE_INTERNED_MORTAL; 47404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 47414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 47434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternImmortal(PyObject **p) 47444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 47454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(p); 47464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyString_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) { 47474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_CHECK_INTERNED(*p) = SSTATE_INTERNED_IMMORTAL; 47484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(*p); 47494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 47514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 47544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_InternFromString(const char *cp) 47554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 47564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *s = PyString_FromString(cp); 47574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) 47584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 47594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_InternInPlace(&s); 47604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return s; 47614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 47624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 47644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyString_Fini(void) 47654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 47664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 47674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < UCHAR_MAX + 1; i++) { 47684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(characters[i]); 47694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm characters[i] = NULL; 47704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(nullstring); 47724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nullstring = NULL; 47734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 47744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid _Py_ReleaseInternedStrings(void) 47764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 47774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *keys; 47784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStringObject *s; 47794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, n; 47804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t immortal_size = 0, mortal_size = 0; 47814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interned == NULL || !PyDict_Check(interned)) 47834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm keys = PyDict_Keys(interned); 47854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (keys == NULL || !PyList_Check(keys)) { 47864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 47874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 47884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 47894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Since _Py_ReleaseInternedStrings() is intended to help a leak 47914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm detector, interned strings are not forcibly deallocated; rather, we 47924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm give them their stolen references back, and then clear and DECREF 47934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the interned dict. */ 47944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 47954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = PyList_GET_SIZE(keys); 47964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", 47974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n); 47984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < n; i++) { 47994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = (PyStringObject *) PyList_GET_ITEM(keys, i); 48004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (s->ob_sstate) { 48014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_NOT_INTERNED: 48024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX Shouldn't happen */ 48034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_INTERNED_IMMORTAL: 48054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_REFCNT(s) += 1; 48064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm immortal_size += Py_SIZE(s); 48074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SSTATE_INTERNED_MORTAL: 48094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_REFCNT(s) += 2; 48104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mortal_size += Py_SIZE(s); 48114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 48124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 48134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Inconsistent interned string state."); 48144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 48154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s->ob_sstate = SSTATE_NOT_INTERNED; 48164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 48174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "total size of all interned strings: " 48184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d " 48194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "mortal/immortal\n", mortal_size, immortal_size); 48204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(keys); 48214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_Clear(interned); 48224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(interned); 48234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interned = NULL; 48244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4825