summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-05-09 23:38:34 (GMT)
committerGuido van Rossum <guido@python.org>2007-05-09 23:38:34 (GMT)
commitccf4f0f68d2ab18114331e5d7551a6e8320ac26a (patch)
treed2652987522ed216b2ea3644ce15e8cffa67a30f /Parser
parent83857e3bf316cf09f06dd46513fe08773ed0f51b (diff)
downloadcpython-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.c45
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;
}