[Python-checkins] r82904 - python/branches/import_unicode/Modules/zipimport.c
victor.stinner
python-checkins at python.org
Wed Jul 14 22:38:19 CEST 2010
Author: victor.stinner
Date: Wed Jul 14 22:38:19 2010
New Revision: 82904
Log:
read_directory() now takes an object
Modified:
python/branches/import_unicode/Modules/zipimport.c
Modified: python/branches/import_unicode/Modules/zipimport.c
==============================================================================
--- python/branches/import_unicode/Modules/zipimport.c (original)
+++ python/branches/import_unicode/Modules/zipimport.c Wed Jul 14 22:38:19 2010
@@ -45,7 +45,7 @@
/* forward decls */
extern FILE* _Py_fopen(PyObject *unicode, const char *mode);
-static PyObject *read_directory(char *archive);
+static PyObject *read_directory(PyObject *archive);
static PyObject *get_data(PyObject *archive, PyObject *toc_entry);
static PyObject *get_module_code(ZipImporter *self, char *fullname,
int *p_ispackage, PyObject **p_modpath);
@@ -121,7 +121,12 @@
PyObject *files;
files = PyDict_GetItemString(zip_directory_cache, path);
if (files == NULL) {
- files = read_directory(buf);
+ PyObject *bufobj;
+ bufobj = PyUnicode_DecodeFSDefault(buf);
+ if (bufobj == NULL)
+ return -1;
+ files = read_directory(bufobj);
+ Py_DECREF(bufobj);
if (files == NULL)
return -1;
if (PyDict_SetItemString(zip_directory_cache, path,
@@ -679,8 +684,9 @@
data_size and file_offset are 0.
*/
static PyObject *
-read_directory(char *archive)
+read_directory(PyObject *archive_obj)
{
+ /* FIXME: work on Py_UNICODE* instead of char* */
PyObject *files = NULL;
FILE *fp;
long compress, crc, data_size, file_size, file_offset, date, time;
@@ -691,18 +697,25 @@
char name[MAXPATHLEN + 5];
char *p, endof_central_dir[22];
long arc_offset; /* offset from beginning of file to start of zip-archive */
+ PyObject *archive_bytes;
+
+ archive_bytes = PyUnicode_EncodeFSDefault(archive_obj);
+ if (archive_bytes == NULL)
+ return NULL;
- if (strlen(archive) > MAXPATHLEN) {
+ if (PyBytes_GET_SIZE(archive_bytes) > MAXPATHLEN) {
PyErr_SetString(PyExc_OverflowError,
"Zip path name is too long");
+ Py_DECREF(archive_bytes);
return NULL;
}
- strcpy(path, archive);
+ strcpy(path, PyBytes_AsString(archive_bytes));
+ Py_DECREF(archive_bytes);
- fp = fopen(archive, "rb");
+ fp = _Py_fopen(archive_obj, "rb");
if (fp == NULL) {
PyErr_Format(ZipImportError, "can't open Zip file: "
- "'%.200s'", archive);
+ "'%.200U'", archive_obj);
return NULL;
}
fseek(fp, -22, SEEK_END);
@@ -710,14 +723,14 @@
if (fread(endof_central_dir, 1, 22, fp) != 22) {
fclose(fp);
PyErr_Format(ZipImportError, "can't read Zip file: "
- "'%.200s'", archive);
+ "'%.200U'", archive_obj);
return NULL;
}
if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) {
/* Bad: End of Central Dir signature */
fclose(fp);
PyErr_Format(ZipImportError, "not a Zip file: "
- "'%.200s'", archive);
+ "'%.200U'", archive_obj);
return NULL;
}
@@ -783,8 +796,8 @@
}
fclose(fp);
if (Py_VerboseFlag)
- PySys_WriteStderr("# zipimport: found %ld names in %s\n",
- count, archive);
+ PySys_FormatStderr("# zipimport: found %ld names in %U\n",
+ count, archive_obj);
return files;
error:
fclose(fp);
More information about the Python-checkins
mailing list