1 /*********************************************************
5 A Python interface to the Microsoft Visual C Runtime
6 Library, providing access to those non-portable, but
9 Only ever compiled with an MS compiler, so no attempt
10 has been made to avoid MS language extensions, etc...
12 This may only work on NT or 95...
14 Author: Mark Hammond and Guido van Rossum.
15 Maintenance: Guido van Rossum.
17 ***********************************************************/
23 #include <sys/locking.h>
31 // Force the malloc heap to clean itself up, and free unused blocks
32 // back to the OS. (According to the docs, only works on NT.)
34 msvcrt_heapmin(PyObject
*self
, PyObject
*args
)
36 if (!PyArg_ParseTuple(args
, ":heapmin"))
40 return PyErr_SetFromErrno(PyExc_IOError
);
46 PyDoc_STRVAR(heapmin_doc
,
49 Force the malloc() heap to clean itself up and return unused blocks\n\
50 to the operating system. On failure, this raises IOError.");
52 // Perform locking operations on a C runtime file descriptor.
54 msvcrt_locking(PyObject
*self
, PyObject
*args
)
61 if (!PyArg_ParseTuple(args
, "iil:locking", &fd
, &mode
, &nbytes
))
64 Py_BEGIN_ALLOW_THREADS
65 err
= _locking(fd
, mode
, nbytes
);
68 return PyErr_SetFromErrno(PyExc_IOError
);
74 PyDoc_STRVAR(locking_doc
,
75 "locking(fd, mode, nbytes) -> None\n\
77 Lock part of a file based on file descriptor fd from the C runtime.\n\
78 Raises IOError on failure. The locked region of the file extends from\n\
79 the current file position for nbytes bytes, and may continue beyond\n\
80 the end of the file. mode must be one of the LK_* constants listed\n\
81 below. Multiple regions in a file may be locked at the same time, but\n\
82 may not overlap. Adjacent regions are not merged; they must be unlocked\n\
85 // Set the file translation mode for a C runtime file descriptor.
87 msvcrt_setmode(PyObject
*self
, PyObject
*args
)
91 if (!PyArg_ParseTuple(args
,"ii:setmode", &fd
, &flags
))
94 flags
= _setmode(fd
, flags
);
96 return PyErr_SetFromErrno(PyExc_IOError
);
98 return PyInt_FromLong(flags
);
101 PyDoc_STRVAR(setmode_doc
,
102 "setmode(fd, mode) -> Previous mode\n\
104 Set the line-end translation mode for the file descriptor fd. To set\n\
105 it to text mode, flags should be os.O_TEXT; for binary, it should be\n\
108 // Convert an OS file handle to a C runtime file descriptor.
110 msvcrt_open_osfhandle(PyObject
*self
, PyObject
*args
)
116 if (!PyArg_ParseTuple(args
, "li:open_osfhandle", &handle
, &flags
))
119 fd
= _open_osfhandle(handle
, flags
);
121 return PyErr_SetFromErrno(PyExc_IOError
);
123 return PyInt_FromLong(fd
);
126 PyDoc_STRVAR(open_osfhandle_doc
,
127 "open_osfhandle(handle, flags) -> file descriptor\n\
129 Create a C runtime file descriptor from the file handle handle. The\n\
130 flags parameter should be a bitwise OR of os.O_APPEND, os.O_RDONLY,\n\
131 and os.O_TEXT. The returned file descriptor may be used as a parameter\n\
132 to os.fdopen() to create a file object.");
134 // Convert a C runtime file descriptor to an OS file handle.
136 msvcrt_get_osfhandle(PyObject
*self
, PyObject
*args
)
141 if (!PyArg_ParseTuple(args
,"i:get_osfhandle", &fd
))
144 handle
= _get_osfhandle(fd
);
146 return PyErr_SetFromErrno(PyExc_IOError
);
148 /* technically 'handle' is not a pointer, but a integer as
149 large as a pointer, Python's *VoidPtr interface is the
150 most appropriate here */
151 return PyLong_FromVoidPtr((void*)handle
);
154 PyDoc_STRVAR(get_osfhandle_doc
,
155 "get_osfhandle(fd) -> file handle\n\
157 Return the file handle for the file descriptor fd. Raises IOError\n\
158 if fd is not recognized.");
163 msvcrt_kbhit(PyObject
*self
, PyObject
*args
)
167 if (!PyArg_ParseTuple(args
, ":kbhit"))
171 return PyInt_FromLong(ok
);
174 PyDoc_STRVAR(kbhit_doc
,
177 Return true if a keypress is waiting to be read.");
180 msvcrt_getch(PyObject
*self
, PyObject
*args
)
185 if (!PyArg_ParseTuple(args
, ":getch"))
188 Py_BEGIN_ALLOW_THREADS
192 return PyString_FromStringAndSize(s
, 1);
195 PyDoc_STRVAR(getch_doc
,
196 "getch() -> key character\n\
198 Read a keypress and return the resulting character. Nothing is echoed to\n\
199 the console. This call will block if a keypress is not already\n\
200 available, but will not wait for Enter to be pressed. If the pressed key\n\
201 was a special function key, this will return '\\000' or '\\xe0'; the next\n\
202 call will return the keycode. The Control-C keypress cannot be read with\n\
205 #ifdef _WCONIO_DEFINED
207 msvcrt_getwch(PyObject
*self
, PyObject
*args
)
212 if (!PyArg_ParseTuple(args
, ":getwch"))
215 Py_BEGIN_ALLOW_THREADS
219 return PyUnicode_FromUnicode(u
, 1);
222 PyDoc_STRVAR(getwch_doc
,
223 "getwch() -> Unicode key character\n\
225 Wide char variant of getch(), returning a Unicode value.");
229 msvcrt_getche(PyObject
*self
, PyObject
*args
)
234 if (!PyArg_ParseTuple(args
, ":getche"))
237 Py_BEGIN_ALLOW_THREADS
241 return PyString_FromStringAndSize(s
, 1);
244 PyDoc_STRVAR(getche_doc
,
245 "getche() -> key character\n\
247 Similar to getch(), but the keypress will be echoed if it represents\n\
248 a printable character.");
250 #ifdef _WCONIO_DEFINED
252 msvcrt_getwche(PyObject
*self
, PyObject
*args
)
257 if (!PyArg_ParseTuple(args
, ":getwche"))
260 Py_BEGIN_ALLOW_THREADS
264 return PyUnicode_FromUnicode(s
, 1);
267 PyDoc_STRVAR(getwche_doc
,
268 "getwche() -> Unicode key character\n\
270 Wide char variant of getche(), returning a Unicode value.");
274 msvcrt_putch(PyObject
*self
, PyObject
*args
)
278 if (!PyArg_ParseTuple(args
, "c:putch", &ch
))
286 PyDoc_STRVAR(putch_doc
,
287 "putch(char) -> None\n\
289 Print the character char to the console without buffering.");
291 #ifdef _WCONIO_DEFINED
293 msvcrt_putwch(PyObject
*self
, PyObject
*args
)
298 if (!PyArg_ParseTuple(args
, "u#:putwch", &ch
, &size
))
302 PyErr_SetString(PyExc_ValueError
,
303 "Expected unicode string of length 1");
311 PyDoc_STRVAR(putwch_doc
,
312 "putwch(unicode_char) -> None\n\
314 Wide char variant of putch(), accepting a Unicode value.");
318 msvcrt_ungetch(PyObject
*self
, PyObject
*args
)
322 if (!PyArg_ParseTuple(args
, "c:ungetch", &ch
))
325 if (_ungetch(ch
) == EOF
)
326 return PyErr_SetFromErrno(PyExc_IOError
);
331 PyDoc_STRVAR(ungetch_doc
,
332 "ungetch(char) -> None\n\
334 Cause the character char to be \"pushed back\" into the console buffer;\n\
335 it will be the next character read by getch() or getche().");
337 #ifdef _WCONIO_DEFINED
339 msvcrt_ungetwch(PyObject
*self
, PyObject
*args
)
343 if (!PyArg_ParseTuple(args
, "u:ungetwch", &ch
))
346 if (_ungetch(ch
) == EOF
)
347 return PyErr_SetFromErrno(PyExc_IOError
);
352 PyDoc_STRVAR(ungetwch_doc
,
353 "ungetwch(unicode_char) -> None\n\
355 Wide char variant of ungetch(), accepting a Unicode value.");
359 insertint(PyObject
*d
, char *name
, int value
)
361 PyObject
*v
= PyInt_FromLong((long) value
);
363 /* Don't bother reporting this error */
367 PyDict_SetItemString(d
, name
, v
);
373 /* List of functions exported by this module */
374 static struct PyMethodDef msvcrt_functions
[] = {
375 {"heapmin", msvcrt_heapmin
, METH_VARARGS
, heapmin_doc
},
376 {"locking", msvcrt_locking
, METH_VARARGS
, locking_doc
},
377 {"setmode", msvcrt_setmode
, METH_VARARGS
, setmode_doc
},
378 {"open_osfhandle", msvcrt_open_osfhandle
, METH_VARARGS
, open_osfhandle_doc
},
379 {"get_osfhandle", msvcrt_get_osfhandle
, METH_VARARGS
, get_osfhandle_doc
},
380 {"kbhit", msvcrt_kbhit
, METH_VARARGS
, kbhit_doc
},
381 {"getch", msvcrt_getch
, METH_VARARGS
, getch_doc
},
382 {"getche", msvcrt_getche
, METH_VARARGS
, getche_doc
},
383 {"putch", msvcrt_putch
, METH_VARARGS
, putch_doc
},
384 {"ungetch", msvcrt_ungetch
, METH_VARARGS
, ungetch_doc
},
385 #ifdef _WCONIO_DEFINED
386 {"getwch", msvcrt_getwch
, METH_VARARGS
, getwch_doc
},
387 {"getwche", msvcrt_getwche
, METH_VARARGS
, getwche_doc
},
388 {"putwch", msvcrt_putwch
, METH_VARARGS
, putwch_doc
},
389 {"ungetwch", msvcrt_ungetwch
, METH_VARARGS
, ungetwch_doc
},
399 PyObject
*m
= Py_InitModule("msvcrt", msvcrt_functions
);
402 d
= PyModule_GetDict(m
);
404 /* constants for the locking() function's mode argument */
405 insertint(d
, "LK_LOCK", _LK_LOCK
);
406 insertint(d
, "LK_NBLCK", _LK_NBLCK
);
407 insertint(d
, "LK_NBRLCK", _LK_NBRLCK
);
408 insertint(d
, "LK_RLCK", _LK_RLCK
);
409 insertint(d
, "LK_UNLCK", _LK_UNLCK
);
411 /* constants for the crt versions */
412 #ifdef _VC_ASSEMBLY_PUBLICKEYTOKEN
413 st
= PyModule_AddStringConstant(m
, "VC_ASSEMBLY_PUBLICKEYTOKEN",
414 _VC_ASSEMBLY_PUBLICKEYTOKEN
);
417 #ifdef _CRT_ASSEMBLY_VERSION
418 st
= PyModule_AddStringConstant(m
, "CRT_ASSEMBLY_VERSION",
419 _CRT_ASSEMBLY_VERSION
);
422 #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
423 st
= PyModule_AddStringConstant(m
, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
424 __LIBRARIES_ASSEMBLY_NAME_PREFIX
);