blob: 04d2088d298747f722c75a7d480b57e70938c3f6 [file] [log] [blame]
Guido van Rossum29c1ea51997-08-07 00:11:34 +00001/*********************************************************
2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003 msvcrtmodule.c
Guido van Rossum29c1ea51997-08-07 00:11:34 +00004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005 A Python interface to the Microsoft Visual C Runtime
6 Library, providing access to those non-portable, but
7 still useful routines.
Guido van Rossum29c1ea51997-08-07 00:11:34 +00008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00009 Only ever compiled with an MS compiler, so no attempt
10 has been made to avoid MS language extensions, etc...
Guido van Rossum29c1ea51997-08-07 00:11:34 +000011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000012 This may only work on NT or 95...
Guido van Rossum407a22d1997-08-13 19:57:53 +000013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014 Author: Mark Hammond and Guido van Rossum.
15 Maintenance: Guido van Rossum.
Guido van Rossum407a22d1997-08-13 19:57:53 +000016
Guido van Rossum29c1ea51997-08-07 00:11:34 +000017***********************************************************/
Guido van Rossum407a22d1997-08-13 19:57:53 +000018
Guido van Rossum29c1ea51997-08-07 00:11:34 +000019#include "Python.h"
20#include "malloc.h"
Tim Peters5fa0bd62000-12-12 01:58:56 +000021#include <io.h>
22#include <conio.h>
23#include <sys/locking.h>
Martin v. Löwis3dc33d12007-08-31 07:58:36 +000024#include <crtdbg.h>
25#include <windows.h>
Guido van Rossum29c1ea51997-08-07 00:11:34 +000026
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000027#ifdef _MSC_VER
Martin v. Löwis3afc62e2010-02-18 16:27:43 +000028#if _MSC_VER >= 1500 && _MSC_VER < 1600
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000029#include <crtassem.h>
Brian Curtin401f9f32012-05-13 11:19:23 -050030#elif _MSC_VER >= 1600
31#include <crtversion.h>
Benjamin Peterson4469d0c2008-11-30 22:46:23 +000032#endif
33#endif
34
Guido van Rossum407a22d1997-08-13 19:57:53 +000035// Force the malloc heap to clean itself up, and free unused blocks
36// back to the OS. (According to the docs, only works on NT.)
Tim Peters5fa0bd62000-12-12 01:58:56 +000037static PyObject *
38msvcrt_heapmin(PyObject *self, PyObject *args)
Guido van Rossum29c1ea51997-08-07 00:11:34 +000039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 if (!PyArg_ParseTuple(args, ":heapmin"))
41 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +000042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 if (_heapmin() != 0)
44 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +000045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 Py_INCREF(Py_None);
47 return Py_None;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000048}
49
Benjamin Peterson1baf4652009-12-31 03:11:23 +000050PyDoc_STRVAR(heapmin_doc,
51"heapmin() -> None\n\
52\n\
53Force the malloc() heap to clean itself up and return unused blocks\n\
54to the operating system. On failure, this raises IOError.");
55
Guido van Rossum407a22d1997-08-13 19:57:53 +000056// Perform locking operations on a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +000057static PyObject *
58msvcrt_locking(PyObject *self, PyObject *args)
Guido van Rossum29c1ea51997-08-07 00:11:34 +000059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int fd;
61 int mode;
62 long nbytes;
63 int err;
Guido van Rossum407a22d1997-08-13 19:57:53 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (!PyArg_ParseTuple(args, "iil:locking", &fd, &mode, &nbytes))
66 return NULL;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 Py_BEGIN_ALLOW_THREADS
69 err = _locking(fd, mode, nbytes);
70 Py_END_ALLOW_THREADS
71 if (err != 0)
72 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum29c1ea51997-08-07 00:11:34 +000073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 Py_INCREF(Py_None);
75 return Py_None;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000076}
Guido van Rossum407a22d1997-08-13 19:57:53 +000077
Benjamin Peterson1baf4652009-12-31 03:11:23 +000078PyDoc_STRVAR(locking_doc,
79"locking(fd, mode, nbytes) -> None\n\
80\n\
81Lock part of a file based on file descriptor fd from the C runtime.\n\
82Raises IOError on failure. The locked region of the file extends from\n\
83the current file position for nbytes bytes, and may continue beyond\n\
84the end of the file. mode must be one of the LK_* constants listed\n\
85below. Multiple regions in a file may be locked at the same time, but\n\
86may not overlap. Adjacent regions are not merged; they must be unlocked\n\
87individually.");
88
Guido van Rossum407a22d1997-08-13 19:57:53 +000089// Set the file translation mode for a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +000090static PyObject *
91msvcrt_setmode(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +000092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 int fd;
94 int flags;
95 if (!PyArg_ParseTuple(args,"ii:setmode", &fd, &flags))
96 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +000097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 flags = _setmode(fd, flags);
99 if (flags == -1)
100 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 return PyLong_FromLong(flags);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000103}
104
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000105PyDoc_STRVAR(setmode_doc,
106"setmode(fd, mode) -> Previous mode\n\
107\n\
108Set the line-end translation mode for the file descriptor fd. To set\n\
109it to text mode, flags should be os.O_TEXT; for binary, it should be\n\
110os.O_BINARY.");
111
Guido van Rossum407a22d1997-08-13 19:57:53 +0000112// Convert an OS file handle to a C runtime file descriptor.
Tim Peters5fa0bd62000-12-12 01:58:56 +0000113static PyObject *
114msvcrt_open_osfhandle(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 long handle;
117 int flags;
118 int fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags))
121 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 fd = _open_osfhandle(handle, flags);
124 if (fd == -1)
125 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 return PyLong_FromLong(fd);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000128}
129
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000130PyDoc_STRVAR(open_osfhandle_doc,
131"open_osfhandle(handle, flags) -> file descriptor\n\
132\n\
133Create a C runtime file descriptor from the file handle handle. The\n\
134flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,\n\
135and os.O_TEXT. The returned file descriptor may be used as a parameter\n\
136to os.fdopen() to create a file object.");
137
Guido van Rossum407a22d1997-08-13 19:57:53 +0000138// Convert a C runtime file descriptor to an OS file handle.
Tim Peters5fa0bd62000-12-12 01:58:56 +0000139static PyObject *
140msvcrt_get_osfhandle(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 int fd;
143 Py_intptr_t handle;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 if (!PyArg_ParseTuple(args,"i:get_osfhandle", &fd))
146 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000147
Antoine Pitrou00492492010-09-04 20:53:29 +0000148 if (!_PyVerify_fd(fd))
149 return PyErr_SetFromErrno(PyExc_IOError);
150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 handle = _get_osfhandle(fd);
152 if (handle == -1)
153 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 /* technically 'handle' is not a pointer, but a integer as
156 large as a pointer, Python's *VoidPtr interface is the
157 most appropriate here */
158 return PyLong_FromVoidPtr((void*)handle);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000159}
160
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000161PyDoc_STRVAR(get_osfhandle_doc,
162"get_osfhandle(fd) -> file handle\n\
163\n\
164Return the file handle for the file descriptor fd. Raises IOError\n\
165if fd is not recognized.");
166
Guido van Rossum407a22d1997-08-13 19:57:53 +0000167/* Console I/O */
Guido van Rossum407a22d1997-08-13 19:57:53 +0000168
Tim Peters5fa0bd62000-12-12 01:58:56 +0000169static PyObject *
170msvcrt_kbhit(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 int ok;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (!PyArg_ParseTuple(args, ":kbhit"))
175 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 ok = _kbhit();
178 return PyLong_FromLong(ok);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000179}
180
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000181PyDoc_STRVAR(kbhit_doc,
182"kbhit() -> bool\n\
183\n\
184Return true if a keypress is waiting to be read.");
185
Tim Peters5fa0bd62000-12-12 01:58:56 +0000186static PyObject *
187msvcrt_getch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 int ch;
190 char s[1];
Guido van Rossum407a22d1997-08-13 19:57:53 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (!PyArg_ParseTuple(args, ":getch"))
193 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 Py_BEGIN_ALLOW_THREADS
196 ch = _getch();
197 Py_END_ALLOW_THREADS
198 s[0] = ch;
199 return PyBytes_FromStringAndSize(s, 1);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000200}
201
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000202PyDoc_STRVAR(getch_doc,
203"getch() -> key character\n\
204\n\
Brian Curtin8790a072010-08-24 05:20:30 +0000205Read a keypress and return the resulting character as a byte string.\n\
206Nothing is echoed to the console. This call will block if a keypress is\n\
207not already available, but will not wait for Enter to be pressed. If the\n\
208pressed key was a special function key, this will return '\\000' or\n\
209'\\xe0'; the next call will return the keycode. The Control-C keypress\n\
210cannot be read with this function.");
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000211
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +0000212#ifdef _WCONIO_DEFINED
Tim Peters5fa0bd62000-12-12 01:58:56 +0000213static PyObject *
Christian Heimes2f1019e2007-12-10 16:18:49 +0000214msvcrt_getwch(PyObject *self, PyObject *args)
215{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100216 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (!PyArg_ParseTuple(args, ":getwch"))
219 return NULL;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 Py_BEGIN_ALLOW_THREADS
222 ch = _getwch();
223 Py_END_ALLOW_THREADS
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200224 return PyUnicode_FromOrdinal(ch);
Christian Heimes2f1019e2007-12-10 16:18:49 +0000225}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000226
227PyDoc_STRVAR(getwch_doc,
228"getwch() -> Unicode key character\n\
229\n\
230Wide char variant of getch(), returning a Unicode value.");
Christian Heimesc36625b2008-01-04 13:33:00 +0000231#endif
Christian Heimes2f1019e2007-12-10 16:18:49 +0000232
233static PyObject *
Tim Peters5fa0bd62000-12-12 01:58:56 +0000234msvcrt_getche(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 int ch;
237 char s[1];
Guido van Rossum407a22d1997-08-13 19:57:53 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (!PyArg_ParseTuple(args, ":getche"))
240 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 Py_BEGIN_ALLOW_THREADS
243 ch = _getche();
244 Py_END_ALLOW_THREADS
245 s[0] = ch;
246 return PyBytes_FromStringAndSize(s, 1);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000247}
248
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000249PyDoc_STRVAR(getche_doc,
250"getche() -> key character\n\
251\n\
252Similar to getch(), but the keypress will be echoed if it represents\n\
253a printable character.");
254
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +0000255#ifdef _WCONIO_DEFINED
Tim Peters5fa0bd62000-12-12 01:58:56 +0000256static PyObject *
Christian Heimes2f1019e2007-12-10 16:18:49 +0000257msvcrt_getwche(PyObject *self, PyObject *args)
258{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100259 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 if (!PyArg_ParseTuple(args, ":getwche"))
262 return NULL;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 Py_BEGIN_ALLOW_THREADS
265 ch = _getwche();
266 Py_END_ALLOW_THREADS
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200267 return PyUnicode_FromOrdinal(ch);
Christian Heimes2f1019e2007-12-10 16:18:49 +0000268}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000269
270PyDoc_STRVAR(getwche_doc,
271"getwche() -> Unicode key character\n\
272\n\
273Wide char variant of getche(), returning a Unicode value.");
Christian Heimesc36625b2008-01-04 13:33:00 +0000274#endif
Christian Heimes2f1019e2007-12-10 16:18:49 +0000275
276static PyObject *
Tim Peters5fa0bd62000-12-12 01:58:56 +0000277msvcrt_putch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 char ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 if (!PyArg_ParseTuple(args, "c:putch", &ch))
282 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 _putch(ch);
285 Py_INCREF(Py_None);
286 return Py_None;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000287}
288
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000289PyDoc_STRVAR(putch_doc,
290"putch(char) -> None\n\
291\n\
Brian Curtin8790a072010-08-24 05:20:30 +0000292Print the byte string char to the console without buffering.");
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000293
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +0000294#ifdef _WCONIO_DEFINED
Christian Heimes2f1019e2007-12-10 16:18:49 +0000295static PyObject *
296msvcrt_putwch(PyObject *self, PyObject *args)
297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 int ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 if (!PyArg_ParseTuple(args, "C:putwch", &ch))
301 return NULL;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 _putwch(ch);
304 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000305
306}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000307
308PyDoc_STRVAR(putwch_doc,
309"putwch(unicode_char) -> None\n\
310\n\
311Wide char variant of putch(), accepting a Unicode value.");
Christian Heimesc36625b2008-01-04 13:33:00 +0000312#endif
Christian Heimes2f1019e2007-12-10 16:18:49 +0000313
Tim Peters5fa0bd62000-12-12 01:58:56 +0000314static PyObject *
315msvcrt_ungetch(PyObject *self, PyObject *args)
Guido van Rossum407a22d1997-08-13 19:57:53 +0000316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 char ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 if (!PyArg_ParseTuple(args, "c:ungetch", &ch))
320 return NULL;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 if (_ungetch(ch) == EOF)
323 return PyErr_SetFromErrno(PyExc_IOError);
324 Py_INCREF(Py_None);
325 return Py_None;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000326}
327
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000328PyDoc_STRVAR(ungetch_doc,
329"ungetch(char) -> None\n\
330\n\
Brian Curtin8790a072010-08-24 05:20:30 +0000331Cause the byte string char to be \"pushed back\" into the\n\
332console buffer; it will be the next character read by\n\
333getch() or getche().");
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000334
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +0000335#ifdef _WCONIO_DEFINED
Christian Heimes2f1019e2007-12-10 16:18:49 +0000336static PyObject *
337msvcrt_ungetwch(PyObject *self, PyObject *args)
338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 int ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (!PyArg_ParseTuple(args, "C:ungetwch", &ch))
342 return NULL;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 if (_ungetwch(ch) == WEOF)
345 return PyErr_SetFromErrno(PyExc_IOError);
346 Py_INCREF(Py_None);
347 return Py_None;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000348}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000349
350PyDoc_STRVAR(ungetwch_doc,
351"ungetwch(unicode_char) -> None\n\
352\n\
353Wide char variant of ungetch(), accepting a Unicode value.");
Christian Heimesc36625b2008-01-04 13:33:00 +0000354#endif
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000355
Tim Peters5fa0bd62000-12-12 01:58:56 +0000356static void
357insertint(PyObject *d, char *name, int value)
358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 PyObject *v = PyLong_FromLong((long) value);
360 if (v == NULL) {
361 /* Don't bother reporting this error */
362 PyErr_Clear();
363 }
364 else {
365 PyDict_SetItemString(d, name, v);
366 Py_DECREF(v);
367 }
Tim Peters5fa0bd62000-12-12 01:58:56 +0000368}
369
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000370#ifdef _DEBUG
371
372static PyObject*
373msvcrt_setreportfile(PyObject *self, PyObject *args)
374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 int type, file;
376 _HFILE res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 if (!PyArg_ParseTuple(args, "ii", &type, &file))
379 return NULL;
380 res = _CrtSetReportFile(type, (_HFILE)file);
381 return PyLong_FromLong((long)res);
382 Py_INCREF(Py_None);
383 return Py_None;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000384}
385
386static PyObject*
387msvcrt_setreportmode(PyObject *self, PyObject *args)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 int type, mode;
390 int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 if (!PyArg_ParseTuple(args, "ii", &type, &mode))
393 return NULL;
394 res = _CrtSetReportMode(type, mode);
395 if (res == -1)
396 return PyErr_SetFromErrno(PyExc_IOError);
397 return PyLong_FromLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000398}
399
400static PyObject*
401msvcrt_seterrormode(PyObject *self, PyObject *args)
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 int mode, res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (!PyArg_ParseTuple(args, "i", &mode))
406 return NULL;
407 res = _set_error_mode(mode);
408 return PyLong_FromLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000409}
410
411#endif
412
413static PyObject*
414seterrormode(PyObject *self, PyObject *args)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 unsigned int mode, res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 if (!PyArg_ParseTuple(args, "I", &mode))
419 return NULL;
420 res = SetErrorMode(mode);
421 return PyLong_FromUnsignedLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000422}
423
Tim Peters5fa0bd62000-12-12 01:58:56 +0000424
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000425/* List of functions exported by this module */
426static struct PyMethodDef msvcrt_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 {"heapmin", msvcrt_heapmin, METH_VARARGS, heapmin_doc},
428 {"locking", msvcrt_locking, METH_VARARGS, locking_doc},
429 {"setmode", msvcrt_setmode, METH_VARARGS, setmode_doc},
430 {"open_osfhandle", msvcrt_open_osfhandle, METH_VARARGS, open_osfhandle_doc},
431 {"get_osfhandle", msvcrt_get_osfhandle, METH_VARARGS, get_osfhandle_doc},
432 {"kbhit", msvcrt_kbhit, METH_VARARGS, kbhit_doc},
433 {"getch", msvcrt_getch, METH_VARARGS, getch_doc},
434 {"getche", msvcrt_getche, METH_VARARGS, getche_doc},
435 {"putch", msvcrt_putch, METH_VARARGS, putch_doc},
436 {"ungetch", msvcrt_ungetch, METH_VARARGS, ungetch_doc},
437 {"SetErrorMode", seterrormode, METH_VARARGS},
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000438#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 {"CrtSetReportFile", msvcrt_setreportfile, METH_VARARGS},
440 {"CrtSetReportMode", msvcrt_setreportmode, METH_VARARGS},
441 {"set_error_mode", msvcrt_seterrormode, METH_VARARGS},
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000442#endif
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +0000443#ifdef _WCONIO_DEFINED
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 {"getwch", msvcrt_getwch, METH_VARARGS, getwch_doc},
445 {"getwche", msvcrt_getwche, METH_VARARGS, getwche_doc},
446 {"putwch", msvcrt_putwch, METH_VARARGS, putwch_doc},
447 {"ungetwch", msvcrt_ungetwch, METH_VARARGS, ungetwch_doc},
Christian Heimesc36625b2008-01-04 13:33:00 +0000448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 {NULL, NULL}
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000450};
451
Martin v. Löwis1a214512008-06-11 05:26:20 +0000452
453static struct PyModuleDef msvcrtmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 PyModuleDef_HEAD_INIT,
455 "msvcrt",
456 NULL,
457 -1,
458 msvcrt_functions,
459 NULL,
460 NULL,
461 NULL,
462 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000463};
464
Thomas Hellera18331d2004-07-28 20:02:52 +0000465PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000466PyInit_msvcrt(void)
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 int st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500469 PyObject *d, *version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 PyObject *m = PyModule_Create(&msvcrtmodule);
471 if (m == NULL)
472 return NULL;
473 d = PyModule_GetDict(m);
Tim Peters5fa0bd62000-12-12 01:58:56 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 /* constants for the locking() function's mode argument */
476 insertint(d, "LK_LOCK", _LK_LOCK);
477 insertint(d, "LK_NBLCK", _LK_NBLCK);
478 insertint(d, "LK_NBRLCK", _LK_NBRLCK);
479 insertint(d, "LK_RLCK", _LK_RLCK);
480 insertint(d, "LK_UNLCK", _LK_UNLCK);
481 insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
482 insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
483 insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
484 insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000485#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 insertint(d, "CRT_WARN", _CRT_WARN);
487 insertint(d, "CRT_ERROR", _CRT_ERROR);
488 insertint(d, "CRT_ASSERT", _CRT_ASSERT);
489 insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
490 insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
491 insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
492 insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
493 insertint(d, "CRTDBG_FILE_STDERR", (int)_CRTDBG_FILE_STDERR);
494 insertint(d, "CRTDBG_FILE_STDOUT", (int)_CRTDBG_FILE_STDOUT);
495 insertint(d, "CRTDBG_REPORT_FILE", (int)_CRTDBG_REPORT_FILE);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000496#endif
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* constants for the crt versions */
Brian Curtin401f9f32012-05-13 11:19:23 -0500499 (void)st;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000500#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
502 _VC_ASSEMBLY_PUBLICKEYTOKEN);
503 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000504#endif
505#ifdef _CRT_ASSEMBLY_VERSION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
507 _CRT_ASSEMBLY_VERSION);
508 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000509#endif
510#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
512 __LIBRARIES_ASSEMBLY_NAME_PREFIX);
513 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000514#endif
515
Brian Curtin401f9f32012-05-13 11:19:23 -0500516 /* constants for the 2010 crt versions */
517#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
518 version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
519 _VC_CRT_MINOR_VERSION,
520 _VC_CRT_BUILD_VERSION,
521 _VC_CRT_RBUILD_VERSION);
522 st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
523 if (st < 0) return NULL;
524#endif
525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 return m;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000527}