blob: c9d1e6cec6025a6ba7935174a6fe1ee6f59fc67d [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
Zachary Ware45520892015-05-13 01:22:32 -050035/*[python input]
Benjamin Petersonca470632016-09-06 13:47:26 -070036class intptr_t_converter(CConverter):
37 type = 'intptr_t'
Zachary Ware45520892015-05-13 01:22:32 -050038 format_unit = '"_Py_PARSE_INTPTR"'
Guido van Rossum407a22d1997-08-13 19:57:53 +000039
Zachary Ware45520892015-05-13 01:22:32 -050040class handle_return_converter(long_return_converter):
Benjamin Petersonca470632016-09-06 13:47:26 -070041 type = 'intptr_t'
Zachary Ware45520892015-05-13 01:22:32 -050042 cast = '(void *)'
43 conversion_fn = 'PyLong_FromVoidPtr'
44
45class byte_char_return_converter(CReturnConverter):
46 type = 'int'
47
48 def render(self, function, data):
49 data.declarations.append('char s[1];')
50 data.return_value = 's[0]'
51 data.return_conversion.append(
52 'return_value = PyBytes_FromStringAndSize(s, 1);\n')
53
54class wchar_t_return_converter(CReturnConverter):
55 type = 'wchar_t'
56
57 def render(self, function, data):
58 self.declare(data)
59 data.return_conversion.append(
60 'return_value = PyUnicode_FromOrdinal(_return_value);\n')
61[python start generated code]*/
Benjamin Petersoncc854492016-09-08 09:29:11 -070062/*[python end generated code: output=da39a3ee5e6b4b0d input=b59f1663dba11997]*/
Zachary Ware45520892015-05-13 01:22:32 -050063
64/*[clinic input]
65module msvcrt
66[clinic start generated code]*/
67/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f31a87a783d036cd]*/
68
69#include "clinic/msvcrtmodule.c.h"
70
71/*[clinic input]
72msvcrt.heapmin
73
74Minimize the malloc() heap.
75
76Force the malloc() heap to clean itself up and return unused blocks
77to the operating system. On failure, this raises OSError.
78[clinic start generated code]*/
79
80static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030081msvcrt_heapmin_impl(PyObject *module)
82/*[clinic end generated code: output=1ba00f344782dc19 input=82e1771d21bde2d8]*/
Zachary Ware45520892015-05-13 01:22:32 -050083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 if (_heapmin() != 0)
85 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +000086
Zachary Ware45520892015-05-13 01:22:32 -050087 Py_RETURN_NONE;
Guido van Rossum29c1ea51997-08-07 00:11:34 +000088}
Zachary Ware45520892015-05-13 01:22:32 -050089/*[clinic input]
90msvcrt.locking
Guido van Rossum29c1ea51997-08-07 00:11:34 +000091
Zachary Ware45520892015-05-13 01:22:32 -050092 fd: int
93 mode: int
94 nbytes: long
95 /
Benjamin Peterson1baf4652009-12-31 03:11:23 +000096
Zachary Ware45520892015-05-13 01:22:32 -050097Lock part of a file based on file descriptor fd from the C runtime.
98
99Raises IOError on failure. The locked region of the file extends from
100the current file position for nbytes bytes, and may continue beyond
101the end of the file. mode must be one of the LK_* constants listed
102below. Multiple regions in a file may be locked at the same time, but
103may not overlap. Adjacent regions are not merged; they must be unlocked
104individually.
105[clinic start generated code]*/
106
Tim Peters5fa0bd62000-12-12 01:58:56 +0000107static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300108msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes)
109/*[clinic end generated code: output=a4a90deca9785a03 input=d9f13f0f6a713ba7]*/
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 int err;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_BEGIN_ALLOW_THREADS
114 err = _locking(fd, mode, nbytes);
115 Py_END_ALLOW_THREADS
116 if (err != 0)
117 return PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000118
Zachary Ware45520892015-05-13 01:22:32 -0500119 Py_RETURN_NONE;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000120}
Guido van Rossum407a22d1997-08-13 19:57:53 +0000121
Zachary Ware45520892015-05-13 01:22:32 -0500122/*[clinic input]
123msvcrt.setmode -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000124
Zachary Ware45520892015-05-13 01:22:32 -0500125 fd: int
126 mode as flags: int
127 /
128
129Set the line-end translation mode for the file descriptor fd.
130
131To set it to text mode, flags should be os.O_TEXT; for binary, it
132should be os.O_BINARY.
133
134Return value is the previous mode.
135[clinic start generated code]*/
136
137static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300138msvcrt_setmode_impl(PyObject *module, int fd, int flags)
139/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 flags = _setmode(fd, flags);
142 if (flags == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500143 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000144
Zachary Ware45520892015-05-13 01:22:32 -0500145 return flags;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000146}
147
Zachary Ware45520892015-05-13 01:22:32 -0500148/*[clinic input]
149msvcrt.open_osfhandle -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000150
Benjamin Petersonca470632016-09-06 13:47:26 -0700151 handle: intptr_t
Zachary Ware45520892015-05-13 01:22:32 -0500152 flags: int
153 /
154
155Create a C runtime file descriptor from the file handle handle.
156
157The flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,
158and os.O_TEXT. The returned file descriptor may be used as a parameter
159to os.fdopen() to create a file object.
160[clinic start generated code]*/
161
162static long
Benjamin Petersonca470632016-09-06 13:47:26 -0700163msvcrt_open_osfhandle_impl(PyObject *module, intptr_t handle, int flags)
Benjamin Petersoncc854492016-09-08 09:29:11 -0700164/*[clinic end generated code: output=cede871bf939d6e3 input=cb2108bbea84514e]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 int fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 fd = _open_osfhandle(handle, flags);
169 if (fd == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500170 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000171
Zachary Ware45520892015-05-13 01:22:32 -0500172 return fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000173}
174
Zachary Ware45520892015-05-13 01:22:32 -0500175/*[clinic input]
176msvcrt.get_osfhandle -> handle
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000177
Zachary Ware45520892015-05-13 01:22:32 -0500178 fd: int
179 /
180
181Return the file handle for the file descriptor fd.
182
183Raises IOError if fd is not recognized.
184[clinic start generated code]*/
185
Benjamin Petersonca470632016-09-06 13:47:26 -0700186static intptr_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300187msvcrt_get_osfhandle_impl(PyObject *module, int fd)
Benjamin Petersoncc854492016-09-08 09:29:11 -0700188/*[clinic end generated code: output=7ce761dd0de2b503 input=c7d18d02c8017ec1]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000189{
Benjamin Petersonca470632016-09-06 13:47:26 -0700190 intptr_t handle = -1;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000191
Steve Dower8fc89802015-04-12 00:26:27 -0400192 _Py_BEGIN_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700193 handle = _get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -0400194 _Py_END_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700195 if (handle == -1)
196 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000197
Zachary Ware45520892015-05-13 01:22:32 -0500198 return handle;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000199}
200
201/* Console I/O */
Zachary Ware45520892015-05-13 01:22:32 -0500202/*[clinic input]
203msvcrt.kbhit -> long
Guido van Rossum407a22d1997-08-13 19:57:53 +0000204
Zachary Ware45520892015-05-13 01:22:32 -0500205Return true if a keypress is waiting to be read.
206[clinic start generated code]*/
207
208static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300209msvcrt_kbhit_impl(PyObject *module)
210/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000211{
Zachary Ware45520892015-05-13 01:22:32 -0500212 return _kbhit();
Guido van Rossum407a22d1997-08-13 19:57:53 +0000213}
214
Zachary Ware45520892015-05-13 01:22:32 -0500215/*[clinic input]
216msvcrt.getch -> byte_char
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000217
Zachary Ware45520892015-05-13 01:22:32 -0500218Read a keypress and return the resulting character as a byte string.
219
220Nothing is echoed to the console. This call will block if a keypress is
221not already available, but will not wait for Enter to be pressed. If the
222pressed key was a special function key, this will return '\000' or
223'\xe0'; the next call will return the keycode. The Control-C keypress
224cannot be read with this function.
225[clinic start generated code]*/
226
227static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300228msvcrt_getch_impl(PyObject *module)
229/*[clinic end generated code: output=a4e51f0565064a7d input=37a40cf0ed0d1153]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 Py_BEGIN_ALLOW_THREADS
234 ch = _getch();
235 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500236 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000237}
238
Zachary Ware45520892015-05-13 01:22:32 -0500239/*[clinic input]
240msvcrt.getwch -> wchar_t
241
242Wide char variant of getch(), returning a Unicode value.
243[clinic start generated code]*/
244
245static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300246msvcrt_getwch_impl(PyObject *module)
247/*[clinic end generated code: output=be9937494e22f007 input=27b3dec8ad823d7c]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000248{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100249 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_BEGIN_ALLOW_THREADS
252 ch = _getwch();
253 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500254 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000255}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000256
Zachary Ware45520892015-05-13 01:22:32 -0500257/*[clinic input]
258msvcrt.getche -> byte_char
Christian Heimes2f1019e2007-12-10 16:18:49 +0000259
Zachary Ware45520892015-05-13 01:22:32 -0500260Similar to getch(), but the keypress will be echoed if possible.
261[clinic start generated code]*/
262
263static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300264msvcrt_getche_impl(PyObject *module)
265/*[clinic end generated code: output=d8f7db4fd2990401 input=43311ade9ed4a9c0]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 Py_BEGIN_ALLOW_THREADS
270 ch = _getche();
271 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500272 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000273}
274
Zachary Ware45520892015-05-13 01:22:32 -0500275/*[clinic input]
276msvcrt.getwche -> wchar_t
277
278Wide char variant of getche(), returning a Unicode value.
279[clinic start generated code]*/
280
281static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300282msvcrt_getwche_impl(PyObject *module)
283/*[clinic end generated code: output=d0dae5ba3829d596 input=49337d59d1a591f8]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000284{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100285 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 Py_BEGIN_ALLOW_THREADS
288 ch = _getwche();
289 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500290 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000291}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000292
Zachary Ware45520892015-05-13 01:22:32 -0500293/*[clinic input]
294msvcrt.putch
295
296 char: char
297 /
298
299Print the byte string char to the console without buffering.
300[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000301
302static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300303msvcrt_putch_impl(PyObject *module, char char_value)
304/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000305{
Zachary Ware45520892015-05-13 01:22:32 -0500306 _putch(char_value);
307 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000308}
309
Zachary Ware45520892015-05-13 01:22:32 -0500310/*[clinic input]
311msvcrt.putwch
312
Zachary Ware77772c02015-05-13 10:58:35 -0500313 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500314 /
315
316Wide char variant of putch(), accepting a Unicode value.
317[clinic start generated code]*/
318
Christian Heimes2f1019e2007-12-10 16:18:49 +0000319static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300320msvcrt_putwch_impl(PyObject *module, int unicode_char)
321/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000322{
Zachary Ware45520892015-05-13 01:22:32 -0500323 _putwch(unicode_char);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000325
326}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000327
Zachary Ware45520892015-05-13 01:22:32 -0500328/*[clinic input]
329msvcrt.ungetch
330
331 char: char
332 /
333
334Opposite of getch.
335
336Cause the byte string char to be "pushed back" into the
337console buffer; it will be the next character read by
338getch() or getche().
339[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000340
Tim Peters5fa0bd62000-12-12 01:58:56 +0000341static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300342msvcrt_ungetch_impl(PyObject *module, char char_value)
343/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000344{
Zachary Ware45520892015-05-13 01:22:32 -0500345 if (_ungetch(char_value) == EOF)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 return PyErr_SetFromErrno(PyExc_IOError);
Zachary Ware45520892015-05-13 01:22:32 -0500347 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000348}
349
Zachary Ware45520892015-05-13 01:22:32 -0500350/*[clinic input]
351msvcrt.ungetwch
352
Zachary Ware77772c02015-05-13 10:58:35 -0500353 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500354 /
355
356Wide char variant of ungetch(), accepting a Unicode value.
357[clinic start generated code]*/
358
Christian Heimes2f1019e2007-12-10 16:18:49 +0000359static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300360msvcrt_ungetwch_impl(PyObject *module, int unicode_char)
361/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000362{
Zachary Ware45520892015-05-13 01:22:32 -0500363 if (_ungetwch(unicode_char) == WEOF)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 return PyErr_SetFromErrno(PyExc_IOError);
Zachary Ware45520892015-05-13 01:22:32 -0500365 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000366}
Tim Peters5fa0bd62000-12-12 01:58:56 +0000367
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000368#ifdef _DEBUG
Zachary Ware45520892015-05-13 01:22:32 -0500369/*[clinic input]
370msvcrt.CrtSetReportFile -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000371
Zachary Ware45520892015-05-13 01:22:32 -0500372 type: int
373 file: int
374 /
375
376Wrapper around _CrtSetReportFile.
377
378Only available on Debug builds.
379[clinic start generated code]*/
380
381static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300382msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file)
383/*[clinic end generated code: output=df291c7fe032eb68 input=bb8f721a604fcc45]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000384{
Zachary Ware45520892015-05-13 01:22:32 -0500385 return (long)_CrtSetReportFile(type, (_HFILE)file);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000386}
387
Zachary Ware45520892015-05-13 01:22:32 -0500388/*[clinic input]
389msvcrt.CrtSetReportMode -> long
390
391 type: int
392 mode: int
393 /
394
395Wrapper around _CrtSetReportMode.
396
397Only available on Debug builds.
398[clinic start generated code]*/
399
400static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300401msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
402/*[clinic end generated code: output=b2863761523de317 input=9319d29b4319426b]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 res = _CrtSetReportMode(type, mode);
407 if (res == -1)
Zachary Ware45520892015-05-13 01:22:32 -0500408 PyErr_SetFromErrno(PyExc_IOError);
409 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000410}
411
Zachary Ware45520892015-05-13 01:22:32 -0500412/*[clinic input]
413msvcrt.set_error_mode -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000414
Zachary Ware45520892015-05-13 01:22:32 -0500415 mode: int
416 /
417
418Wrapper around _set_error_mode.
419
420Only available on Debug builds.
421[clinic start generated code]*/
422
423static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300424msvcrt_set_error_mode_impl(PyObject *module, int mode)
425/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
Zachary Ware45520892015-05-13 01:22:32 -0500426{
427 return _set_error_mode(mode);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000428}
Zachary Ware45520892015-05-13 01:22:32 -0500429#endif /* _DEBUG */
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000430
Zachary Ware45520892015-05-13 01:22:32 -0500431/*[clinic input]
432msvcrt.SetErrorMode
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000433
Zachary Ware45520892015-05-13 01:22:32 -0500434 mode: unsigned_int(bitwise=True)
435 /
436
437Wrapper around SetErrorMode.
438[clinic start generated code]*/
439
440static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300441msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
442/*[clinic end generated code: output=01d529293f00da8f input=d8b167258d32d907]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000443{
Zachary Ware45520892015-05-13 01:22:32 -0500444 unsigned int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 res = SetErrorMode(mode);
447 return PyLong_FromUnsignedLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000448}
449
Zachary Ware45520892015-05-13 01:22:32 -0500450/*[clinic input]
451[clinic start generated code]*/
452/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
Tim Peters5fa0bd62000-12-12 01:58:56 +0000453
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000454/* List of functions exported by this module */
455static struct PyMethodDef msvcrt_functions[] = {
Zachary Ware45520892015-05-13 01:22:32 -0500456 MSVCRT_HEAPMIN_METHODDEF
457 MSVCRT_LOCKING_METHODDEF
458 MSVCRT_SETMODE_METHODDEF
459 MSVCRT_OPEN_OSFHANDLE_METHODDEF
460 MSVCRT_GET_OSFHANDLE_METHODDEF
461 MSVCRT_KBHIT_METHODDEF
462 MSVCRT_GETCH_METHODDEF
463 MSVCRT_GETCHE_METHODDEF
464 MSVCRT_PUTCH_METHODDEF
465 MSVCRT_UNGETCH_METHODDEF
466 MSVCRT_SETERRORMODE_METHODDEF
467 MSVCRT_CRTSETREPORTFILE_METHODDEF
468 MSVCRT_CRTSETREPORTMODE_METHODDEF
469 MSVCRT_SET_ERROR_MODE_METHODDEF
470 MSVCRT_GETWCH_METHODDEF
471 MSVCRT_GETWCHE_METHODDEF
472 MSVCRT_PUTWCH_METHODDEF
473 MSVCRT_UNGETWCH_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 {NULL, NULL}
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000475};
476
Martin v. Löwis1a214512008-06-11 05:26:20 +0000477
478static struct PyModuleDef msvcrtmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 PyModuleDef_HEAD_INIT,
480 "msvcrt",
481 NULL,
482 -1,
483 msvcrt_functions,
484 NULL,
485 NULL,
486 NULL,
487 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000488};
489
Zachary Ware45520892015-05-13 01:22:32 -0500490static void
491insertint(PyObject *d, char *name, int value)
492{
493 PyObject *v = PyLong_FromLong((long) value);
494 if (v == NULL) {
495 /* Don't bother reporting this error */
496 PyErr_Clear();
497 }
498 else {
499 PyDict_SetItemString(d, name, v);
500 Py_DECREF(v);
501 }
502}
503
Thomas Hellera18331d2004-07-28 20:02:52 +0000504PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000505PyInit_msvcrt(void)
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 int st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500508 PyObject *d, *version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 PyObject *m = PyModule_Create(&msvcrtmodule);
510 if (m == NULL)
511 return NULL;
512 d = PyModule_GetDict(m);
Tim Peters5fa0bd62000-12-12 01:58:56 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 /* constants for the locking() function's mode argument */
515 insertint(d, "LK_LOCK", _LK_LOCK);
516 insertint(d, "LK_NBLCK", _LK_NBLCK);
517 insertint(d, "LK_NBRLCK", _LK_NBRLCK);
518 insertint(d, "LK_RLCK", _LK_RLCK);
519 insertint(d, "LK_UNLCK", _LK_UNLCK);
520 insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
521 insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
522 insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
523 insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000524#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 insertint(d, "CRT_WARN", _CRT_WARN);
526 insertint(d, "CRT_ERROR", _CRT_ERROR);
527 insertint(d, "CRT_ASSERT", _CRT_ASSERT);
528 insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
529 insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
530 insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
531 insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
532 insertint(d, "CRTDBG_FILE_STDERR", (int)_CRTDBG_FILE_STDERR);
533 insertint(d, "CRTDBG_FILE_STDOUT", (int)_CRTDBG_FILE_STDOUT);
534 insertint(d, "CRTDBG_REPORT_FILE", (int)_CRTDBG_REPORT_FILE);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000535#endif
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 /* constants for the crt versions */
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000538#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
540 _VC_ASSEMBLY_PUBLICKEYTOKEN);
541 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000542#endif
543#ifdef _CRT_ASSEMBLY_VERSION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
545 _CRT_ASSEMBLY_VERSION);
546 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000547#endif
548#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
550 __LIBRARIES_ASSEMBLY_NAME_PREFIX);
551 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000552#endif
553
Brian Curtin401f9f32012-05-13 11:19:23 -0500554 /* constants for the 2010 crt versions */
555#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
556 version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
557 _VC_CRT_MINOR_VERSION,
558 _VC_CRT_BUILD_VERSION,
559 _VC_CRT_RBUILD_VERSION);
560 st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
561 if (st < 0) return NULL;
562#endif
Victor Stinnerba452952015-09-21 22:40:28 +0200563 /* make compiler warning quiet if st is unused */
564 (void)st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 return m;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000567}