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