ccMake test_curses pass.

Can't guarantee I caught every spot.
This commit is contained in:
Guido van Rossum 2007-07-24 00:16:38 +00:00
parent 51a883bf87
commit 6c95da384e
1 changed files with 73 additions and 34 deletions

View File

@ -201,6 +201,8 @@ PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
} else if(PyString_Check(obj)
&& (PyString_Size(obj) == 1)) {
*ch = (chtype) *PyString_AsString(obj);
} else if (PyUnicode_Check(obj) && PyUnicode_GetSize(obj) == 1) {
*ch = (chtype) *PyUnicode_AS_UNICODE(obj);
} else {
return 0;
}
@ -1281,19 +1283,43 @@ PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
}
static PyObject *
PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
{
PyObject *temp;
if (!PyArg_ParseTuple(args, "O;fileobj", &temp))
return NULL;
PyErr_SetString(PyExc_TypeError, "argument must be a file object");
return NULL;
/* We have to simulate this by writing to a temporary FILE*,
then reading back, then writing to the argument stream. */
char fn[100];
int fd;
FILE *fp;
PyObject *res;
#if 0
return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
"putwin");
#endif
strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
fd = mkstemp(fn);
if (fd < 0)
return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
fp = fdopen(fd, "wb+");
if (fp == NULL) {
close(fd);
return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
}
res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
if (res == NULL) {
fclose(fp);
return res;
}
fseek(fp, 0, 0);
while (1) {
char buf[BUFSIZ];
int n = fread(buf, 1, BUFSIZ, fp);
if (n <= 0)
break;
Py_DECREF(res);
res = PyObject_CallMethod(stream, "write", "y#", buf, n);
if (res == NULL)
break;
}
fclose(fp);
remove(fn);
return res;
}
static PyObject *
@ -1533,7 +1559,7 @@ static PyMethodDef PyCursesWindow_Methods[] = {
{"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
{"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
METH_VARARGS},
{"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS},
{"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
{"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
{"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
{"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
@ -1742,27 +1768,48 @@ PyCurses_UngetMouse(PyObject *self, PyObject *args)
#endif
static PyObject *
PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp)
PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
{
#if 0
char fn[100];
int fd;
FILE *fp;
PyObject *data;
WINDOW *win;
#endif
PyCursesInitialised
PyErr_SetString(PyExc_TypeError, "argument must be a file object");
return NULL;
#if 0
win = getwin(PyFile_AsFile(temp));
strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
fd = mkstemp(fn);
if (fd < 0)
return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
fp = fdopen(fd, "wb+");
if (fp == NULL) {
close(fd);
return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
}
data = PyObject_CallMethod(stream, "read", "");
if (data == NULL) {
fclose(fp);
return NULL;
}
if (!PyBytes_Check(data)) {
PyErr_Format(PyExc_TypeError,
"f.read() returned %.100s instead of bytes",
data->ob_type->tp_name);
Py_DECREF(data);
fclose(fp);
return NULL;
}
fwrite(PyBytes_AS_STRING(data), 1, PyBytes_GET_SIZE(data), fp);
Py_DECREF(data);
fseek(fp, 0, 0);
win = getwin(fp);
fclose(fp);
if (win == NULL) {
PyErr_SetString(PyCursesError, catchall_NULL);
return NULL;
}
return PyCursesWindow_New(win);
#endif
}
static PyObject *
@ -2480,11 +2527,7 @@ PyCurses_UnCtrl(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
if (PyInt_CheckExact(temp))
ch = (chtype) PyInt_AsLong(temp);
else if (PyString_Check(temp))
ch = (chtype) *PyString_AsString(temp);
else {
if (!PyCurses_ConvertToChtype(temp, &ch)) {
PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
return NULL;
}
@ -2496,17 +2539,13 @@ static PyObject *
PyCurses_UngetCh(PyObject *self, PyObject *args)
{
PyObject *temp;
int ch;
chtype ch;
PyCursesInitialised
if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
if (PyInt_CheckExact(temp))
ch = (int) PyInt_AsLong(temp);
else if (PyString_Check(temp))
ch = (int) *PyString_AsString(temp);
else {
if (!PyCurses_ConvertToChtype(temp, &ch)) {
PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
return NULL;
}