From 6f15e5796e89163bd9b5be7a3f7334d17f2c50c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lemburg?= Date: Wed, 2 May 2001 17:16:16 +0000 Subject: Added new parser markers 'et' and 'et#' which do not recode string objects but instead assume that they use the requested encoding. This is needed on Windows to enable opening files by passing in Unicode file names. --- Python/getargs.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'Python/getargs.c') diff --git a/Python/getargs.c b/Python/getargs.c index 00f298a627..6eabd75b4d 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -687,25 +687,39 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va) char **buffer; const char *encoding; PyObject *u, *s; - int size; + int size, recode_strings; /* Get 'e' parameter: the encoding name */ encoding = (const char *)va_arg(*p_va, const char *); if (encoding == NULL) encoding = PyUnicode_GetDefaultEncoding(); - /* Get 's' parameter: the output buffer to use */ + /* Get output buffer parameter: + 's' (recode all objects via Unicode) or + 't' (only recode non-string objects) + */ if (*format != 's') + recode_strings = 1; + else if (*format == 't') + recode_strings = 0; + else return "(unknown parser marker combination)"; buffer = (char **)va_arg(*p_va, char **); format++; if (buffer == NULL) return "(buffer is NULL)"; + /* Encode object */ + if (!recode_strings && PyString_Check(arg)) { + s = arg; + Py_INCREF(s); + } + else { /* Convert object to Unicode */ u = PyUnicode_FromObject(arg); if (u == NULL) - return "string or unicode or text buffer"; + return \ + "string or unicode or text buffer"; /* Encode object; use default error handling */ s = PyUnicode_AsEncodedString(u, @@ -716,7 +730,9 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va) return "(encoding failed)"; if (!PyString_Check(s)) { Py_DECREF(s); - return "(encoder failed to return a string)"; + return \ + "(encoder failed to return a string)"; + } } size = PyString_GET_SIZE(s); -- cgit v1.2.1