https://github.com/python/cpython/commit/29e81159644cf78d958e30aaef208e22a04a8b25
commit: 29e81159644cf78d958e30aaef208e22a04a8b25
branch: main
author: Bénédikt Tran <10796600+picn...@users.noreply.github.com>
committer: picnixz <10796600+picn...@users.noreply.github.com>
date: 2025-05-26T10:52:19+02:00
summary:

gh-134208: remove dead AC directives for `_curses.window.{chgat,getstr,instr}` 
(#134325)

files:
M Modules/_cursesmodule.c

diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 5e1eccee3e4a89..55d664cebe31ec 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -1429,32 +1429,27 @@ int py_mvwdelch(WINDOW *w, int y, int x)
 
 /* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
 #ifdef HAVE_CURSES_WCHGAT
-/*[-clinic input]
-_curses.window.chgat
 
-    [
-    y: int
-        Y-coordinate.
-    x: int
-        X-coordinate.
-    ]
-
-    n: int = -1
-        Number of characters.
-
-    attr: long
-        Attributes for characters.
-    /
-
-Set the attributes of characters.
+PyDoc_STRVAR(_curses_window_chgat__doc__,
+"chgat([y, x,] [n=-1,] attr)\n"
+"Set the attributes of characters.\n"
+"\n"
+"  y\n"
+"    Y-coordinate.\n"
+"  x\n"
+"    X-coordinate.\n"
+"  n\n"
+"    Number of characters.\n"
+"  attr\n"
+"    Attributes for characters.\n"
+"\n"
+"Set the attributes of num characters at the current cursor position, or at\n"
+"position (y, x) if supplied.  If no value of num is given or num = -1, the\n"
+"attribute will be set on all the characters to the end of the line.  This\n"
+"function does not move the cursor.  The changed line will be touched using\n"
+"the touchline() method so that the contents will be redisplayed by the next\n"
+"window refresh.");
 
-Set the attributes of num characters at the current cursor position, or at
-position (y, x) if supplied.  If no value of num is given or num = -1, the
-attribute will be set on all the characters to the end of the line.  This
-function does not move the cursor.  The changed line will be touched using
-the touchline() method so that the contents will be redisplayed by the next
-window refresh.
-[-clinic start generated code]*/
 static PyObject *
 PyCursesWindow_ChgAt(PyObject *op, PyObject *args)
 {
@@ -1481,19 +1476,20 @@ PyCursesWindow_ChgAt(PyObject *op, PyObject *args)
         attr = lattr;
         break;
     case 3:
-        if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
+        if (!PyArg_ParseTuple(args,"iil;y,x,attr", &y, &x, &lattr))
             return NULL;
         attr = lattr;
         use_xy = TRUE;
         break;
     case 4:
-        if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, 
&lattr))
+        if (!PyArg_ParseTuple(args,"iiil;y,x,n,attr", &y, &x, &num, &lattr))
             return NULL;
         attr = lattr;
         use_xy = TRUE;
         break;
     default:
-        PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
+        PyErr_SetString(PyExc_TypeError,
+                        "_curses.window.chgat requires 1 to 4 arguments");
         return NULL;
     }
 
@@ -1807,102 +1803,102 @@ _curses_window_get_wch_impl(PyCursesWindowObject 
*self, int group_right_1,
 }
 #endif
 
-/*[-clinic input]
-_curses.window.getstr
-
-    [
-    y: int
-        Y-coordinate.
-    x: int
-        X-coordinate.
-    ]
-    n: int = 2047
-        Maximal number of characters.
-    /
+/*
+ * Helper function for parsing parameters from getstr() and instr().
+ * This function is necessary because Argument Clinic does not know
+ * how to handle nested optional groups with default values inside.
+ *
+ * Return 1 on success and 0 on failure, similar to PyArg_ParseTuple().
+ */
+static int
+curses_clinic_parse_optional_xy_n(PyObject *args,
+                                  int *y, int *x, unsigned int *n, int *use_xy,
+                                  const char *qualname)
+{
+    switch (PyTuple_GET_SIZE(args)) {
+        case 0: {
+            *use_xy = 0;
+            return 1;
+        }
+        case 1: {
+            *use_xy = 0;
+            return PyArg_ParseTuple(args, "O&;n",
+                                    _PyLong_UnsignedInt_Converter, n);
+        }
+        case 2: {
+            *use_xy = 1;
+            return PyArg_ParseTuple(args, "ii;y,x", y, x);
+        }
+        case 3: {
+            *use_xy = 1;
+            return PyArg_ParseTuple(args, "iiO&;y,x,n", y, x,
+                                    _PyLong_UnsignedInt_Converter, n);
+        }
+        default: {
+            *use_xy = 0;
+            PyErr_Format(PyExc_TypeError, "%s requires 0 to 3 arguments",
+                         qualname);
+            return 0;
+        }
+    }
+}
 
-Read a string from the user, with primitive line editing capacity.
-[-clinic start generated code]*/
+PyDoc_STRVAR(_curses_window_getstr__doc__,
+"getstr([[y, x,] n=2047])\n"
+"Read a string from the user, with primitive line editing capacity.\n"
+"\n"
+"  y\n"
+"    Y-coordinate.\n"
+"  x\n"
+"    X-coordinate.\n"
+"  n\n"
+"    Maximal number of characters.");
 
 static PyObject *
-PyCursesWindow_GetStr(PyObject *op, PyObject *args)
+PyCursesWindow_getstr(PyObject *op, PyObject *args)
 {
     PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op);
+    int rtn, use_xy = 0, y = 0, x = 0;
+    unsigned int max_buf_size = 2048;
+    unsigned int n = max_buf_size - 1;
+    PyObject *res;
 
-    int x, y, n;
-    int rtn;
+    if (!curses_clinic_parse_optional_xy_n(args, &y, &x, &n, &use_xy,
+                                           "_curses.window.instr"))
+    {
+        return NULL;
+    }
 
-    /* could make the buffer size larger/dynamic */
-    Py_ssize_t max_buf_size = 2048;
-    PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size);
-    if (result == NULL)
+    n = Py_MIN(n, max_buf_size - 1);
+    res = PyBytes_FromStringAndSize(NULL, n + 1);
+    if (res == NULL) {
         return NULL;
-    char *buf = PyBytes_AS_STRING(result);
+    }
+    char *buf = PyBytes_AS_STRING(res);
 
-    switch (PyTuple_Size(args)) {
-    case 0:
-        Py_BEGIN_ALLOW_THREADS
-        rtn = wgetnstr(self->win, buf, max_buf_size - 1);
-        Py_END_ALLOW_THREADS
-        break;
-    case 1:
-        if (!PyArg_ParseTuple(args,"i;n", &n))
-            goto error;
-        if (n < 0) {
-            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
-            goto error;
-        }
-        Py_BEGIN_ALLOW_THREADS
-        rtn = wgetnstr(self->win, buf, Py_MIN(n, max_buf_size - 1));
-        Py_END_ALLOW_THREADS
-        break;
-    case 2:
-        if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
-            goto error;
+    if (use_xy) {
         Py_BEGIN_ALLOW_THREADS
 #ifdef STRICT_SYSV_CURSES
-        rtn = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 
max_buf_size - 1);
+        rtn = wmove(self->win, y, x) == ERR
+                ? ERR
+                : wgetnstr(self->win, buf, n);
 #else
-        rtn = mvwgetnstr(self->win,y,x,buf, max_buf_size - 1);
+        rtn = mvwgetnstr(self->win, y, x, buf, n);
 #endif
         Py_END_ALLOW_THREADS
-        break;
-    case 3:
-        if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
-            goto error;
-        if (n < 0) {
-            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
-            goto error;
-        }
-#ifdef STRICT_SYSV_CURSES
-        Py_BEGIN_ALLOW_THREADS
-        rtn = wmove(self->win,y,x)==ERR ? ERR :
-        wgetnstr(self->win, rtn, Py_MIN(n, max_buf_size - 1));
-        Py_END_ALLOW_THREADS
-#else
+    }
+    else {
         Py_BEGIN_ALLOW_THREADS
-        rtn = mvwgetnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1));
+        rtn = wgetnstr(self->win, buf, n);
         Py_END_ALLOW_THREADS
-#endif
-        break;
-    default:
-        PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
-        goto error;
     }
 
     if (rtn == ERR) {
-        Py_DECREF(result);
+        Py_DECREF(res);
         return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
     }
-
-    if (_PyBytes_Resize(&result, strlen(buf)) < 0) {
-        return NULL;
-    }
-
-    return result;
-
-error:
-    Py_DECREF(result);
-    return NULL;
+    _PyBytes_Resize(&res, strlen(buf));  // 'res' is set to NULL on failure
+    return res;
 }
 
 /*[clinic input]
@@ -2032,87 +2028,57 @@ _curses_window_inch_impl(PyCursesWindowObject *self, 
int group_right_1,
     return rtn;
 }
 
-/*[-clinic input]
-_curses.window.instr
-
-    [
-    y: int
-        Y-coordinate.
-    x: int
-        X-coordinate.
-    ]
-    n: int = 2047
-        Maximal number of characters.
-    /
-
-Return a string of characters, extracted from the window.
+PyDoc_STRVAR(_curses_window_instr__doc__,
+"instr([y, x,] n=2047)\n"
+"Return a string of characters, extracted from the window.\n"
+"\n"
+"  y\n"
+"    Y-coordinate.\n"
+"  x\n"
+"    X-coordinate.\n"
+"  n\n"
+"    Maximal number of characters.\n"
+"\n"
+"Return a string of characters, extracted from the window starting at the\n"
+"current cursor position, or at y, x if specified.  Attributes are stripped\n"
+"from the characters.  If n is specified, instr() returns a string at most\n"
+"n characters long (exclusive of the trailing NUL).");
 
-Return a string of characters, extracted from the window starting at the
-current cursor position, or at y, x if specified.  Attributes are stripped
-from the characters.  If n is specified, instr() returns a string at most
-n characters long (exclusive of the trailing NUL).
-[-clinic start generated code]*/
 static PyObject *
-PyCursesWindow_InStr(PyObject *op, PyObject *args)
+PyCursesWindow_instr(PyObject *op, PyObject *args)
 {
     PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op);
+    int rtn, use_xy = 0, y = 0, x = 0;
+    unsigned int max_buf_size = 2048;
+    unsigned int n = max_buf_size - 1;
+    PyObject *res;
 
-    int x, y, n;
-    int rtn;
+    if (!curses_clinic_parse_optional_xy_n(args, &y, &x, &n, &use_xy,
+                                           "_curses.window.instr"))
+    {
+        return NULL;
+    }
 
-    /* could make the buffer size larger/dynamic */
-    Py_ssize_t max_buf_size = 2048;
-    PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size);
-    if (result == NULL)
+    n = Py_MIN(n, max_buf_size - 1);
+    res = PyBytes_FromStringAndSize(NULL, n + 1);
+    if (res == NULL) {
         return NULL;
-    char *buf = PyBytes_AS_STRING(result);
+    }
+    char *buf = PyBytes_AS_STRING(res);
 
-    switch (PyTuple_Size(args)) {
-    case 0:
-        rtn = winnstr(self->win, buf, max_buf_size - 1);
-        break;
-    case 1:
-        if (!PyArg_ParseTuple(args,"i;n", &n))
-            goto error;
-        if (n < 0) {
-            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
-            goto error;
-        }
-        rtn = winnstr(self->win, buf, Py_MIN(n, max_buf_size - 1));
-        break;
-    case 2:
-        if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
-            goto error;
-        rtn = mvwinnstr(self->win, y, x, buf, max_buf_size - 1);
-        break;
-    case 3:
-        if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
-            goto error;
-        if (n < 0) {
-            PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
-            goto error;
-        }
-        rtn = mvwinnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1));
-        break;
-    default:
-        PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
-        goto error;
+    if (use_xy) {
+        rtn = mvwinnstr(self->win, y, x, buf, n);
+    }
+    else {
+        rtn = winnstr(self->win, buf, n);
     }
 
     if (rtn == ERR) {
-        Py_DECREF(result);
+        Py_DECREF(res);
         return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
     }
-
-    if (_PyBytes_Resize(&result, strlen(buf)) < 0) {
-        return NULL;
-    }
-
-    return result;
-
-error:
-    Py_DECREF(result);
-    return NULL;
+    _PyBytes_Resize(&res, strlen(buf));  // 'res' is set to NULL on failure
+    return res;
 }
 
 /*[clinic input]
@@ -2854,7 +2820,10 @@ static PyMethodDef PyCursesWindow_methods[] = {
     _CURSES_WINDOW_ATTRSET_METHODDEF
     _CURSES_WINDOW_BKGD_METHODDEF
 #ifdef HAVE_CURSES_WCHGAT
-    {"chgat",           PyCursesWindow_ChgAt, METH_VARARGS},
+    {
+        "chgat", PyCursesWindow_ChgAt, METH_VARARGS,
+        _curses_window_chgat__doc__
+    },
 #endif
     _CURSES_WINDOW_BKGDSET_METHODDEF
     _CURSES_WINDOW_BORDER_METHODDEF
@@ -2877,7 +2846,10 @@ static PyMethodDef PyCursesWindow_methods[] = {
     _CURSES_WINDOW_GET_WCH_METHODDEF
     {"getmaxyx",        PyCursesWindow_getmaxyx, METH_NOARGS},
     {"getparyx",        PyCursesWindow_getparyx, METH_NOARGS},
-    {"getstr",          PyCursesWindow_GetStr, METH_VARARGS},
+    {
+        "getstr", PyCursesWindow_getstr, METH_VARARGS,
+        _curses_window_getstr__doc__
+    },
     {"getyx",           PyCursesWindow_getyx, METH_NOARGS},
     _CURSES_WINDOW_HLINE_METHODDEF
     {"idcok",           PyCursesWindow_idcok, METH_VARARGS},
@@ -2891,7 +2863,10 @@ static PyMethodDef PyCursesWindow_methods[] = {
     {"insertln",        PyCursesWindow_winsertln, METH_NOARGS},
     _CURSES_WINDOW_INSNSTR_METHODDEF
     _CURSES_WINDOW_INSSTR_METHODDEF
-    {"instr",           PyCursesWindow_InStr, METH_VARARGS},
+    {
+        "instr", PyCursesWindow_instr, METH_VARARGS,
+        _curses_window_instr__doc__
+    },
     _CURSES_WINDOW_IS_LINETOUCHED_METHODDEF
     {"is_wintouched",   PyCursesWindow_is_wintouched, METH_NOARGS},
     {"keypad",          PyCursesWindow_keypad, METH_VARARGS},

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: arch...@mail-archive.com

Reply via email to