summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2007-12-10 15:12:41 (GMT)
committerChristian Heimes <christian@cheimes.de>2007-12-10 15:12:41 (GMT)
commit7c7f6afa928c24221f8463a1aa71fc6ef532d29e (patch)
tree8def7775fe40f5b218b9c3cae34527cc714e7ec6
parente6daafb449c57f3fafd11c2513f96bf6f6ca130e (diff)
downloadcpython-7c7f6afa928c24221f8463a1aa71fc6ef532d29e.zip
cpython-7c7f6afa928c24221f8463a1aa71fc6ef532d29e.tar.gz
cpython-7c7f6afa928c24221f8463a1aa71fc6ef532d29e.tar.bz2
Added wide char api variants of getch and putch to msvcrt module. The wide char methods are required to fix #1578 in py3k. I figured out that they might be useful in 2.6, too.
-rw-r--r--Doc/library/msvcrt.rst32
-rw-r--r--Misc/NEWS3
-rwxr-xr-xPC/msvcrtmodule.c69
3 files changed, 104 insertions, 0 deletions
diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst
index d43bb4c..9fa49da 100644
--- a/Doc/library/msvcrt.rst
+++ b/Doc/library/msvcrt.rst
@@ -16,6 +16,10 @@ this in the implementation of the :func:`getpass` function.
Further documentation on these functions can be found in the Platform API
documentation.
+The module implements both the normal and wide char variants of the console I/O
+api. The normal API deals only with ASCII characters and is of limited use
+for internationalized applications. The wide char API should be used where
+ever possible
.. _msvcrt-files:
@@ -94,6 +98,13 @@ Console I/O
return the keycode. The :kbd:`Control-C` keypress cannot be read with this
function.
+
+.. function:: getwch()
+
+ Wide char variant of `func:getch`, returns unicode.
+
+ ..versionadded:: 2.6
+
.. function:: getche()
@@ -101,16 +112,37 @@ Console I/O
printable character.
+.. function:: getwche()
+
+ Wide char variant of `func:getche`, returns unicode.
+
+ ..versionadded:: 2.6
+
+
.. function:: putch(char)
Print the character *char* to the console without buffering.
+
+.. function:: putwch(unicode_char)
+
+ Wide char variant of `func:putch`, accepts unicode.
+
+ ..versionadded:: 2.6
+
.. function:: ungetch(char)
Cause the character *char* to be "pushed back" into the console buffer; it will
be the next character read by :func:`getch` or :func:`getche`.
+
+.. function:: ungetwch(unicode_char)
+
+ Wide char variant of `func:ungetch`, accepts unicode.
+
+ ..versionadded:: 2.6
+
.. _msvcrt-other:
diff --git a/Misc/NEWS b/Misc/NEWS
index 4db5c3d..c086be9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -877,6 +877,9 @@ Library
Extension Modules
-----------------
+- Added wide char functions to msvcrt module: getwch, getwche, putwch and
+ ungetwch. The functions accept or return unicode.
+
- os.access now returns True on Windows for any existing directory.
- Added warnpy3k function to the warnings module.
diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index 3311bd7..982c458 100755
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -144,6 +144,22 @@ msvcrt_getch(PyObject *self, PyObject *args)
}
static PyObject *
+msvcrt_getwch(PyObject *self, PyObject *args)
+{
+ Py_UNICODE ch;
+ Py_UNICODE u[1];
+
+ if (!PyArg_ParseTuple(args, ":getwch"))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ ch = _getwch();
+ Py_END_ALLOW_THREADS
+ u[0] = ch;
+ return PyUnicode_FromUnicode(u, 1);
+}
+
+static PyObject *
msvcrt_getche(PyObject *self, PyObject *args)
{
int ch;
@@ -160,6 +176,22 @@ msvcrt_getche(PyObject *self, PyObject *args)
}
static PyObject *
+msvcrt_getwche(PyObject *self, PyObject *args)
+{
+ Py_UNICODE ch;
+ Py_UNICODE s[1];
+
+ if (!PyArg_ParseTuple(args, ":getwche"))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ ch = _getwche();
+ Py_END_ALLOW_THREADS
+ s[0] = ch;
+ return PyUnicode_FromUnicode(s, 1);
+}
+
+static PyObject *
msvcrt_putch(PyObject *self, PyObject *args)
{
char ch;
@@ -172,6 +204,25 @@ msvcrt_putch(PyObject *self, PyObject *args)
return Py_None;
}
+
+static PyObject *
+msvcrt_putwch(PyObject *self, PyObject *args)
+{
+ Py_UNICODE *ch;
+ int size;
+
+ if (!PyArg_ParseTuple(args, "u#:putwch", &ch, &size))
+ return NULL;
+
+ if (size == 1)
+ _putwch(*ch);
+ Py_RETURN_NONE;
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "Expected unicode of length 1");
+ }
+}
+
static PyObject *
msvcrt_ungetch(PyObject *self, PyObject *args)
{
@@ -186,6 +237,19 @@ msvcrt_ungetch(PyObject *self, PyObject *args)
return Py_None;
}
+static PyObject *
+msvcrt_ungetwch(PyObject *self, PyObject *args)
+{
+ Py_UNICODE ch;
+
+ if (!PyArg_ParseTuple(args, "u:ungetwch", &ch))
+ return NULL;
+
+ if (_ungetch(ch) == EOF)
+ return PyErr_SetFromErrno(PyExc_IOError);
+ Py_INCREF(Py_None);
+ return Py_None;
+}
static void
insertint(PyObject *d, char *name, int value)
@@ -214,6 +278,11 @@ static struct PyMethodDef msvcrt_functions[] = {
{"getche", msvcrt_getche, METH_VARARGS},
{"putch", msvcrt_putch, METH_VARARGS},
{"ungetch", msvcrt_ungetch, METH_VARARGS},
+ {"getwch", msvcrt_getwch, METH_VARARGS},
+ {"getwche", msvcrt_getwche, METH_VARARGS},
+ {"putwch", msvcrt_putwch, METH_VARARGS},
+ {"ungetwch", msvcrt_ungetwch, METH_VARARGS},
+
{NULL, NULL}
};