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>
25 // Force the malloc heap to clean itself up, and free unused blocks
26 // back to the OS. (According to the docs, only works on NT.)
28 msvcrt_heapmin(PyObject
*self
, PyObject
*args
)
30 if (!PyArg_ParseTuple(args
, ":heapmin"))
34 return PyErr_SetFromErrno(PyExc_IOError
);
40 // Perform locking operations on a C runtime file descriptor.
42 msvcrt_locking(PyObject
*self
, PyObject
*args
)
49 if (!PyArg_ParseTuple(args
, "iil:locking", &fd
, &mode
, &nbytes
))
52 Py_BEGIN_ALLOW_THREADS
53 err
= _locking(fd
, mode
, nbytes
);
56 return PyErr_SetFromErrno(PyExc_IOError
);
62 // Set the file translation mode for a C runtime file descriptor.
64 msvcrt_setmode(PyObject
*self
, PyObject
*args
)
68 if (!PyArg_ParseTuple(args
,"ii:setmode", &fd
, &flags
))
71 flags
= _setmode(fd
, flags
);
73 return PyErr_SetFromErrno(PyExc_IOError
);
75 return PyInt_FromLong(flags
);
78 // Convert an OS file handle to a C runtime file descriptor.
80 msvcrt_open_osfhandle(PyObject
*self
, PyObject
*args
)
86 if (!PyArg_ParseTuple(args
, "li:open_osfhandle", &handle
, &flags
))
89 fd
= _open_osfhandle(handle
, flags
);
91 return PyErr_SetFromErrno(PyExc_IOError
);
93 return PyInt_FromLong(fd
);
96 // Convert a C runtime file descriptor to an OS file handle.
98 msvcrt_get_osfhandle(PyObject
*self
, PyObject
*args
)
103 if (!PyArg_ParseTuple(args
,"i:get_osfhandle", &fd
))
106 handle
= _get_osfhandle(fd
);
108 return PyErr_SetFromErrno(PyExc_IOError
);
110 /* technically 'handle' is not a pointer, but a integer as
111 large as a pointer, Python's *VoidPtr interface is the
112 most appropriate here */
113 return PyLong_FromVoidPtr((void*)handle
);
119 msvcrt_kbhit(PyObject
*self
, PyObject
*args
)
123 if (!PyArg_ParseTuple(args
, ":kbhit"))
127 return PyInt_FromLong(ok
);
131 msvcrt_getch(PyObject
*self
, PyObject
*args
)
136 if (!PyArg_ParseTuple(args
, ":getch"))
139 Py_BEGIN_ALLOW_THREADS
143 return PyString_FromStringAndSize(s
, 1);
147 msvcrt_getwch(PyObject
*self
, PyObject
*args
)
152 if (!PyArg_ParseTuple(args
, ":getwch"))
155 Py_BEGIN_ALLOW_THREADS
159 return PyUnicode_FromUnicode(u
, 1);
163 msvcrt_getche(PyObject
*self
, PyObject
*args
)
168 if (!PyArg_ParseTuple(args
, ":getche"))
171 Py_BEGIN_ALLOW_THREADS
175 return PyString_FromStringAndSize(s
, 1);
179 msvcrt_getwche(PyObject
*self
, PyObject
*args
)
184 if (!PyArg_ParseTuple(args
, ":getwche"))
187 Py_BEGIN_ALLOW_THREADS
191 return PyUnicode_FromUnicode(s
, 1);
195 msvcrt_putch(PyObject
*self
, PyObject
*args
)
199 if (!PyArg_ParseTuple(args
, "c:putch", &ch
))
209 msvcrt_putwch(PyObject
*self
, PyObject
*args
)
214 if (!PyArg_ParseTuple(args
, "u#:putwch", &ch
, &size
))
218 PyErr_SetString(PyExc_ValueError
,
219 "Expected unicode string of length 1");
228 msvcrt_ungetch(PyObject
*self
, PyObject
*args
)
232 if (!PyArg_ParseTuple(args
, "c:ungetch", &ch
))
235 if (_ungetch(ch
) == EOF
)
236 return PyErr_SetFromErrno(PyExc_IOError
);
242 msvcrt_ungetwch(PyObject
*self
, PyObject
*args
)
246 if (!PyArg_ParseTuple(args
, "u:ungetwch", &ch
))
249 if (_ungetch(ch
) == EOF
)
250 return PyErr_SetFromErrno(PyExc_IOError
);
256 insertint(PyObject
*d
, char *name
, int value
)
258 PyObject
*v
= PyInt_FromLong((long) value
);
260 /* Don't bother reporting this error */
264 PyDict_SetItemString(d
, name
, v
);
270 /* List of functions exported by this module */
271 static struct PyMethodDef msvcrt_functions
[] = {
272 {"heapmin", msvcrt_heapmin
, METH_VARARGS
},
273 {"locking", msvcrt_locking
, METH_VARARGS
},
274 {"setmode", msvcrt_setmode
, METH_VARARGS
},
275 {"open_osfhandle", msvcrt_open_osfhandle
, METH_VARARGS
},
276 {"get_osfhandle", msvcrt_get_osfhandle
, METH_VARARGS
},
277 {"kbhit", msvcrt_kbhit
, METH_VARARGS
},
278 {"getch", msvcrt_getch
, METH_VARARGS
},
279 {"getche", msvcrt_getche
, METH_VARARGS
},
280 {"putch", msvcrt_putch
, METH_VARARGS
},
281 {"ungetch", msvcrt_ungetch
, METH_VARARGS
},
282 {"getwch", msvcrt_getwch
, METH_VARARGS
},
283 {"getwche", msvcrt_getwche
, METH_VARARGS
},
284 {"putwch", msvcrt_putwch
, METH_VARARGS
},
285 {"ungetwch", msvcrt_ungetwch
, METH_VARARGS
},
294 PyObject
*m
= Py_InitModule("msvcrt", msvcrt_functions
);
297 d
= PyModule_GetDict(m
);
299 /* constants for the locking() function's mode argument */
300 insertint(d
, "LK_LOCK", _LK_LOCK
);
301 insertint(d
, "LK_NBLCK", _LK_NBLCK
);
302 insertint(d
, "LK_NBRLCK", _LK_NBRLCK
);
303 insertint(d
, "LK_RLCK", _LK_RLCK
);
304 insertint(d
, "LK_UNLCK", _LK_UNLCK
);