blob: 59bf54fa0b7743625aaf1d9b37883fcf5f7863a2 [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)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +030085 return PyErr_SetFromErrno(PyExc_OSError);
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
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +030099Raises OSError on failure. The locked region of the file extends from
Zachary Ware45520892015-05-13 01:22:32 -0500100the 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)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300109/*[clinic end generated code: output=a4a90deca9785a03 input=e97bd15fc4a04fef]*/
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
Steve Dower21fae032017-02-04 15:05:13 -0800114 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 err = _locking(fd, mode, nbytes);
Steve Dower21fae032017-02-04 15:05:13 -0800116 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 Py_END_ALLOW_THREADS
118 if (err != 0)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300119 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000120
Zachary Ware45520892015-05-13 01:22:32 -0500121 Py_RETURN_NONE;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000122}
Guido van Rossum407a22d1997-08-13 19:57:53 +0000123
Zachary Ware45520892015-05-13 01:22:32 -0500124/*[clinic input]
125msvcrt.setmode -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000126
Zachary Ware45520892015-05-13 01:22:32 -0500127 fd: int
128 mode as flags: int
129 /
130
131Set the line-end translation mode for the file descriptor fd.
132
133To set it to text mode, flags should be os.O_TEXT; for binary, it
134should be os.O_BINARY.
135
136Return value is the previous mode.
137[clinic start generated code]*/
138
139static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300140msvcrt_setmode_impl(PyObject *module, int fd, int flags)
141/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000142{
Steve Dower21fae032017-02-04 15:05:13 -0800143 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 flags = _setmode(fd, flags);
Steve Dower21fae032017-02-04 15:05:13 -0800145 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 if (flags == -1)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300147 PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000148
Zachary Ware45520892015-05-13 01:22:32 -0500149 return flags;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000150}
151
Zachary Ware45520892015-05-13 01:22:32 -0500152/*[clinic input]
153msvcrt.open_osfhandle -> long
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000154
Benjamin Petersonca470632016-09-06 13:47:26 -0700155 handle: intptr_t
Zachary Ware45520892015-05-13 01:22:32 -0500156 flags: int
157 /
158
159Create a C runtime file descriptor from the file handle handle.
160
161The flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,
162and os.O_TEXT. The returned file descriptor may be used as a parameter
163to os.fdopen() to create a file object.
164[clinic start generated code]*/
165
166static long
Benjamin Petersonca470632016-09-06 13:47:26 -0700167msvcrt_open_osfhandle_impl(PyObject *module, intptr_t handle, int flags)
Benjamin Petersoncc854492016-09-08 09:29:11 -0700168/*[clinic end generated code: output=cede871bf939d6e3 input=cb2108bbea84514e]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 int fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000171
Steve Dower21fae032017-02-04 15:05:13 -0800172 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 fd = _open_osfhandle(handle, flags);
Steve Dower21fae032017-02-04 15:05:13 -0800174 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 if (fd == -1)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300176 PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000177
Zachary Ware45520892015-05-13 01:22:32 -0500178 return fd;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000179}
180
Zachary Ware45520892015-05-13 01:22:32 -0500181/*[clinic input]
182msvcrt.get_osfhandle -> handle
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000183
Zachary Ware45520892015-05-13 01:22:32 -0500184 fd: int
185 /
186
187Return the file handle for the file descriptor fd.
188
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300189Raises OSError if fd is not recognized.
Zachary Ware45520892015-05-13 01:22:32 -0500190[clinic start generated code]*/
191
Benjamin Petersonca470632016-09-06 13:47:26 -0700192static intptr_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300193msvcrt_get_osfhandle_impl(PyObject *module, int fd)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300194/*[clinic end generated code: output=7ce761dd0de2b503 input=305900f4bfab76c7]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000195{
Benjamin Petersonca470632016-09-06 13:47:26 -0700196 intptr_t handle = -1;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000197
Steve Dower8fc89802015-04-12 00:26:27 -0400198 _Py_BEGIN_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700199 handle = _get_osfhandle(fd);
Steve Dower8fc89802015-04-12 00:26:27 -0400200 _Py_END_SUPPRESS_IPH
Steve Dower940f33a2016-09-08 11:21:54 -0700201 if (handle == -1)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300202 PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum407a22d1997-08-13 19:57:53 +0000203
Zachary Ware45520892015-05-13 01:22:32 -0500204 return handle;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000205}
206
207/* Console I/O */
Zachary Ware45520892015-05-13 01:22:32 -0500208/*[clinic input]
209msvcrt.kbhit -> long
Guido van Rossum407a22d1997-08-13 19:57:53 +0000210
Zachary Ware45520892015-05-13 01:22:32 -0500211Return true if a keypress is waiting to be read.
212[clinic start generated code]*/
213
214static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300215msvcrt_kbhit_impl(PyObject *module)
216/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000217{
Zachary Ware45520892015-05-13 01:22:32 -0500218 return _kbhit();
Guido van Rossum407a22d1997-08-13 19:57:53 +0000219}
220
Zachary Ware45520892015-05-13 01:22:32 -0500221/*[clinic input]
222msvcrt.getch -> byte_char
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000223
Zachary Ware45520892015-05-13 01:22:32 -0500224Read a keypress and return the resulting character as a byte string.
225
226Nothing is echoed to the console. This call will block if a keypress is
227not already available, but will not wait for Enter to be pressed. If the
228pressed key was a special function key, this will return '\000' or
229'\xe0'; the next call will return the keycode. The Control-C keypress
230cannot be read with this function.
231[clinic start generated code]*/
232
233static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300234msvcrt_getch_impl(PyObject *module)
235/*[clinic end generated code: output=a4e51f0565064a7d input=37a40cf0ed0d1153]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_BEGIN_ALLOW_THREADS
240 ch = _getch();
241 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500242 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000243}
244
Zachary Ware45520892015-05-13 01:22:32 -0500245/*[clinic input]
246msvcrt.getwch -> wchar_t
247
248Wide char variant of getch(), returning a Unicode value.
249[clinic start generated code]*/
250
251static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300252msvcrt_getwch_impl(PyObject *module)
253/*[clinic end generated code: output=be9937494e22f007 input=27b3dec8ad823d7c]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000254{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100255 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 Py_BEGIN_ALLOW_THREADS
258 ch = _getwch();
259 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500260 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000261}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000262
Zachary Ware45520892015-05-13 01:22:32 -0500263/*[clinic input]
264msvcrt.getche -> byte_char
Christian Heimes2f1019e2007-12-10 16:18:49 +0000265
Zachary Ware45520892015-05-13 01:22:32 -0500266Similar to getch(), but the keypress will be echoed if possible.
267[clinic start generated code]*/
268
269static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300270msvcrt_getche_impl(PyObject *module)
271/*[clinic end generated code: output=d8f7db4fd2990401 input=43311ade9ed4a9c0]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 int ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 Py_BEGIN_ALLOW_THREADS
276 ch = _getche();
277 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500278 return ch;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000279}
280
Zachary Ware45520892015-05-13 01:22:32 -0500281/*[clinic input]
282msvcrt.getwche -> wchar_t
283
284Wide char variant of getche(), returning a Unicode value.
285[clinic start generated code]*/
286
287static wchar_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300288msvcrt_getwche_impl(PyObject *module)
289/*[clinic end generated code: output=d0dae5ba3829d596 input=49337d59d1a591f8]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000290{
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100291 wchar_t ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 Py_BEGIN_ALLOW_THREADS
294 ch = _getwche();
295 Py_END_ALLOW_THREADS
Zachary Ware45520892015-05-13 01:22:32 -0500296 return ch;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000297}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000298
Zachary Ware45520892015-05-13 01:22:32 -0500299/*[clinic input]
300msvcrt.putch
301
302 char: char
303 /
304
305Print the byte string char to the console without buffering.
306[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000307
308static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300309msvcrt_putch_impl(PyObject *module, char char_value)
310/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000311{
Steve Dower21fae032017-02-04 15:05:13 -0800312 _Py_BEGIN_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500313 _putch(char_value);
Steve Dower21fae032017-02-04 15:05:13 -0800314 _Py_END_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500315 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000316}
317
Zachary Ware45520892015-05-13 01:22:32 -0500318/*[clinic input]
319msvcrt.putwch
320
Zachary Ware77772c02015-05-13 10:58:35 -0500321 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500322 /
323
324Wide char variant of putch(), accepting a Unicode value.
325[clinic start generated code]*/
326
Christian Heimes2f1019e2007-12-10 16:18:49 +0000327static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300328msvcrt_putwch_impl(PyObject *module, int unicode_char)
329/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000330{
Steve Dower21fae032017-02-04 15:05:13 -0800331 _Py_BEGIN_SUPPRESS_IPH
Zachary Ware45520892015-05-13 01:22:32 -0500332 _putwch(unicode_char);
Steve Dower21fae032017-02-04 15:05:13 -0800333 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000335
336}
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000337
Zachary Ware45520892015-05-13 01:22:32 -0500338/*[clinic input]
339msvcrt.ungetch
340
341 char: char
342 /
343
344Opposite of getch.
345
346Cause the byte string char to be "pushed back" into the
347console buffer; it will be the next character read by
348getch() or getche().
349[clinic start generated code]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000350
Tim Peters5fa0bd62000-12-12 01:58:56 +0000351static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300352msvcrt_ungetch_impl(PyObject *module, char char_value)
353/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
Guido van Rossum407a22d1997-08-13 19:57:53 +0000354{
Steve Dower21fae032017-02-04 15:05:13 -0800355 int res;
356
357 _Py_BEGIN_SUPPRESS_IPH
358 res = _ungetch(char_value);
359 _Py_END_SUPPRESS_IPH
360
361 if (res == EOF)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300362 return PyErr_SetFromErrno(PyExc_OSError);
Zachary Ware45520892015-05-13 01:22:32 -0500363 Py_RETURN_NONE;
Guido van Rossum407a22d1997-08-13 19:57:53 +0000364}
365
Zachary Ware45520892015-05-13 01:22:32 -0500366/*[clinic input]
367msvcrt.ungetwch
368
Zachary Ware77772c02015-05-13 10:58:35 -0500369 unicode_char: int(accept={str})
Zachary Ware45520892015-05-13 01:22:32 -0500370 /
371
372Wide char variant of ungetch(), accepting a Unicode value.
373[clinic start generated code]*/
374
Christian Heimes2f1019e2007-12-10 16:18:49 +0000375static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300376msvcrt_ungetwch_impl(PyObject *module, int unicode_char)
377/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
Christian Heimes2f1019e2007-12-10 16:18:49 +0000378{
Steve Dower21fae032017-02-04 15:05:13 -0800379 int res;
380
381 _Py_BEGIN_SUPPRESS_IPH
382 res = _ungetwch(unicode_char);
383 _Py_END_SUPPRESS_IPH
384
385 if (res == WEOF)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300386 return PyErr_SetFromErrno(PyExc_OSError);
Zachary Ware45520892015-05-13 01:22:32 -0500387 Py_RETURN_NONE;
Christian Heimes2f1019e2007-12-10 16:18:49 +0000388}
Tim Peters5fa0bd62000-12-12 01:58:56 +0000389
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000390#ifdef _DEBUG
Zachary Ware45520892015-05-13 01:22:32 -0500391/*[clinic input]
392msvcrt.CrtSetReportFile -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000393
Zachary Ware45520892015-05-13 01:22:32 -0500394 type: int
395 file: int
396 /
397
398Wrapper around _CrtSetReportFile.
399
400Only available on Debug builds.
401[clinic start generated code]*/
402
403static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300404msvcrt_CrtSetReportFile_impl(PyObject *module, int type, int file)
405/*[clinic end generated code: output=df291c7fe032eb68 input=bb8f721a604fcc45]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000406{
Steve Dower21fae032017-02-04 15:05:13 -0800407 long res;
408
409 _Py_BEGIN_SUPPRESS_IPH
410 res = (long)_CrtSetReportFile(type, (_HFILE)file);
411 _Py_END_SUPPRESS_IPH
412
413 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000414}
415
Zachary Ware45520892015-05-13 01:22:32 -0500416/*[clinic input]
417msvcrt.CrtSetReportMode -> long
418
419 type: int
420 mode: int
421 /
422
423Wrapper around _CrtSetReportMode.
424
425Only available on Debug builds.
426[clinic start generated code]*/
427
428static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300429msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
430/*[clinic end generated code: output=b2863761523de317 input=9319d29b4319426b]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000433
Steve Dower21fae032017-02-04 15:05:13 -0800434 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 res = _CrtSetReportMode(type, mode);
Steve Dower21fae032017-02-04 15:05:13 -0800436 _Py_END_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 if (res == -1)
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300438 PyErr_SetFromErrno(PyExc_OSError);
Zachary Ware45520892015-05-13 01:22:32 -0500439 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000440}
441
Zachary Ware45520892015-05-13 01:22:32 -0500442/*[clinic input]
443msvcrt.set_error_mode -> long
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000444
Zachary Ware45520892015-05-13 01:22:32 -0500445 mode: int
446 /
447
448Wrapper around _set_error_mode.
449
450Only available on Debug builds.
451[clinic start generated code]*/
452
453static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300454msvcrt_set_error_mode_impl(PyObject *module, int mode)
455/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
Zachary Ware45520892015-05-13 01:22:32 -0500456{
Steve Dower21fae032017-02-04 15:05:13 -0800457 long res;
458
459 _Py_BEGIN_SUPPRESS_IPH
460 res = _set_error_mode(mode);
461 _Py_END_SUPPRESS_IPH
462
463 return res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000464}
Zachary Ware45520892015-05-13 01:22:32 -0500465#endif /* _DEBUG */
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000466
Zachary Ware45520892015-05-13 01:22:32 -0500467/*[clinic input]
468msvcrt.SetErrorMode
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000469
Zachary Ware45520892015-05-13 01:22:32 -0500470 mode: unsigned_int(bitwise=True)
471 /
472
473Wrapper around SetErrorMode.
474[clinic start generated code]*/
475
476static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300477msvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
478/*[clinic end generated code: output=01d529293f00da8f input=d8b167258d32d907]*/
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000479{
Zachary Ware45520892015-05-13 01:22:32 -0500480 unsigned int res;
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000481
Steve Dower21fae032017-02-04 15:05:13 -0800482 _Py_BEGIN_SUPPRESS_IPH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 res = SetErrorMode(mode);
Steve Dower21fae032017-02-04 15:05:13 -0800484 _Py_END_SUPPRESS_IPH
485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 return PyLong_FromUnsignedLong(res);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000487}
488
Zachary Ware45520892015-05-13 01:22:32 -0500489/*[clinic input]
490[clinic start generated code]*/
491/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
Tim Peters5fa0bd62000-12-12 01:58:56 +0000492
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000493/* List of functions exported by this module */
494static struct PyMethodDef msvcrt_functions[] = {
Zachary Ware45520892015-05-13 01:22:32 -0500495 MSVCRT_HEAPMIN_METHODDEF
496 MSVCRT_LOCKING_METHODDEF
497 MSVCRT_SETMODE_METHODDEF
498 MSVCRT_OPEN_OSFHANDLE_METHODDEF
499 MSVCRT_GET_OSFHANDLE_METHODDEF
500 MSVCRT_KBHIT_METHODDEF
501 MSVCRT_GETCH_METHODDEF
502 MSVCRT_GETCHE_METHODDEF
503 MSVCRT_PUTCH_METHODDEF
504 MSVCRT_UNGETCH_METHODDEF
505 MSVCRT_SETERRORMODE_METHODDEF
506 MSVCRT_CRTSETREPORTFILE_METHODDEF
507 MSVCRT_CRTSETREPORTMODE_METHODDEF
508 MSVCRT_SET_ERROR_MODE_METHODDEF
509 MSVCRT_GETWCH_METHODDEF
510 MSVCRT_GETWCHE_METHODDEF
511 MSVCRT_PUTWCH_METHODDEF
512 MSVCRT_UNGETWCH_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 {NULL, NULL}
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000514};
515
Martin v. Löwis1a214512008-06-11 05:26:20 +0000516
517static struct PyModuleDef msvcrtmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 PyModuleDef_HEAD_INIT,
519 "msvcrt",
520 NULL,
521 -1,
522 msvcrt_functions,
523 NULL,
524 NULL,
525 NULL,
526 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000527};
528
Zachary Ware45520892015-05-13 01:22:32 -0500529static void
530insertint(PyObject *d, char *name, int value)
531{
532 PyObject *v = PyLong_FromLong((long) value);
533 if (v == NULL) {
534 /* Don't bother reporting this error */
535 PyErr_Clear();
536 }
537 else {
538 PyDict_SetItemString(d, name, v);
539 Py_DECREF(v);
540 }
541}
542
Thomas Hellera18331d2004-07-28 20:02:52 +0000543PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000544PyInit_msvcrt(void)
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 int st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500547 PyObject *d, *version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 PyObject *m = PyModule_Create(&msvcrtmodule);
549 if (m == NULL)
550 return NULL;
551 d = PyModule_GetDict(m);
Tim Peters5fa0bd62000-12-12 01:58:56 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* constants for the locking() function's mode argument */
554 insertint(d, "LK_LOCK", _LK_LOCK);
555 insertint(d, "LK_NBLCK", _LK_NBLCK);
556 insertint(d, "LK_NBRLCK", _LK_NBRLCK);
557 insertint(d, "LK_RLCK", _LK_RLCK);
558 insertint(d, "LK_UNLCK", _LK_UNLCK);
559 insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
560 insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
561 insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
562 insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000563#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 insertint(d, "CRT_WARN", _CRT_WARN);
565 insertint(d, "CRT_ERROR", _CRT_ERROR);
566 insertint(d, "CRT_ASSERT", _CRT_ASSERT);
567 insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
568 insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
569 insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
570 insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
571 insertint(d, "CRTDBG_FILE_STDERR", (int)_CRTDBG_FILE_STDERR);
572 insertint(d, "CRTDBG_FILE_STDOUT", (int)_CRTDBG_FILE_STDOUT);
573 insertint(d, "CRTDBG_REPORT_FILE", (int)_CRTDBG_REPORT_FILE);
Martin v. Löwis3dc33d12007-08-31 07:58:36 +0000574#endif
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 /* constants for the crt versions */
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000577#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
579 _VC_ASSEMBLY_PUBLICKEYTOKEN);
580 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000581#endif
582#ifdef _CRT_ASSEMBLY_VERSION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
584 _CRT_ASSEMBLY_VERSION);
585 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000586#endif
587#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
589 __LIBRARIES_ASSEMBLY_NAME_PREFIX);
590 if (st < 0) return NULL;
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000591#endif
592
Brian Curtin401f9f32012-05-13 11:19:23 -0500593 /* constants for the 2010 crt versions */
594#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
595 version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
596 _VC_CRT_MINOR_VERSION,
597 _VC_CRT_BUILD_VERSION,
598 _VC_CRT_RBUILD_VERSION);
599 st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
600 if (st < 0) return NULL;
601#endif
Victor Stinnerba452952015-09-21 22:40:28 +0200602 /* make compiler warning quiet if st is unused */
603 (void)st;
Brian Curtin401f9f32012-05-13 11:19:23 -0500604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 return m;
Guido van Rossum29c1ea51997-08-07 00:11:34 +0000606}