]> granicus.if.org Git - python/commitdiff
Added wide char api variants of getch and putch to msvcrt module. The wide char metho...
authorChristian Heimes <christian@cheimes.de>
Mon, 10 Dec 2007 15:12:41 +0000 (15:12 +0000)
committerChristian Heimes <christian@cheimes.de>
Mon, 10 Dec 2007 15:12:41 +0000 (15:12 +0000)
Doc/library/msvcrt.rst
Misc/NEWS
PC/msvcrtmodule.c

index d43bb4c60f1056aed85b5b2dbb01ab2e78d2fabf..9fa49daf27f79873767199a7d8cf32ca34feb6e6 100644 (file)
@@ -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:
 
index 4db5c3d4ca6ecc801bd2427a987b8c07ca4a0150..c086be9d94a041939e72cc2de6e5eb4f8de8ed54 100644 (file)
--- 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.
index 3311bd7fb4b2af638376459a875bef24451e7e9d..982c45879eacad3f3336129b8d27cf3ca64ab4f3 100755 (executable)
@@ -143,6 +143,22 @@ msvcrt_getch(PyObject *self, PyObject *args)
        return PyString_FromStringAndSize(s, 1);
 }
 
+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)
 {
@@ -159,6 +175,22 @@ msvcrt_getche(PyObject *self, PyObject *args)
        return PyString_FromStringAndSize(s, 1);
 }
 
+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)
 {
@@ -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}
 };