17db96d56Sopenharmony_ci/*********************************************************
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci    msvcrtmodule.c
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci    A Python interface to the Microsoft Visual C Runtime
67db96d56Sopenharmony_ci    Library, providing access to those non-portable, but
77db96d56Sopenharmony_ci    still useful routines.
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci    Only ever compiled with an MS compiler, so no attempt
107db96d56Sopenharmony_ci    has been made to avoid MS language extensions, etc...
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci    This may only work on NT or 95...
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    Author: Mark Hammond and Guido van Rossum.
157db96d56Sopenharmony_ci    Maintenance: Guido van Rossum.
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci***********************************************************/
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci#include "Python.h"
207db96d56Sopenharmony_ci#include "pycore_fileutils.h"     // _Py_BEGIN_SUPPRESS_IPH
217db96d56Sopenharmony_ci#include "malloc.h"
227db96d56Sopenharmony_ci#include <io.h>
237db96d56Sopenharmony_ci#include <conio.h>
247db96d56Sopenharmony_ci#include <sys/locking.h>
257db96d56Sopenharmony_ci#include <crtdbg.h>
267db96d56Sopenharmony_ci#include <windows.h>
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci#ifdef _MSC_VER
297db96d56Sopenharmony_ci#if _MSC_VER >= 1500 && _MSC_VER < 1600
307db96d56Sopenharmony_ci#include <crtassem.h>
317db96d56Sopenharmony_ci#elif _MSC_VER >= 1600
327db96d56Sopenharmony_ci#include <crtversion.h>
337db96d56Sopenharmony_ci#endif
347db96d56Sopenharmony_ci#endif
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci/*[python input]
377db96d56Sopenharmony_ciclass HANDLE_converter(CConverter):
387db96d56Sopenharmony_ci    type = 'void *'
397db96d56Sopenharmony_ci    format_unit = '"_Py_PARSE_UINTPTR"'
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ciclass HANDLE_return_converter(CReturnConverter):
427db96d56Sopenharmony_ci    type = 'void *'
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci    def render(self, function, data):
457db96d56Sopenharmony_ci        self.declare(data)
467db96d56Sopenharmony_ci        self.err_occurred_if(
477db96d56Sopenharmony_ci            "_return_value == NULL || _return_value == INVALID_HANDLE_VALUE",
487db96d56Sopenharmony_ci            data)
497db96d56Sopenharmony_ci        data.return_conversion.append(
507db96d56Sopenharmony_ci            'return_value = PyLong_FromVoidPtr(_return_value);\n')
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciclass byte_char_return_converter(CReturnConverter):
537db96d56Sopenharmony_ci    type = 'int'
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    def render(self, function, data):
567db96d56Sopenharmony_ci        data.declarations.append('char s[1];')
577db96d56Sopenharmony_ci        data.return_value = 's[0]'
587db96d56Sopenharmony_ci        data.return_conversion.append(
597db96d56Sopenharmony_ci            'return_value = PyBytes_FromStringAndSize(s, 1);\n')
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciclass wchar_t_return_converter(CReturnConverter):
627db96d56Sopenharmony_ci    type = 'wchar_t'
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    def render(self, function, data):
657db96d56Sopenharmony_ci        self.declare(data)
667db96d56Sopenharmony_ci        data.return_conversion.append(
677db96d56Sopenharmony_ci            'return_value = PyUnicode_FromOrdinal(_return_value);\n')
687db96d56Sopenharmony_ci[python start generated code]*/
697db96d56Sopenharmony_ci/*[python end generated code: output=da39a3ee5e6b4b0d input=d102511df3cda2eb]*/
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci/*[clinic input]
727db96d56Sopenharmony_cimodule msvcrt
737db96d56Sopenharmony_ci[clinic start generated code]*/
747db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f31a87a783d036cd]*/
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci#include "clinic/msvcrtmodule.c.h"
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci/*[clinic input]
797db96d56Sopenharmony_cimsvcrt.heapmin
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ciMinimize the malloc() heap.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ciForce the malloc() heap to clean itself up and return unused blocks
847db96d56Sopenharmony_cito the operating system. On failure, this raises OSError.
857db96d56Sopenharmony_ci[clinic start generated code]*/
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_cistatic PyObject *
887db96d56Sopenharmony_cimsvcrt_heapmin_impl(PyObject *module)
897db96d56Sopenharmony_ci/*[clinic end generated code: output=1ba00f344782dc19 input=82e1771d21bde2d8]*/
907db96d56Sopenharmony_ci{
917db96d56Sopenharmony_ci    if (_heapmin() != 0)
927db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    Py_RETURN_NONE;
957db96d56Sopenharmony_ci}
967db96d56Sopenharmony_ci/*[clinic input]
977db96d56Sopenharmony_cimsvcrt.locking
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci    fd: int
1007db96d56Sopenharmony_ci    mode: int
1017db96d56Sopenharmony_ci    nbytes: long
1027db96d56Sopenharmony_ci    /
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciLock part of a file based on file descriptor fd from the C runtime.
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ciRaises OSError on failure. The locked region of the file extends from
1077db96d56Sopenharmony_cithe current file position for nbytes bytes, and may continue beyond
1087db96d56Sopenharmony_cithe end of the file. mode must be one of the LK_* constants listed
1097db96d56Sopenharmony_cibelow. Multiple regions in a file may be locked at the same time, but
1107db96d56Sopenharmony_cimay not overlap. Adjacent regions are not merged; they must be unlocked
1117db96d56Sopenharmony_ciindividually.
1127db96d56Sopenharmony_ci[clinic start generated code]*/
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_cistatic PyObject *
1157db96d56Sopenharmony_cimsvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes)
1167db96d56Sopenharmony_ci/*[clinic end generated code: output=a4a90deca9785a03 input=e97bd15fc4a04fef]*/
1177db96d56Sopenharmony_ci{
1187db96d56Sopenharmony_ci    int err;
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci    if (PySys_Audit("msvcrt.locking", "iil", fd, mode, nbytes) < 0) {
1217db96d56Sopenharmony_ci        return NULL;
1227db96d56Sopenharmony_ci    }
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
1257db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
1267db96d56Sopenharmony_ci    err = _locking(fd, mode, nbytes);
1277db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
1287db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
1297db96d56Sopenharmony_ci    if (err != 0)
1307db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci    Py_RETURN_NONE;
1337db96d56Sopenharmony_ci}
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci/*[clinic input]
1367db96d56Sopenharmony_cimsvcrt.setmode -> long
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    fd: int
1397db96d56Sopenharmony_ci    mode as flags: int
1407db96d56Sopenharmony_ci    /
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ciSet the line-end translation mode for the file descriptor fd.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ciTo set it to text mode, flags should be os.O_TEXT; for binary, it
1457db96d56Sopenharmony_cishould be os.O_BINARY.
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciReturn value is the previous mode.
1487db96d56Sopenharmony_ci[clinic start generated code]*/
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_cistatic long
1517db96d56Sopenharmony_cimsvcrt_setmode_impl(PyObject *module, int fd, int flags)
1527db96d56Sopenharmony_ci/*[clinic end generated code: output=24a9be5ea07ccb9b input=76e7c01f6b137f75]*/
1537db96d56Sopenharmony_ci{
1547db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
1557db96d56Sopenharmony_ci    flags = _setmode(fd, flags);
1567db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
1577db96d56Sopenharmony_ci    if (flags == -1)
1587db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci    return flags;
1617db96d56Sopenharmony_ci}
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci/*[clinic input]
1647db96d56Sopenharmony_cimsvcrt.open_osfhandle -> long
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci    handle: HANDLE
1677db96d56Sopenharmony_ci    flags: int
1687db96d56Sopenharmony_ci    /
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciCreate a C runtime file descriptor from the file handle handle.
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ciThe flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,
1737db96d56Sopenharmony_ciand os.O_TEXT. The returned file descriptor may be used as a parameter
1747db96d56Sopenharmony_cito os.fdopen() to create a file object.
1757db96d56Sopenharmony_ci[clinic start generated code]*/
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_cistatic long
1787db96d56Sopenharmony_cimsvcrt_open_osfhandle_impl(PyObject *module, void *handle, int flags)
1797db96d56Sopenharmony_ci/*[clinic end generated code: output=b2fb97c4b515e4e6 input=d5db190a307cf4bb]*/
1807db96d56Sopenharmony_ci{
1817db96d56Sopenharmony_ci    if (PySys_Audit("msvcrt.open_osfhandle", "Ki", handle, flags) < 0) {
1827db96d56Sopenharmony_ci        return -1;
1837db96d56Sopenharmony_ci    }
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    return _Py_open_osfhandle(handle, flags);
1867db96d56Sopenharmony_ci}
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci/*[clinic input]
1897db96d56Sopenharmony_cimsvcrt.get_osfhandle -> HANDLE
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci    fd: int
1927db96d56Sopenharmony_ci    /
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ciReturn the file handle for the file descriptor fd.
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ciRaises OSError if fd is not recognized.
1977db96d56Sopenharmony_ci[clinic start generated code]*/
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_cistatic void *
2007db96d56Sopenharmony_cimsvcrt_get_osfhandle_impl(PyObject *module, int fd)
2017db96d56Sopenharmony_ci/*[clinic end generated code: output=aca01dfe24637374 input=5fcfde9b17136aa2]*/
2027db96d56Sopenharmony_ci{
2037db96d56Sopenharmony_ci    if (PySys_Audit("msvcrt.get_osfhandle", "(i)", fd) < 0) {
2047db96d56Sopenharmony_ci        return NULL;
2057db96d56Sopenharmony_ci    }
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci    return _Py_get_osfhandle(fd);
2087db96d56Sopenharmony_ci}
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci/* Console I/O */
2117db96d56Sopenharmony_ci/*[clinic input]
2127db96d56Sopenharmony_cimsvcrt.kbhit -> long
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ciReturn true if a keypress is waiting to be read.
2157db96d56Sopenharmony_ci[clinic start generated code]*/
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_cistatic long
2187db96d56Sopenharmony_cimsvcrt_kbhit_impl(PyObject *module)
2197db96d56Sopenharmony_ci/*[clinic end generated code: output=940dfce6587c1890 input=e70d678a5c2f6acc]*/
2207db96d56Sopenharmony_ci{
2217db96d56Sopenharmony_ci    return _kbhit();
2227db96d56Sopenharmony_ci}
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci/*[clinic input]
2257db96d56Sopenharmony_cimsvcrt.getch -> byte_char
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ciRead a keypress and return the resulting character as a byte string.
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ciNothing is echoed to the console. This call will block if a keypress is
2307db96d56Sopenharmony_cinot already available, but will not wait for Enter to be pressed. If the
2317db96d56Sopenharmony_cipressed key was a special function key, this will return '\000' or
2327db96d56Sopenharmony_ci'\xe0'; the next call will return the keycode. The Control-C keypress
2337db96d56Sopenharmony_cicannot be read with this function.
2347db96d56Sopenharmony_ci[clinic start generated code]*/
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_cistatic int
2377db96d56Sopenharmony_cimsvcrt_getch_impl(PyObject *module)
2387db96d56Sopenharmony_ci/*[clinic end generated code: output=a4e51f0565064a7d input=37a40cf0ed0d1153]*/
2397db96d56Sopenharmony_ci{
2407db96d56Sopenharmony_ci    int ch;
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
2437db96d56Sopenharmony_ci    ch = _getch();
2447db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
2457db96d56Sopenharmony_ci    return ch;
2467db96d56Sopenharmony_ci}
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci/*[clinic input]
2497db96d56Sopenharmony_cimsvcrt.getwch -> wchar_t
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ciWide char variant of getch(), returning a Unicode value.
2527db96d56Sopenharmony_ci[clinic start generated code]*/
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_cistatic wchar_t
2557db96d56Sopenharmony_cimsvcrt_getwch_impl(PyObject *module)
2567db96d56Sopenharmony_ci/*[clinic end generated code: output=be9937494e22f007 input=27b3dec8ad823d7c]*/
2577db96d56Sopenharmony_ci{
2587db96d56Sopenharmony_ci    wchar_t ch;
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
2617db96d56Sopenharmony_ci    ch = _getwch();
2627db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
2637db96d56Sopenharmony_ci    return ch;
2647db96d56Sopenharmony_ci}
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci/*[clinic input]
2677db96d56Sopenharmony_cimsvcrt.getche -> byte_char
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ciSimilar to getch(), but the keypress will be echoed if possible.
2707db96d56Sopenharmony_ci[clinic start generated code]*/
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_cistatic int
2737db96d56Sopenharmony_cimsvcrt_getche_impl(PyObject *module)
2747db96d56Sopenharmony_ci/*[clinic end generated code: output=d8f7db4fd2990401 input=43311ade9ed4a9c0]*/
2757db96d56Sopenharmony_ci{
2767db96d56Sopenharmony_ci    int ch;
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
2797db96d56Sopenharmony_ci    ch = _getche();
2807db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
2817db96d56Sopenharmony_ci    return ch;
2827db96d56Sopenharmony_ci}
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci/*[clinic input]
2857db96d56Sopenharmony_cimsvcrt.getwche -> wchar_t
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ciWide char variant of getche(), returning a Unicode value.
2887db96d56Sopenharmony_ci[clinic start generated code]*/
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_cistatic wchar_t
2917db96d56Sopenharmony_cimsvcrt_getwche_impl(PyObject *module)
2927db96d56Sopenharmony_ci/*[clinic end generated code: output=d0dae5ba3829d596 input=49337d59d1a591f8]*/
2937db96d56Sopenharmony_ci{
2947db96d56Sopenharmony_ci    wchar_t ch;
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
2977db96d56Sopenharmony_ci    ch = _getwche();
2987db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
2997db96d56Sopenharmony_ci    return ch;
3007db96d56Sopenharmony_ci}
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci/*[clinic input]
3037db96d56Sopenharmony_cimsvcrt.putch
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci    char: char
3067db96d56Sopenharmony_ci    /
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ciPrint the byte string char to the console without buffering.
3097db96d56Sopenharmony_ci[clinic start generated code]*/
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_cistatic PyObject *
3127db96d56Sopenharmony_cimsvcrt_putch_impl(PyObject *module, char char_value)
3137db96d56Sopenharmony_ci/*[clinic end generated code: output=92ec9b81012d8f60 input=ec078dd10cb054d6]*/
3147db96d56Sopenharmony_ci{
3157db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
3167db96d56Sopenharmony_ci    _putch(char_value);
3177db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
3187db96d56Sopenharmony_ci    Py_RETURN_NONE;
3197db96d56Sopenharmony_ci}
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci/*[clinic input]
3227db96d56Sopenharmony_cimsvcrt.putwch
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci    unicode_char: int(accept={str})
3257db96d56Sopenharmony_ci    /
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ciWide char variant of putch(), accepting a Unicode value.
3287db96d56Sopenharmony_ci[clinic start generated code]*/
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_cistatic PyObject *
3317db96d56Sopenharmony_cimsvcrt_putwch_impl(PyObject *module, int unicode_char)
3327db96d56Sopenharmony_ci/*[clinic end generated code: output=a3bd1a8951d28eee input=996ccd0bbcbac4c3]*/
3337db96d56Sopenharmony_ci{
3347db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
3357db96d56Sopenharmony_ci    _putwch(unicode_char);
3367db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
3377db96d56Sopenharmony_ci    Py_RETURN_NONE;
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci}
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci/*[clinic input]
3427db96d56Sopenharmony_cimsvcrt.ungetch
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci    char: char
3457db96d56Sopenharmony_ci    /
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ciOpposite of getch.
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ciCause the byte string char to be "pushed back" into the
3507db96d56Sopenharmony_ciconsole buffer; it will be the next character read by
3517db96d56Sopenharmony_cigetch() or getche().
3527db96d56Sopenharmony_ci[clinic start generated code]*/
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_cistatic PyObject *
3557db96d56Sopenharmony_cimsvcrt_ungetch_impl(PyObject *module, char char_value)
3567db96d56Sopenharmony_ci/*[clinic end generated code: output=c6942a0efa119000 input=22f07ee9001bbf0f]*/
3577db96d56Sopenharmony_ci{
3587db96d56Sopenharmony_ci    int res;
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
3617db96d56Sopenharmony_ci    res = _ungetch(char_value);
3627db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci    if (res == EOF)
3657db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
3667db96d56Sopenharmony_ci    Py_RETURN_NONE;
3677db96d56Sopenharmony_ci}
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci/*[clinic input]
3707db96d56Sopenharmony_cimsvcrt.ungetwch
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci    unicode_char: int(accept={str})
3737db96d56Sopenharmony_ci    /
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ciWide char variant of ungetch(), accepting a Unicode value.
3767db96d56Sopenharmony_ci[clinic start generated code]*/
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_cistatic PyObject *
3797db96d56Sopenharmony_cimsvcrt_ungetwch_impl(PyObject *module, int unicode_char)
3807db96d56Sopenharmony_ci/*[clinic end generated code: output=e63af05438b8ba3d input=83ec0492be04d564]*/
3817db96d56Sopenharmony_ci{
3827db96d56Sopenharmony_ci    int res;
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
3857db96d56Sopenharmony_ci    res = _ungetwch(unicode_char);
3867db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci    if (res == WEOF)
3897db96d56Sopenharmony_ci        return PyErr_SetFromErrno(PyExc_OSError);
3907db96d56Sopenharmony_ci    Py_RETURN_NONE;
3917db96d56Sopenharmony_ci}
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci#ifdef _DEBUG
3947db96d56Sopenharmony_ci/*[clinic input]
3957db96d56Sopenharmony_cimsvcrt.CrtSetReportFile -> HANDLE
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci    type: int
3987db96d56Sopenharmony_ci    file: HANDLE
3997db96d56Sopenharmony_ci    /
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ciWrapper around _CrtSetReportFile.
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ciOnly available on Debug builds.
4047db96d56Sopenharmony_ci[clinic start generated code]*/
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_cistatic void *
4077db96d56Sopenharmony_cimsvcrt_CrtSetReportFile_impl(PyObject *module, int type, void *file)
4087db96d56Sopenharmony_ci/*[clinic end generated code: output=9393e8c77088bbe9 input=290809b5f19e65b9]*/
4097db96d56Sopenharmony_ci{
4107db96d56Sopenharmony_ci    HANDLE res;
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
4137db96d56Sopenharmony_ci    res = _CrtSetReportFile(type, file);
4147db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci    return res;
4177db96d56Sopenharmony_ci}
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci/*[clinic input]
4207db96d56Sopenharmony_cimsvcrt.CrtSetReportMode -> long
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    type: int
4237db96d56Sopenharmony_ci    mode: int
4247db96d56Sopenharmony_ci    /
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ciWrapper around _CrtSetReportMode.
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ciOnly available on Debug builds.
4297db96d56Sopenharmony_ci[clinic start generated code]*/
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_cistatic long
4327db96d56Sopenharmony_cimsvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode)
4337db96d56Sopenharmony_ci/*[clinic end generated code: output=b2863761523de317 input=9319d29b4319426b]*/
4347db96d56Sopenharmony_ci{
4357db96d56Sopenharmony_ci    int res;
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
4387db96d56Sopenharmony_ci    res = _CrtSetReportMode(type, mode);
4397db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
4407db96d56Sopenharmony_ci    if (res == -1)
4417db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
4427db96d56Sopenharmony_ci    return res;
4437db96d56Sopenharmony_ci}
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci/*[clinic input]
4467db96d56Sopenharmony_cimsvcrt.set_error_mode -> long
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci    mode: int
4497db96d56Sopenharmony_ci    /
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ciWrapper around _set_error_mode.
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ciOnly available on Debug builds.
4547db96d56Sopenharmony_ci[clinic start generated code]*/
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_cistatic long
4577db96d56Sopenharmony_cimsvcrt_set_error_mode_impl(PyObject *module, int mode)
4587db96d56Sopenharmony_ci/*[clinic end generated code: output=ac4a09040d8ac4e3 input=046fca59c0f20872]*/
4597db96d56Sopenharmony_ci{
4607db96d56Sopenharmony_ci    long res;
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
4637db96d56Sopenharmony_ci    res = _set_error_mode(mode);
4647db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    return res;
4677db96d56Sopenharmony_ci}
4687db96d56Sopenharmony_ci#endif /* _DEBUG */
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci/*[clinic input]
4717db96d56Sopenharmony_cimsvcrt.GetErrorMode
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ciWrapper around GetErrorMode.
4747db96d56Sopenharmony_ci[clinic start generated code]*/
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_cistatic PyObject *
4777db96d56Sopenharmony_cimsvcrt_GetErrorMode_impl(PyObject *module)
4787db96d56Sopenharmony_ci/*[clinic end generated code: output=3103fc6145913591 input=5a7fb083b6dd71fd]*/
4797db96d56Sopenharmony_ci{
4807db96d56Sopenharmony_ci    unsigned int res;
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
4837db96d56Sopenharmony_ci    res = GetErrorMode();
4847db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong(res);
4877db96d56Sopenharmony_ci}
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci/*[clinic input]
4907db96d56Sopenharmony_cimsvcrt.SetErrorMode
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci    mode: unsigned_int(bitwise=True)
4937db96d56Sopenharmony_ci    /
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ciWrapper around SetErrorMode.
4967db96d56Sopenharmony_ci[clinic start generated code]*/
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_cistatic PyObject *
4997db96d56Sopenharmony_cimsvcrt_SetErrorMode_impl(PyObject *module, unsigned int mode)
5007db96d56Sopenharmony_ci/*[clinic end generated code: output=01d529293f00da8f input=d8b167258d32d907]*/
5017db96d56Sopenharmony_ci{
5027db96d56Sopenharmony_ci    unsigned int res;
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci    _Py_BEGIN_SUPPRESS_IPH
5057db96d56Sopenharmony_ci    res = SetErrorMode(mode);
5067db96d56Sopenharmony_ci    _Py_END_SUPPRESS_IPH
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong(res);
5097db96d56Sopenharmony_ci}
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci/*[clinic input]
5127db96d56Sopenharmony_ci[clinic start generated code]*/
5137db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci/* List of functions exported by this module */
5167db96d56Sopenharmony_cistatic struct PyMethodDef msvcrt_functions[] = {
5177db96d56Sopenharmony_ci    MSVCRT_HEAPMIN_METHODDEF
5187db96d56Sopenharmony_ci    MSVCRT_LOCKING_METHODDEF
5197db96d56Sopenharmony_ci    MSVCRT_SETMODE_METHODDEF
5207db96d56Sopenharmony_ci    MSVCRT_OPEN_OSFHANDLE_METHODDEF
5217db96d56Sopenharmony_ci    MSVCRT_GET_OSFHANDLE_METHODDEF
5227db96d56Sopenharmony_ci    MSVCRT_KBHIT_METHODDEF
5237db96d56Sopenharmony_ci    MSVCRT_GETCH_METHODDEF
5247db96d56Sopenharmony_ci    MSVCRT_GETCHE_METHODDEF
5257db96d56Sopenharmony_ci    MSVCRT_PUTCH_METHODDEF
5267db96d56Sopenharmony_ci    MSVCRT_UNGETCH_METHODDEF
5277db96d56Sopenharmony_ci    MSVCRT_GETERRORMODE_METHODDEF
5287db96d56Sopenharmony_ci    MSVCRT_SETERRORMODE_METHODDEF
5297db96d56Sopenharmony_ci    MSVCRT_CRTSETREPORTFILE_METHODDEF
5307db96d56Sopenharmony_ci    MSVCRT_CRTSETREPORTMODE_METHODDEF
5317db96d56Sopenharmony_ci    MSVCRT_SET_ERROR_MODE_METHODDEF
5327db96d56Sopenharmony_ci    MSVCRT_GETWCH_METHODDEF
5337db96d56Sopenharmony_ci    MSVCRT_GETWCHE_METHODDEF
5347db96d56Sopenharmony_ci    MSVCRT_PUTWCH_METHODDEF
5357db96d56Sopenharmony_ci    MSVCRT_UNGETWCH_METHODDEF
5367db96d56Sopenharmony_ci    {NULL,                      NULL}
5377db96d56Sopenharmony_ci};
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_cistatic struct PyModuleDef msvcrtmodule = {
5417db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
5427db96d56Sopenharmony_ci    "msvcrt",
5437db96d56Sopenharmony_ci    NULL,
5447db96d56Sopenharmony_ci    -1,
5457db96d56Sopenharmony_ci    msvcrt_functions,
5467db96d56Sopenharmony_ci    NULL,
5477db96d56Sopenharmony_ci    NULL,
5487db96d56Sopenharmony_ci    NULL,
5497db96d56Sopenharmony_ci    NULL
5507db96d56Sopenharmony_ci};
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_cistatic void
5537db96d56Sopenharmony_ciinsertint(PyObject *d, char *name, int value)
5547db96d56Sopenharmony_ci{
5557db96d56Sopenharmony_ci    PyObject *v = PyLong_FromLong((long) value);
5567db96d56Sopenharmony_ci    if (v == NULL) {
5577db96d56Sopenharmony_ci        /* Don't bother reporting this error */
5587db96d56Sopenharmony_ci        PyErr_Clear();
5597db96d56Sopenharmony_ci    }
5607db96d56Sopenharmony_ci    else {
5617db96d56Sopenharmony_ci        PyDict_SetItemString(d, name, v);
5627db96d56Sopenharmony_ci        Py_DECREF(v);
5637db96d56Sopenharmony_ci    }
5647db96d56Sopenharmony_ci}
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_cistatic void
5677db96d56Sopenharmony_ciinsertptr(PyObject *d, char *name, void *value)
5687db96d56Sopenharmony_ci{
5697db96d56Sopenharmony_ci    PyObject *v = PyLong_FromVoidPtr(value);
5707db96d56Sopenharmony_ci    if (v == NULL) {
5717db96d56Sopenharmony_ci        /* Don't bother reporting this error */
5727db96d56Sopenharmony_ci        PyErr_Clear();
5737db96d56Sopenharmony_ci    }
5747db96d56Sopenharmony_ci    else {
5757db96d56Sopenharmony_ci        PyDict_SetItemString(d, name, v);
5767db96d56Sopenharmony_ci        Py_DECREF(v);
5777db96d56Sopenharmony_ci    }
5787db96d56Sopenharmony_ci}
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ciPyMODINIT_FUNC
5817db96d56Sopenharmony_ciPyInit_msvcrt(void)
5827db96d56Sopenharmony_ci{
5837db96d56Sopenharmony_ci    int st;
5847db96d56Sopenharmony_ci    PyObject *d, *version;
5857db96d56Sopenharmony_ci    PyObject *m = PyModule_Create(&msvcrtmodule);
5867db96d56Sopenharmony_ci    if (m == NULL)
5877db96d56Sopenharmony_ci        return NULL;
5887db96d56Sopenharmony_ci    d = PyModule_GetDict(m);
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci    /* constants for the locking() function's mode argument */
5917db96d56Sopenharmony_ci    insertint(d, "LK_LOCK", _LK_LOCK);
5927db96d56Sopenharmony_ci    insertint(d, "LK_NBLCK", _LK_NBLCK);
5937db96d56Sopenharmony_ci    insertint(d, "LK_NBRLCK", _LK_NBRLCK);
5947db96d56Sopenharmony_ci    insertint(d, "LK_RLCK", _LK_RLCK);
5957db96d56Sopenharmony_ci    insertint(d, "LK_UNLCK", _LK_UNLCK);
5967db96d56Sopenharmony_ci    insertint(d, "SEM_FAILCRITICALERRORS", SEM_FAILCRITICALERRORS);
5977db96d56Sopenharmony_ci    insertint(d, "SEM_NOALIGNMENTFAULTEXCEPT", SEM_NOALIGNMENTFAULTEXCEPT);
5987db96d56Sopenharmony_ci    insertint(d, "SEM_NOGPFAULTERRORBOX", SEM_NOGPFAULTERRORBOX);
5997db96d56Sopenharmony_ci    insertint(d, "SEM_NOOPENFILEERRORBOX", SEM_NOOPENFILEERRORBOX);
6007db96d56Sopenharmony_ci#ifdef _DEBUG
6017db96d56Sopenharmony_ci    insertint(d, "CRT_WARN", _CRT_WARN);
6027db96d56Sopenharmony_ci    insertint(d, "CRT_ERROR", _CRT_ERROR);
6037db96d56Sopenharmony_ci    insertint(d, "CRT_ASSERT", _CRT_ASSERT);
6047db96d56Sopenharmony_ci    insertint(d, "CRTDBG_MODE_DEBUG", _CRTDBG_MODE_DEBUG);
6057db96d56Sopenharmony_ci    insertint(d, "CRTDBG_MODE_FILE", _CRTDBG_MODE_FILE);
6067db96d56Sopenharmony_ci    insertint(d, "CRTDBG_MODE_WNDW", _CRTDBG_MODE_WNDW);
6077db96d56Sopenharmony_ci    insertint(d, "CRTDBG_REPORT_MODE", _CRTDBG_REPORT_MODE);
6087db96d56Sopenharmony_ci    insertptr(d, "CRTDBG_FILE_STDERR", _CRTDBG_FILE_STDERR);
6097db96d56Sopenharmony_ci    insertptr(d, "CRTDBG_FILE_STDOUT", _CRTDBG_FILE_STDOUT);
6107db96d56Sopenharmony_ci    insertptr(d, "CRTDBG_REPORT_FILE", _CRTDBG_REPORT_FILE);
6117db96d56Sopenharmony_ci#endif
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci    /* constants for the crt versions */
6147db96d56Sopenharmony_ci#ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
6157db96d56Sopenharmony_ci    st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
6167db96d56Sopenharmony_ci                                    _VC_ASSEMBLY_PUBLICKEYTOKEN);
6177db96d56Sopenharmony_ci    if (st < 0) return NULL;
6187db96d56Sopenharmony_ci#endif
6197db96d56Sopenharmony_ci#ifdef _CRT_ASSEMBLY_VERSION
6207db96d56Sopenharmony_ci    st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
6217db96d56Sopenharmony_ci                                    _CRT_ASSEMBLY_VERSION);
6227db96d56Sopenharmony_ci    if (st < 0) return NULL;
6237db96d56Sopenharmony_ci#endif
6247db96d56Sopenharmony_ci#ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
6257db96d56Sopenharmony_ci    st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
6267db96d56Sopenharmony_ci                                    __LIBRARIES_ASSEMBLY_NAME_PREFIX);
6277db96d56Sopenharmony_ci    if (st < 0) return NULL;
6287db96d56Sopenharmony_ci#endif
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci    /* constants for the 2010 crt versions */
6317db96d56Sopenharmony_ci#if defined(_VC_CRT_MAJOR_VERSION) && defined (_VC_CRT_MINOR_VERSION) && defined(_VC_CRT_BUILD_VERSION) && defined(_VC_CRT_RBUILD_VERSION)
6327db96d56Sopenharmony_ci    version = PyUnicode_FromFormat("%d.%d.%d.%d", _VC_CRT_MAJOR_VERSION,
6337db96d56Sopenharmony_ci                                                  _VC_CRT_MINOR_VERSION,
6347db96d56Sopenharmony_ci                                                  _VC_CRT_BUILD_VERSION,
6357db96d56Sopenharmony_ci                                                  _VC_CRT_RBUILD_VERSION);
6367db96d56Sopenharmony_ci    st = PyModule_AddObject(m, "CRT_ASSEMBLY_VERSION", version);
6377db96d56Sopenharmony_ci    if (st < 0) return NULL;
6387db96d56Sopenharmony_ci#endif
6397db96d56Sopenharmony_ci    /* make compiler warning quiet if st is unused */
6407db96d56Sopenharmony_ci    (void)st;
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci    return m;
6437db96d56Sopenharmony_ci}
644