summaryrefslogtreecommitdiff
path: root/Objects
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2008-06-01 07:20:46 +0000
committerMartin v. Löwis <martin@v.loewis.de>2008-06-01 07:20:46 +0000
commita1d5bda7008085458e5ab576d22f6586b86e5eb9 (patch)
tree97ee6704841edae6d78a9b4d1f6aeba9c575f497 /Objects
parent6a8ccff8fa45cf6fb872eb9766511b28444a477c (diff)
downloadcpython-a1d5bda7008085458e5ab576d22f6586b86e5eb9.tar.gz
New environment variable PYTHONIOENCODING.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/fileobject.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 86f3a1420d..4ea97f5de9 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -155,6 +155,7 @@ fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
Py_DECREF(f->f_name);
Py_DECREF(f->f_mode);
Py_DECREF(f->f_encoding);
+ Py_DECREF(f->f_errors);
Py_INCREF(name);
f->f_name = name;
@@ -170,6 +171,8 @@ fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
f->f_skipnextlf = 0;
Py_INCREF(Py_None);
f->f_encoding = Py_None;
+ Py_INCREF(Py_None);
+ f->f_errors = Py_None;
if (f->f_mode == NULL)
return NULL;
@@ -435,19 +438,38 @@ PyFile_SetBufSize(PyObject *f, int bufsize)
}
/* Set the encoding used to output Unicode strings.
- Returh 1 on success, 0 on failure. */
+ Return 1 on success, 0 on failure. */
int
PyFile_SetEncoding(PyObject *f, const char *enc)
{
+ return PyFile_SetEncodingAndErrors(f, enc, NULL);
+}
+
+int
+PyFile_SetEncodingAndErrors(PyObject *f, const char *enc, char* errors)
+{
PyFileObject *file = (PyFileObject*)f;
- PyObject *str = PyBytes_FromString(enc);
+ PyObject *str, *oerrors;
assert(PyFile_Check(f));
+ str = PyBytes_FromString(enc);
if (!str)
return 0;
+ if (errors) {
+ oerrors = PyString_FromString(errors);
+ if (!oerrors) {
+ Py_DECREF(str);
+ return 0;
+ }
+ } else {
+ oerrors = Py_None;
+ Py_INCREF(Py_None);
+ }
Py_DECREF(file->f_encoding);
file->f_encoding = str;
+ Py_DECREF(file->f_errors);
+ file->f_errors = oerrors;
return 1;
}
@@ -491,6 +513,7 @@ file_dealloc(PyFileObject *f)
Py_XDECREF(f->f_name);
Py_XDECREF(f->f_mode);
Py_XDECREF(f->f_encoding);
+ Py_XDECREF(f->f_errors);
drop_readahead(f);
Py_TYPE(f)->tp_free((PyObject *)f);
}
@@ -1879,6 +1902,8 @@ static PyMemberDef file_memberlist[] = {
"file name"},
{"encoding", T_OBJECT, OFF(f_encoding), RO,
"file encoding"},
+ {"errors", T_OBJECT, OFF(f_errors), RO,
+ "Unicode error handler"},
/* getattr(f, "closed") is implemented without this table */
{NULL} /* Sentinel */
};
@@ -2093,6 +2118,8 @@ file_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
((PyFileObject *)self)->f_mode = not_yet_string;
Py_INCREF(Py_None);
((PyFileObject *)self)->f_encoding = Py_None;
+ Py_INCREF(Py_None);
+ ((PyFileObject *)self)->f_errors = Py_None;
((PyFileObject *)self)->weakreflist = NULL;
((PyFileObject *)self)->unlocked_count = 0;
}
@@ -2295,7 +2322,9 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags)
if ((flags & Py_PRINT_RAW) &&
PyUnicode_Check(v) && enc != Py_None) {
char *cenc = PyBytes_AS_STRING(enc);
- value = PyUnicode_AsEncodedString(v, cenc, "strict");
+ char *errors = fobj->f_errors == Py_None ?
+ "strict" : PyBytes_AS_STRING(fobj->f_errors);
+ value = PyUnicode_AsEncodedString(v, cenc, errors);
if (value == NULL)
return -1;
} else {