diff options
author | Guido van Rossum <guido@python.org> | 2007-05-22 01:29:33 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-05-22 01:29:33 (GMT) |
commit | d6ca5460914926e54c2a063728a6c785ced8a702 (patch) | |
tree | 2d56c7e93b4cc7b37233d6fd33b5b035d8445945 /Modules/_struct.c | |
parent | 94ca1c620ebc63b0860579835f2c16fe056e1225 (diff) | |
download | cpython-d6ca5460914926e54c2a063728a6c785ced8a702.zip cpython-d6ca5460914926e54c2a063728a6c785ced8a702.tar.gz cpython-d6ca5460914926e54c2a063728a6c785ced8a702.tar.bz2 |
Make test_zipfile pass.
The zipfile module now does all I/O in binary mode using bytes.
(Maybe we should support wrapping a TextIOWrapper around it
when text mode reading is requested?)
Even the password is a bytes array now.
Had to fix py_compile.py to use bytes while I was at it.
The _struct needed a patch to support bytes, str8 and str
for the 's' and 'p' formats.
Diffstat (limited to 'Modules/_struct.c')
-rw-r--r-- | Modules/_struct.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c index a790e52..b9c29d5 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1635,27 +1635,57 @@ s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) const formatdef *e = code->fmtdef; char *res = buf + code->offset; if (e->format == 's') { - if (!PyString_Check(v)) { + int isstring; + void *p; + if (PyUnicode_Check(v)) { + v = _PyUnicode_AsDefaultEncodedString(v, NULL); + if (v == NULL) + return -1; + } + isstring = PyString_Check(v); + if (!isstring && !PyBytes_Check(v)) { PyErr_SetString(StructError, "argument for 's' must be a string"); return -1; } - n = PyString_GET_SIZE(v); + if (isstring) { + n = PyString_GET_SIZE(v); + p = PyString_AS_STRING(v); + } + else { + n = PyBytes_GET_SIZE(v); + p = PyBytes_AS_STRING(v); + } if (n > code->size) n = code->size; if (n > 0) - memcpy(res, PyString_AS_STRING(v), n); + memcpy(res, p, n); } else if (e->format == 'p') { - if (!PyString_Check(v)) { + int isstring; + void *p; + if (PyUnicode_Check(v)) { + v = _PyUnicode_AsDefaultEncodedString(v, NULL); + if (v == NULL) + return -1; + } + isstring = PyString_Check(v); + if (!isstring && !PyBytes_Check(v)) { PyErr_SetString(StructError, "argument for 'p' must be a string"); return -1; } - n = PyString_GET_SIZE(v); + if (isstring) { + n = PyString_GET_SIZE(v); + p = PyString_AS_STRING(v); + } + else { + n = PyBytes_GET_SIZE(v); + p = PyBytes_AS_STRING(v); + } if (n > (code->size - 1)) n = code->size - 1; if (n > 0) - memcpy(res + 1, PyString_AS_STRING(v), n); + memcpy(res + 1, p, n); if (n > 255) n = 255; *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char); |