diff options
author | Guido van Rossum <guido@python.org> | 2007-05-09 23:38:34 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-05-09 23:38:34 (GMT) |
commit | ccf4f0f68d2ab18114331e5d7551a6e8320ac26a (patch) | |
tree | d2652987522ed216b2ea3644ce15e8cffa67a30f /Parser | |
parent | 83857e3bf316cf09f06dd46513fe08773ed0f51b (diff) | |
download | cpython-ccf4f0f68d2ab18114331e5d7551a6e8320ac26a.zip cpython-ccf4f0f68d2ab18114331e5d7551a6e8320ac26a.tar.gz cpython-ccf4f0f68d2ab18114331e5d7551a6e8320ac26a.tar.bz2 |
Use AsCharBuffer to get a C string out of a Python string.
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/tokenizer.c | 45 |
1 files changed, 16 insertions, 29 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 0428e01..a43094b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -355,44 +355,31 @@ check_bom(int get_char(struct tok_state *), static char * fp_readl(char *s, int size, struct tok_state *tok) { - PyObject* utf8 = NULL; - PyObject* buf = tok->decoding_buffer; - char *str; - Py_ssize_t utf8len; + PyObject* bufobj = tok->decoding_buffer; + const char *buf; + Py_ssize_t buflen; /* Ask for one less byte so we can terminate it */ assert(size > 0); size--; - if (buf == NULL) { - buf = PyObject_CallObject(tok->decoding_readline, NULL); - if (buf == NULL) - return error_ret(tok); - } else { - tok->decoding_buffer = NULL; - if (PyString_CheckExact(buf)) - utf8 = buf; - } - if (utf8 == NULL) { - utf8 = PyUnicode_AsUTF8String(buf); - Py_DECREF(buf); - if (utf8 == NULL) + if (bufobj == NULL) { + bufobj = PyObject_CallObject(tok->decoding_readline, NULL); + if (bufobj == NULL) return error_ret(tok); } - str = PyString_AsString(utf8); - utf8len = PyString_GET_SIZE(utf8); - if (utf8len > size) { - tok->decoding_buffer = PyString_FromStringAndSize(str+size, utf8len-size); - if (tok->decoding_buffer == NULL) { - Py_DECREF(utf8); + if (PyObject_AsCharBuffer(bufobj, &buf, &buflen) < 0) + return error_ret(tok); + if (buflen > size) { + tok->decoding_buffer = PyBytes_FromStringAndSize(buf+size, + buflen-size); + if (tok->decoding_buffer == NULL) return error_ret(tok); - } - utf8len = size; + buflen = size; } - memcpy(s, str, utf8len); - s[utf8len] = '\0'; - Py_DECREF(utf8); - if (utf8len == 0) return NULL; /* EOF */ + memcpy(s, buf, buflen); + s[buflen] = '\0'; + if (buflen == 0) return NULL; /* EOF */ return s; } |