remove wrong markup
[python.git] / PC / msvcrtmodule.c
blob6e804e454f7dfcf3a58a4bb22a00eba72bdd2209
1 /*********************************************************
3 msvcrtmodule.c
5 A Python interface to the Microsoft Visual C Runtime
6 Library, providing access to those non-portable, but
7 still useful routines.
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 ***********************************************************/
19 #include "Python.h"
20 #include "malloc.h"
21 #include <io.h>
22 #include <conio.h>
23 #include <sys/locking.h>
25 #ifdef _MSC_VER
26 #if _MSC_VER >= 1500
27 #include <crtassem.h>
28 #endif
29 #endif
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.)
33 static PyObject *
34 msvcrt_heapmin(PyObject *self, PyObject *args)
36 if (!PyArg_ParseTuple(args, ":heapmin"))
37 return NULL;
39 if (_heapmin() != 0)
40 return PyErr_SetFromErrno(PyExc_IOError);
42 Py_INCREF(Py_None);
43 return Py_None;
46 PyDoc_STRVAR(heapmin_doc,
47 "heapmin() -> None\n\
48 \n\
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.
53 static PyObject *
54 msvcrt_locking(PyObject *self, PyObject *args)
56 int fd;
57 int mode;
58 long nbytes;
59 int err;
61 if (!PyArg_ParseTuple(args, "iil:locking", &fd, &mode, &nbytes))
62 return NULL;
64 Py_BEGIN_ALLOW_THREADS
65 err = _locking(fd, mode, nbytes);
66 Py_END_ALLOW_THREADS
67 if (err != 0)
68 return PyErr_SetFromErrno(PyExc_IOError);
70 Py_INCREF(Py_None);
71 return Py_None;
74 PyDoc_STRVAR(locking_doc,
75 "locking(fd, mode, nbytes) -> None\n\
76 \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\
83 individually.");
85 // Set the file translation mode for a C runtime file descriptor.
86 static PyObject *
87 msvcrt_setmode(PyObject *self, PyObject *args)
89 int fd;
90 int flags;
91 if (!PyArg_ParseTuple(args,"ii:setmode", &fd, &flags))
92 return NULL;
94 flags = _setmode(fd, flags);
95 if (flags == -1)
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\
106 os.O_BINARY.");
108 // Convert an OS file handle to a C runtime file descriptor.
109 static PyObject *
110 msvcrt_open_osfhandle(PyObject *self, PyObject *args)
112 long handle;
113 int flags;
114 int fd;
116 if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags))
117 return NULL;
119 fd = _open_osfhandle(handle, flags);
120 if (fd == -1)
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.
135 static PyObject *
136 msvcrt_get_osfhandle(PyObject *self, PyObject *args)
138 int fd;
139 Py_intptr_t handle;
141 if (!PyArg_ParseTuple(args,"i:get_osfhandle", &fd))
142 return NULL;
144 handle = _get_osfhandle(fd);
145 if (handle == -1)
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.");
160 /* Console I/O */
162 static PyObject *
163 msvcrt_kbhit(PyObject *self, PyObject *args)
165 int ok;
167 if (!PyArg_ParseTuple(args, ":kbhit"))
168 return NULL;
170 ok = _kbhit();
171 return PyInt_FromLong(ok);
174 PyDoc_STRVAR(kbhit_doc,
175 "kbhit() -> bool\n\
177 Return true if a keypress is waiting to be read.");
179 static PyObject *
180 msvcrt_getch(PyObject *self, PyObject *args)
182 int ch;
183 char s[1];
185 if (!PyArg_ParseTuple(args, ":getch"))
186 return NULL;
188 Py_BEGIN_ALLOW_THREADS
189 ch = _getch();
190 Py_END_ALLOW_THREADS
191 s[0] = ch;
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\
203 this function.");
205 #ifdef _WCONIO_DEFINED
206 static PyObject *
207 msvcrt_getwch(PyObject *self, PyObject *args)
209 Py_UNICODE ch;
210 Py_UNICODE u[1];
212 if (!PyArg_ParseTuple(args, ":getwch"))
213 return NULL;
215 Py_BEGIN_ALLOW_THREADS
216 ch = _getwch();
217 Py_END_ALLOW_THREADS
218 u[0] = ch;
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.");
226 #endif
228 static PyObject *
229 msvcrt_getche(PyObject *self, PyObject *args)
231 int ch;
232 char s[1];
234 if (!PyArg_ParseTuple(args, ":getche"))
235 return NULL;
237 Py_BEGIN_ALLOW_THREADS
238 ch = _getche();
239 Py_END_ALLOW_THREADS
240 s[0] = ch;
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
251 static PyObject *
252 msvcrt_getwche(PyObject *self, PyObject *args)
254 Py_UNICODE ch;
255 Py_UNICODE s[1];
257 if (!PyArg_ParseTuple(args, ":getwche"))
258 return NULL;
260 Py_BEGIN_ALLOW_THREADS
261 ch = _getwche();
262 Py_END_ALLOW_THREADS
263 s[0] = ch;
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.");
271 #endif
273 static PyObject *
274 msvcrt_putch(PyObject *self, PyObject *args)
276 char ch;
278 if (!PyArg_ParseTuple(args, "c:putch", &ch))
279 return NULL;
281 _putch(ch);
282 Py_INCREF(Py_None);
283 return Py_None;
286 PyDoc_STRVAR(putch_doc,
287 "putch(char) -> None\n\
289 Print the character char to the console without buffering.");
291 #ifdef _WCONIO_DEFINED
292 static PyObject *
293 msvcrt_putwch(PyObject *self, PyObject *args)
295 Py_UNICODE *ch;
296 int size;
298 if (!PyArg_ParseTuple(args, "u#:putwch", &ch, &size))
299 return NULL;
301 if (size == 0) {
302 PyErr_SetString(PyExc_ValueError,
303 "Expected unicode string of length 1");
304 return NULL;
306 _putwch(*ch);
307 Py_RETURN_NONE;
311 PyDoc_STRVAR(putwch_doc,
312 "putwch(unicode_char) -> None\n\
314 Wide char variant of putch(), accepting a Unicode value.");
315 #endif
317 static PyObject *
318 msvcrt_ungetch(PyObject *self, PyObject *args)
320 char ch;
322 if (!PyArg_ParseTuple(args, "c:ungetch", &ch))
323 return NULL;
325 if (_ungetch(ch) == EOF)
326 return PyErr_SetFromErrno(PyExc_IOError);
327 Py_INCREF(Py_None);
328 return Py_None;
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
338 static PyObject *
339 msvcrt_ungetwch(PyObject *self, PyObject *args)
341 Py_UNICODE ch;
343 if (!PyArg_ParseTuple(args, "u:ungetwch", &ch))
344 return NULL;
346 if (_ungetch(ch) == EOF)
347 return PyErr_SetFromErrno(PyExc_IOError);
348 Py_INCREF(Py_None);
349 return Py_None;
352 PyDoc_STRVAR(ungetwch_doc,
353 "ungetwch(unicode_char) -> None\n\
355 Wide char variant of ungetch(), accepting a Unicode value.");
356 #endif
358 static void
359 insertint(PyObject *d, char *name, int value)
361 PyObject *v = PyInt_FromLong((long) value);
362 if (v == NULL) {
363 /* Don't bother reporting this error */
364 PyErr_Clear();
366 else {
367 PyDict_SetItemString(d, name, v);
368 Py_DECREF(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},
390 #endif
391 {NULL, NULL}
394 PyMODINIT_FUNC
395 initmsvcrt(void)
397 int st;
398 PyObject *d;
399 PyObject *m = Py_InitModule("msvcrt", msvcrt_functions);
400 if (m == NULL)
401 return;
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);
415 if (st < 0)return;
416 #endif
417 #ifdef _CRT_ASSEMBLY_VERSION
418 st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
419 _CRT_ASSEMBLY_VERSION);
420 if (st < 0)return;
421 #endif
422 #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
423 st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
424 __LIBRARIES_ASSEMBLY_NAME_PREFIX);
425 if (st < 0)return;
426 #endif