diff Python/getargs.c @ 42997:b9226cad9dfd

Three patches from issue #1047, by Amaury Forgeot d'Arc: 1/ getargs.diff adds the 'Z' and 'Z#' format specifiers for PyArg_ParseTuple. They mimic z and z# for unicode strings, by accepting a Unicode or None (in which case the Py_UNICODE* pointer is set to NULL). With doc and tests. 2/ subprocess.diff converts file PC/_subprocess.c to unicode. We use the Unicode version of the win32 api (and Z conversion from previous patch) 3/ stdout.diff: sys.stdout must not convert the line endings, Windows already does it. Without this patch, when redirecting the output of python, the file contains \r\r\n for each line. (test_subprocess did catch this) However, I (GvR) removed the change to _fileio.c (included in the patches) that prevents closing file descripors < 3 from being closed; I think that needs to be solved in a different way.
author Guido van Rossum <guido@python.org>
date Wed, 29 Aug 2007 18:38:11 +0000
parents 85c22b4d4455
children 85a678579983
line wrap: on
line diff
--- a/Python/getargs.c	Wed Aug 29 18:31:16 2007 +0000
+++ b/Python/getargs.c	Wed Aug 29 18:38:11 2007 +0000
@@ -921,6 +921,34 @@
 		break;
 	}
 	
+	case 'Z': {/* unicode, may be NULL (None) */
+		if (*format == '#') { /* any buffer-like object */
+			Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
+			FETCH_SIZE;
+			
+			if (arg == Py_None) {
+				*p = 0;
+				STORE_SIZE(0);
+			}
+			else if (PyUnicode_Check(arg)) {
+				*p = PyUnicode_AS_UNICODE(arg);
+				STORE_SIZE(PyUnicode_GET_SIZE(arg));
+			}
+			format++;
+		} else {
+			Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
+			
+			if (arg == Py_None)
+				*p = 0;
+			else if (PyUnicode_Check(arg))
+				*p = PyUnicode_AS_UNICODE(arg);
+			else
+				return converterr("string or None", 
+						  arg, msgbuf, bufsize);
+		}
+		break;
+	}
+	
 	case 'e': {/* encoded string */
 		char **buffer;
 		const char *encoding;