summaryrefslogtreecommitdiffstats
path: root/PC/msvcrtmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'PC/msvcrtmodule.c')
-rw-r--r--PC/msvcrtmodule.c694
1 files changed, 249 insertions, 445 deletions
diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index c4113e5..44c82e4 100644
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -21,521 +21,347 @@
#include <io.h>
#include <conio.h>
#include <sys/locking.h>
-#include <crtdbg.h>
-#include <windows.h>
#ifdef _MSC_VER
#if _MSC_VER >= 1500 && _MSC_VER < 1600
#include <crtassem.h>
-#elif _MSC_VER >= 1600
-#include <crtversion.h>
#endif
#endif
-/*[python input]
-class HANDLE_converter(CConverter):
- type = 'void *'
- format_unit = '"_Py_PARSE_UINTPTR"'
-
-class HANDLE_return_converter(CReturnConverter):
- type = 'void *'
-
- def render(self, function, data):
- self.declare(data)
- self.err_occurred_if(
- "_return_value == NULL || _return_value == INVALID_HANDLE_VALUE",
- data)
- data.return_conversion.append(
- 'return_value = PyLong_FromVoidPtr(_return_value);\n')
-
-class byte_char_return_converter(CReturnConverter):
- type = 'int'
-
- def render(self, function, data):
- data.declarations.append('char s[1];')
- data.return_value = 's[0]'
- data.return_conversion.append(
- 'return_value = PyBytes_FromStringAndSize(s, 1);\n')
-
-class wchar_t_return_converter(CReturnConverter):
- type = 'wchar_t'
-
- def render(self, function, data):
- self.declare(data)
- data.return_conversion.append(
- 'return_value = PyUnicode_FromOrdinal(_return_value);\n')
-[python start generated code]*/
-/*[python end generated code: output=da39a3ee5e6b4b0d input=d102511df3cda2eb]*/
-
-/*[clinic input]
-module msvcrt
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f31a87a783d036cd]*/
-
-#include "clinic/msvcrtmodule.c.h"
-
-/*[clinic input]
-msvcrt.heapmin
-
-Minimize the malloc() heap.
-
-Force the malloc() heap to clean itself up and return unused blocks
-to the operating system. On failure, this raises OSError.
-[clinic start generated code]*/
-
+// Force the malloc heap to clean itself up, and free unused blocks
+// back to the OS. (According to the docs, only works on NT.)
static PyObject *
-msvcrt_heapmin_impl(PyObject *module)
-/*[clinic end generated code: output=1ba00f344782dc19 input=82e1771d21bde2d8]*/
+msvcrt_heapmin(PyObject *self, PyObject *args)
{
+ if (!PyArg_ParseTuple(args, ":heapmin"))
+ return NULL;
+
if (_heapmin() != 0)
- return PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromErrno(PyExc_IOError);
- Py_RETURN_NONE;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-/*[clinic input]
-msvcrt.locking
- fd: int
- mode: int
- nbytes: long
- /
-
-Lock part of a file based on file descriptor fd from the C runtime.
-
-Raises OSError on failure. The locked region of the file extends from
-the current file position for nbytes bytes, and may continue beyond
-the end of the file. mode must be one of the LK_* constants listed
-below. Multiple regions in a file may be locked at the same time, but
-may not overlap. Adjacent regions are not merged; they must be unlocked
-individually.
-[clinic start generated code]*/
+PyDoc_STRVAR(heapmin_doc,
+"heapmin() -> None\n\
+\n\
+Force the malloc() heap to clean itself up and return unused blocks\n\
+to the operating system. On failure, this raises IOError.");
+// Perform locking operations on a C runtime file descriptor.
static PyObject *
-msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes)
-/*[clinic end generated code: output=a4a90deca9785a03 input=e97bd15fc4a04fef]*/
+msvcrt_locking(PyObject *self, PyObject *args)
{
+ int fd;
+ int mode;
+ long nbytes;
int err;
+ if (!PyArg_ParseTuple(args, "iil:locking", &fd, &mode, &nbytes))
+ return NULL;
+
Py_BEGIN_ALLOW_THREADS
- _Py_BEGIN_SUPPRESS_IPH
err = _locking(fd, mode, nbytes);
- _Py_END_SUPPRESS_IPH
Py_END_ALLOW_THREADS
if (err != 0)
- return PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromErrno(PyExc_IOError);
- Py_RETURN_NONE;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-/*[clinic input]
-msvcrt.setmode -> long
-
- fd: int
- mode as flags: int
- /
-
-Set the line-end translation mode for the file descriptor fd.
-
-To set it to text mode, flags should be os.O_TEXT; for binary, it
-should be os.O_BINARY.
-
-Return value is the previous mode.
-[clinic start generated code]*/
-
-static long
-msvcrt_setmode_impl(PyObject *module, int fd, int flags)
-/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
+PyDoc_STRVAR(locking_doc,
+"locking(fd, mode, nbytes) -> None\n\
+\n\
+Lock part of a file based on file descriptor fd from the C runtime.\n\
+Raises IOError on failure. The locked region of the file extends from\n\
+the current file position for nbytes bytes, and may continue beyond\n\
+the end of the file. mode must be one of the LK_* constants listed\n\
+below. Multiple regions in a file may be locked at the same time, but\n\
+may not overlap. Adjacent regions are not merged; they must be unlocked\n\
+individually.");
+
+// Set the file translation mode for a C runtime file descriptor.
+static PyObject *
+msvcrt_setmode(PyObject *self, PyObject *args)
{
- _Py_BEGIN_SUPPRESS_IPH
+ int fd;
+ int flags;
+ if (!PyArg_ParseTuple(args,"ii:setmode", &fd, &flags))
+ return NULL;
+
flags = _setmode(fd, flags);
- _Py_END_SUPPRESS_IPH
if (flags == -1)
- PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromErrno(PyExc_IOError);
- return flags;
+ return PyInt_FromLong(flags);
}
-/*[clinic input]
-msvcrt.open_osfhandle -> long
-
- handle: HANDLE
- flags: int
- /
-
-Create a C runtime file descriptor from the file handle handle.
-
-The flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,
-and os.O_TEXT. The returned file descriptor may be used as a parameter
-to os.fdopen() to create a file object.
-[clinic start generated code]*/
+PyDoc_STRVAR(setmode_doc,
+"setmode(fd, mode) -> Previous mode\n\
+\n\
+Set the line-end translation mode for the file descriptor fd. To set\n\
+it to text mode, flags should be os.O_TEXT; for binary, it should be\n\
+os.O_BINARY.");
-static long
-msvcrt_open_osfhandle_impl(PyObject *module, void *handle, int flags)
-/*[clinic end generated code: output=b2fb97c4b515e4e6 input=d5db190a307cf4bb]*/
+// Convert an OS file handle to a C runtime file descriptor.
+static PyObject *
+msvcrt_open_osfhandle(PyObject *self, PyObject *args)
{
+ long handle;
+ int flags;
int fd;
- _Py_BEGIN_SUPPRESS_IPH
- fd = _open_osfhandle((intptr_t)handle, flags);
- _Py_END_SUPPRESS_IPH
+ if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags))
+ return NULL;
+
+ fd = _open_osfhandle(handle, flags);
if (fd == -1)
- PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromErrno(PyExc_IOError);
- return fd;
+ return PyInt_FromLong(fd);
}
-/*[clinic input]
-msvcrt.get_osfhandle -> HANDLE
-
- fd: int
- /
+PyDoc_STRVAR(open_osfhandle_doc,
+"open_osfhandle(handle, flags) -> file descriptor\n\
+\n\
+Create a C runtime file descriptor from the file handle handle. The\n\
+flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,\n\
+and os.O_TEXT. The returned file descriptor may be used as a parameter\n\
+to os.fdopen() to create a file object.");
-Return the file handle for the file descriptor fd.
+// Convert a C runtime file descriptor to an OS file handle.
+static PyObject *
+msvcrt_get_osfhandle(PyObject *self, PyObject *args)
+{
+ int fd;
+ Py_intptr_t handle;
-Raises OSError if fd is not recognized.
-[clinic start generated code]*/
+ if (!PyArg_ParseTuple(args,"i:get_osfhandle", &fd))
+ return NULL;
-static void *
-msvcrt_get_osfhandle_impl(PyObject *module, int fd)
-/*[clinic end generated code: output=aca01dfe24637374 input=5fcfde9b17136aa2]*/
-{
- intptr_t handle = -1;
+ if (!_PyVerify_fd(fd))
+ return PyErr_SetFromErrno(PyExc_IOError);
- _Py_BEGIN_SUPPRESS_IPH
handle = _get_osfhandle(fd);
- _Py_END_SUPPRESS_IPH
if (handle == -1)
- PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromErrno(PyExc_IOError);
- return (HANDLE)handle;
+ /* technically 'handle' is not a pointer, but an integer as
+ large as a pointer, Python's *VoidPtr interface is the
+ most appropriate here */
+ return PyLong_FromVoidPtr((void*)handle);
}
-/* Console I/O */
-/*[clinic input]
-msvcrt.kbhit -> long
+PyDoc_STRVAR(get_osfhandle_doc,
+"get_osfhandle(fd) -> file handle\n\
+\n\
+Return the file handle for the file descriptor fd. Raises IOError\n\
+if fd is not recognized.");
-Return true if a keypress is waiting to be read.
-[clinic start generated code]*/
+/* Console I/O */
-static long
-msvcrt_kbhit_impl(PyObject *module)
-/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/
+static PyObject *
+msvcrt_kbhit(PyObject *self, PyObject *args)
{
- return _kbhit();
-}
+ int ok;
-/*[clinic input]
-msvcrt.getch -> byte_char
+ if (!PyArg_ParseTuple(args, ":kbhit"))
+ return NULL;
-Read a keypress and return the resulting character as a byte string.
+ ok = _kbhit();
+ return PyInt_FromLong(ok);
+}
-Nothing is echoed to the console. This call will block if a keypress is
-not already available, but will not wait for Enter to be pressed. If the
-pressed key was a special function key, this will return '\000' or
-'\xe0'; the next call will return the keycode. The Control-C keypress
-cannot be read with this function.
-[clinic start generated code]*/
+PyDoc_STRVAR(kbhit_doc,
+"kbhit() -> bool\n\
+\n\
+Return true if a keypress is waiting to be read.");
-static int
-msvcrt_getch_impl(PyObject *module)
-/*[clinic end generated code: output=a4e51f0565064a7d input=37a40cf0ed0d1153]*/
+static PyObject *
+msvcrt_getch(PyObject *self, PyObject *args)
{
int ch;
+ char s[1];
+
+ if (!PyArg_ParseTuple(args, ":getch"))
+ return NULL;
Py_BEGIN_ALLOW_THREADS
ch = _getch();
Py_END_ALLOW_THREADS
- return ch;
+ s[0] = ch;
+ return PyString_FromStringAndSize(s, 1);
}
-/*[clinic input]
-msvcrt.getwch -> wchar_t
-
-Wide char variant of getch(), returning a Unicode value.
-[clinic start generated code]*/
-
-static wchar_t
-msvcrt_getwch_impl(PyObject *module)
-/*[clinic end generated code: output=be9937494e22f007 input=27b3dec8ad823d7c]*/
+PyDoc_STRVAR(getch_doc,
+"getch() -> key character\n\
+\n\
+Read a keypress and return the resulting character. Nothing is echoed to\n\
+the console. This call will block if a keypress is not already\n\
+available, but will not wait for Enter to be pressed. If the pressed key\n\
+was a special function key, this will return '\\000' or '\\xe0'; the next\n\
+call will return the keycode. The Control-C keypress cannot be read with\n\
+this function.");
+
+#ifdef _WCONIO_DEFINED
+static PyObject *
+msvcrt_getwch(PyObject *self, PyObject *args)
{
- wchar_t ch;
+ Py_UNICODE ch;
+ Py_UNICODE u[1];
+
+ if (!PyArg_ParseTuple(args, ":getwch"))
+ return NULL;
Py_BEGIN_ALLOW_THREADS
ch = _getwch();
Py_END_ALLOW_THREADS
- return ch;
+ u[0] = ch;
+ return PyUnicode_FromUnicode(u, 1);
}
-/*[clinic input]
-msvcrt.getche -> byte_char
-
-Similar to getch(), but the keypress will be echoed if possible.
-[clinic start generated code]*/
+PyDoc_STRVAR(getwch_doc,
+"getwch() -> Unicode key character\n\
+\n\
+Wide char variant of getch(), returning a Unicode value.");
+#endif
-static int
-msvcrt_getche_impl(PyObject *module)
-/*[clinic end generated code: output=d8f7db4fd2990401 input=43311ade9ed4a9c0]*/
+static PyObject *
+msvcrt_getche(PyObject *self, PyObject *args)
{
int ch;
+ char s[1];
+
+ if (!PyArg_ParseTuple(args, ":getche"))
+ return NULL;
Py_BEGIN_ALLOW_THREADS
ch = _getche();
Py_END_ALLOW_THREADS
- return ch;
+ s[0] = ch;
+ return PyString_FromStringAndSize(s, 1);
}
-/*[clinic input]
-msvcrt.getwche -> wchar_t
+PyDoc_STRVAR(getche_doc,
+"getche() -> key character\n\
+\n\
+Similar to getch(), but the keypress will be echoed if it represents\n\
+a printable character.");
-Wide char variant of getche(), returning a Unicode value.
-[clinic start generated code]*/
-
-static wchar_t
-msvcrt_getwche_impl(PyObject *module)
-/*[clinic end generated code: output=d0dae5ba3829d596 input=49337d59d1a591f8]*/
+#ifdef _WCONIO_DEFINED
+static PyObject *
+msvcrt_getwche(PyObject *self, PyObject *args)
{
- wchar_t ch;
+ Py_UNICODE ch;
+ Py_UNICODE s[1];
+
+ if (!PyArg_ParseTuple(args, ":getwche"))
+ return NULL;
Py_BEGIN_ALLOW_THREADS
ch = _getwche();
Py_END_ALLOW_THREADS
- return ch;
-}
-
-/*[clinic input]
-msvcrt.putch
-
- char: char
- /
-
-Print the byte string char to the console without buffering.
-[clinic start generated code]*/
-
-static PyObject *
-msvcrt_putch_impl(PyObject *module, char char_value)
-/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
-{
- _Py_BEGIN_SUPPRESS_IPH
- _putch(char_value);
- _Py_END_SUPPRESS_IPH
- Py_RETURN_NONE;
-}
-
-/*[clinic input]
-msvcrt.putwch
-
- unicode_char: int(accept={str})
- /
-
-Wide char variant of putch(), accepting a Unicode value.
-[clinic start generated code]*/
-
-static PyObject *
-msvcrt_putwch_impl(PyObject *module, int unicode_char)
-/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
-{
- _Py_BEGIN_SUPPRESS_IPH
- _putwch(unicode_char);
- _Py_END_SUPPRESS_IPH
- Py_RETURN_NONE;
-
+ s[0] = ch;
+ return PyUnicode_FromUnicode(s, 1);
}
-/*[clinic input]
-msvcrt.ungetch
-
- char: char
- /
-
-Opposite of getch.
-
-Cause the byte string char to be "pushed back" into the
-console buffer; it will be the next character read by
-getch() or getche().
-[clinic start generated code]*/
+PyDoc_STRVAR(getwche_doc,
+"getwche() -> Unicode key character\n\
+\n\
+Wide char variant of getche(), returning a Unicode value.");
+#endif
static PyObject *
-msvcrt_ungetch_impl(PyObject *module, char char_value)
-/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
+msvcrt_putch(PyObject *self, PyObject *args)
{
- int res;
+ char ch;
- _Py_BEGIN_SUPPRESS_IPH
- res = _ungetch(char_value);
- _Py_END_SUPPRESS_IPH
+ if (!PyArg_ParseTuple(args, "c:putch", &ch))
+ return NULL;
- if (res == EOF)
- return PyErr_SetFromErrno(PyExc_OSError);
- Py_RETURN_NONE;
+ _putch(ch);
+ Py_INCREF(Py_None);
+ return Py_None;
}
-/*[clinic input]
-msvcrt.ungetwch
-
- unicode_char: int(accept={str})
- /
-
-Wide char variant of ungetch(), accepting a Unicode value.
-[clinic start generated code]*/
+PyDoc_STRVAR(putch_doc,
+"putch(char) -> None\n\
+\n\
+Print the character char to the console without buffering.");
+#ifdef _WCONIO_DEFINED
static PyObject *
-msvcrt_ungetwch_impl(PyObject *module, int unicode_char)
-/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
+msvcrt_putwch(PyObject *self, PyObject *args)
{
- int res;
+ Py_UNICODE *ch;
+ int size;
- _Py_BEGIN_SUPPRESS_IPH
- res = _ungetwch(unicode_char);
- _Py_END_SUPPRESS_IPH
+ if (!PyArg_ParseTuple(args, "u#:putwch", &ch, &size))
+ return NULL;
- if (res == WEOF)
- return PyErr_SetFromErrno(PyExc_OSError);
+ if (size == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "Expected unicode string of length 1");
+ return NULL;
+ }
+ _putwch(*ch);
Py_RETURN_NONE;
-}
-
-#ifdef _DEBUG
-/*[clinic input]
-msvcrt.CrtSetReportFile -> HANDLE
-
- type: int
- file: HANDLE
- /
-
-Wrapper around _CrtSetReportFile.
-
-Only available on Debug builds.
-[clinic start generated code]*/
-
-static void *
-msvcrt_CrtSetReportFile_impl(PyObject *module, int type, void *file)
-/*[clinic end generated code: output=9393e8c77088bbe9 input=290809b5f19e65b9]*/
-{
- HANDLE res;
-
- _Py_BEGIN_SUPPRESS_IPH
- res = _CrtSetReportFile(type, file);
- _Py_END_SUPPRESS_IPH
-
- return res;
-}
-
-/*[clinic input]
-msvcrt.CrtSetReportMode -> long
-
- type: int
- mode: int
- /
-
-Wrapper around _CrtSetReportMode.
-
-Only available on Debug builds.
-[clinic start generated code]*/
-static long
-msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
-/*[clinic end generated code: output=b2863761523de317 input=9319d29b4319426b]*/
-{
- int res;
-
- _Py_BEGIN_SUPPRESS_IPH
- res = _CrtSetReportMode(type, mode);
- _Py_END_SUPPRESS_IPH
- if (res == -1)
- PyErr_SetFromErrno(PyExc_OSError);
- return res;
}
-/*[clinic input]
-msvcrt.set_error_mode -> long
-
- mode: int
- /
-
-Wrapper around _set_error_mode.
-
-Only available on Debug builds.
-[clinic start generated code]*/
+PyDoc_STRVAR(putwch_doc,
+"putwch(unicode_char) -> None\n\
+\n\
+Wide char variant of putch(), accepting a Unicode value.");
+#endif
-static long
-msvcrt_set_error_mode_impl(PyObject *module, int mode)
-/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
+static PyObject *
+msvcrt_ungetch(PyObject *self, PyObject *args)
{
- long res;
+ char ch;
- _Py_BEGIN_SUPPRESS_IPH
- res = _set_error_mode(mode);
- _Py_END_SUPPRESS_IPH
+ if (!PyArg_ParseTuple(args, "c:ungetch", &ch))
+ return NULL;
- return res;
+ if (_ungetch(ch) == EOF)
+ return PyErr_SetFromErrno(PyExc_IOError);
+ Py_INCREF(Py_None);
+ return Py_None;
}
-#endif /* _DEBUG */
-
-/*[clinic input]
-msvcrt.SetErrorMode
-
- mode: unsigned_int(bitwise=True)
- /
-Wrapper around SetErrorMode.
-[clinic start generated code]*/
+PyDoc_STRVAR(ungetch_doc,
+"ungetch(char) -> None\n\
+\n\
+Cause the character char to be \"pushed back\" into the console buffer;\n\
+it will be the next character read by getch() or getche().");
+#ifdef _WCONIO_DEFINED
static PyObject *
-msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
-/*[clinic end generated code: output=01d529293f00da8f input=d8b167258d32d907]*/
+msvcrt_ungetwch(PyObject *self, PyObject *args)
{
- unsigned int res;
+ Py_UNICODE ch;
- _Py_BEGIN_SUPPRESS_IPH
- res = SetErrorMode(mode);
- _Py_END_SUPPRESS_IPH
+ if (!PyArg_ParseTuple(args, "u:ungetwch", &ch))
+ return NULL;
- return PyLong_FromUnsignedLong(res);
+ if (_ungetch(ch) == EOF)
+ return PyErr_SetFromErrno(PyExc_IOError);
+ Py_INCREF(Py_None);
+ return Py_None;
}
-/*[clinic input]
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
-
-/* List of functions exported by this module */
-static struct PyMethodDef msvcrt_functions[] = {
- MSVCRT_HEAPMIN_METHODDEF
- MSVCRT_LOCKING_METHODDEF
- MSVCRT_SETMODE_METHODDEF
- MSVCRT_OPEN_OSFHANDLE_METHODDEF
- MSVCRT_GET_OSFHANDLE_METHODDEF
- MSVCRT_KBHIT_METHODDEF
- MSVCRT_GETCH_METHODDEF
- MSVCRT_GETCHE_METHODDEF
- MSVCRT_PUTCH_METHODDEF
- MSVCRT_UNGETCH_METHODDEF
- MSVCRT_SETERRORMODE_METHODDEF
- MSVCRT_CRTSETREPORTFILE_METHODDEF
- MSVCRT_CRTSETREPORTMODE_METHODDEF
- MSVCRT_SET_ERROR_MODE_METHODDEF
- MSVCRT_GETWCH_METHODDEF
- MSVCRT_GETWCHE_METHODDEF
- MSVCRT_PUTWCH_METHODDEF
- MSVCRT_UNGETWCH_METHODDEF
- {NULL, NULL}
-};
-
-
-static struct PyModuleDef msvcrtmodule = {
- PyModuleDef_HEAD_INIT,
- "msvcrt",
- NULL,
- -1,
- msvcrt_functions,
- NULL,
- NULL,
- NULL,
- NULL
-};
+PyDoc_STRVAR(ungetwch_doc,
+"ungetwch(unicode_char) -> None\n\
+\n\
+Wide char variant of ungetch(), accepting a Unicode value.");
+#endif
static void
insertint(PyObject *d, char *name, int value)
{
- PyObject *v = PyLong_FromLong((long) value);
+ PyObject *v = PyInt_FromLong((long) value);
if (v == NULL) {
/* Don't bother reporting this error */
PyErr_Clear();
@@ -546,28 +372,36 @@ insertint(PyObject *d, char *name, int value)
}
}
-static void
-insertptr(PyObject *d, char *name, void *value)
-{
- PyObject *v = PyLong_FromVoidPtr(value);
- if (v == NULL) {
- /* Don't bother reporting this error */
- PyErr_Clear();
- }
- else {
- PyDict_SetItemString(d, name, v);
- Py_DECREF(v);
- }
-}
+
+/* List of functions exported by this module */
+static struct PyMethodDef msvcrt_functions[] = {
+ {"heapmin", msvcrt_heapmin, METH_VARARGS, heapmin_doc},
+ {"locking", msvcrt_locking, METH_VARARGS, locking_doc},
+ {"setmode", msvcrt_setmode, METH_VARARGS, setmode_doc},
+ {"open_osfhandle", msvcrt_open_osfhandle, METH_VARARGS, open_osfhandle_doc},
+ {"get_osfhandle", msvcrt_get_osfhandle, METH_VARARGS, get_osfhandle_doc},
+ {"kbhit", msvcrt_kbhit, METH_VARARGS, kbhit_doc},
+ {"getch", msvcrt_getch, METH_VARARGS, getch_doc},
+ {"getche", msvcrt_getche, METH_VARARGS, getche_doc},
+ {"putch", msvcrt_putch, METH_VARARGS, putch_doc},
+ {"ungetch", msvcrt_ungetch, METH_VARARGS, ungetch_doc},
+#ifdef _WCONIO_DEFINED
+ {"getwch", msvcrt_getwch, METH_VARARGS, getwch_doc},
+ {"getwche", msvcrt_getwche, METH_VARARGS, getwche_doc},
+ {"putwch", msvcrt_putwch, METH_VARARGS, putwch_doc},
+ {"ungetwch", msvcrt_ungetwch, METH_VARARGS, ungetwch_doc},
+#endif
+ {NULL, NULL}
+};
PyMODINIT_FUNC
-PyInit_msvcrt(void)
+initmsvcrt(void)
{
int st;
- PyObject *d, *version;
- PyObject *m = PyModule_Create(&msvcrtmodule);
+ PyObject *d;
+ PyObject *m = Py_InitModule("msvcrt", msvcrt_functions);
if (m == NULL)
- return NULL;
+ return;
d = PyModule_GetDict(m);
/* constants for the locking() function's mode argument */
@@ -576,51 +410,21 @@ PyInit_msvcrt(void)
insertint(d, "LK_NBRLCK", _LK_NBRLCK);
insertint(d, "LK_RLCK", _LK_RLCK);
insertint(d, "LK_UNLCK", _LK_UNLCK);
- insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
- insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
- insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
- insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
-#ifdef _DEBUG
- insertint(d, "CRT_WARN", _CRT_WARN);
- insertint(d, "CRT_ERROR", _CRT_ERROR);
- insertint(d, "CRT_ASSERT", _CRT_ASSERT);
- insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
- insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
- insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
- insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
- insertptr(d, "CRTDBG_FILE_STDERR", _CRTDBG_FILE_STDERR);
- insertptr(d, "CRTDBG_FILE_STDOUT", _CRTDBG_FILE_STDOUT);
- insertptr(d, "CRTDBG_REPORT_FILE", _CRTDBG_REPORT_FILE);
-#endif
/* constants for the crt versions */
#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
_VC_ASSEMBLY_PUBLICKEYTOKEN);
- if (st < 0) return NULL;
+ if (st < 0)return;
#endif
#ifdef _CRT_ASSEMBLY_VERSION
st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
_CRT_ASSEMBLY_VERSION);
- if (st < 0) return NULL;
+ if (st < 0)return;
#endif
#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
__LIBRARIES_ASSEMBLY_NAME_PREFIX);
- if (st < 0) return NULL;
-#endif
-
- /* constants for the 2010 crt versions */
-#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
- version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
- _VC_CRT_MINOR_VERSION,
- _VC_CRT_BUILD_VERSION,
- _VC_CRT_RBUILD_VERSION);
- st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
- if (st < 0) return NULL;
+ if (st < 0)return;
#endif
- /* make compiler warning quiet if st is unused */
- (void)st;
-
- return m;
}