Home | History | Annotate | Download | only in Modules
      1 
      2 /* Functions used by cgen output */
      3 
      4 #include "Python.h"
      5 #include "cgensupport.h"
      6 
      7 
      8 /* Functions to extract arguments.
      9    These needs to know the total number of arguments supplied,
     10    since the argument list is a tuple only of there is more than
     11    one argument. */
     12 
     13 int
     14 PyArg_GetObject(register PyObject *args, int nargs, int i, PyObject **p_arg)
     15 {
     16     if (nargs != 1) {
     17         if (args == NULL || !PyTuple_Check(args) ||
     18                         nargs != PyTuple_Size(args) ||
     19                         i < 0 || i >= nargs) {
     20             return PyErr_BadArgument();
     21         }
     22         else {
     23             args = PyTuple_GetItem(args, i);
     24         }
     25     }
     26     if (args == NULL) {
     27         return PyErr_BadArgument();
     28     }
     29     *p_arg = args;
     30     return 1;
     31 }
     32 
     33 int
     34 PyArg_GetLong(register PyObject *args, int nargs, int i, long *p_arg)
     35 {
     36     if (nargs != 1) {
     37         if (args == NULL || !PyTuple_Check(args) ||
     38                         nargs != PyTuple_Size(args) ||
     39                         i < 0 || i >= nargs) {
     40             return PyErr_BadArgument();
     41         }
     42         args = PyTuple_GetItem(args, i);
     43     }
     44     if (args == NULL || !PyInt_Check(args)) {
     45         return PyErr_BadArgument();
     46     }
     47     *p_arg = PyInt_AsLong(args);
     48     return 1;
     49 }
     50 
     51 int
     52 PyArg_GetShort(register PyObject *args, int nargs, int i, short *p_arg)
     53 {
     54     long x;
     55     if (!PyArg_GetLong(args, nargs, i, &x))
     56         return 0;
     57     *p_arg = (short) x;
     58     return 1;
     59 }
     60 
     61 static int
     62 extractdouble(register PyObject *v, double *p_arg)
     63 {
     64     if (v == NULL) {
     65         /* Fall through to error return at end of function */
     66     }
     67     else if (PyFloat_Check(v)) {
     68         *p_arg = PyFloat_AS_DOUBLE((PyFloatObject *)v);
     69         return 1;
     70     }
     71     else if (PyInt_Check(v)) {
     72         *p_arg = PyInt_AS_LONG((PyIntObject *)v);
     73         return 1;
     74     }
     75     else if (PyLong_Check(v)) {
     76         *p_arg = PyLong_AsDouble(v);
     77         return 1;
     78     }
     79     return PyErr_BadArgument();
     80 }
     81 
     82 static int
     83 extractfloat(register PyObject *v, float *p_arg)
     84 {
     85     if (v == NULL) {
     86         /* Fall through to error return at end of function */
     87     }
     88     else if (PyFloat_Check(v)) {
     89         *p_arg = (float) PyFloat_AS_DOUBLE((PyFloatObject *)v);
     90         return 1;
     91     }
     92     else if (PyInt_Check(v)) {
     93         *p_arg = (float) PyInt_AS_LONG((PyIntObject *)v);
     94         return 1;
     95     }
     96     else if (PyLong_Check(v)) {
     97         *p_arg = (float) PyLong_AsDouble(v);
     98         return 1;
     99     }
    100     return PyErr_BadArgument();
    101 }
    102 
    103 int
    104 PyArg_GetFloat(register PyObject *args, int nargs, int i, float *p_arg)
    105 {
    106     PyObject *v;
    107     float x;
    108     if (!PyArg_GetObject(args, nargs, i, &v))
    109         return 0;
    110     if (!extractfloat(v, &x))
    111         return 0;
    112     *p_arg = x;
    113     return 1;
    114 }
    115 
    116 int
    117 PyArg_GetString(PyObject *args, int nargs, int i, string *p_arg)
    118 {
    119     PyObject *v;
    120     if (!PyArg_GetObject(args, nargs, i, &v))
    121         return 0;
    122     if (!PyString_Check(v)) {
    123         return PyErr_BadArgument();
    124     }
    125     *p_arg = PyString_AsString(v);
    126     return 1;
    127 }
    128 
    129 int
    130 PyArg_GetChar(PyObject *args, int nargs, int i, char *p_arg)
    131 {
    132     string x;
    133     if (!PyArg_GetString(args, nargs, i, &x))
    134         return 0;
    135     if (x[0] == '\0' || x[1] != '\0') {
    136         /* Not exactly one char */
    137         return PyErr_BadArgument();
    138     }
    139     *p_arg = x[0];
    140     return 1;
    141 }
    142 
    143 int
    144 PyArg_GetLongArraySize(PyObject *args, int nargs, int i, long *p_arg)
    145 {
    146     PyObject *v;
    147     if (!PyArg_GetObject(args, nargs, i, &v))
    148         return 0;
    149     if (PyTuple_Check(v)) {
    150         *p_arg = PyTuple_Size(v);
    151         return 1;
    152     }
    153     if (PyList_Check(v)) {
    154         *p_arg = PyList_Size(v);
    155         return 1;
    156     }
    157     return PyErr_BadArgument();
    158 }
    159 
    160 int
    161 PyArg_GetShortArraySize(PyObject *args, int nargs, int i, short *p_arg)
    162 {
    163     long x;
    164     if (!PyArg_GetLongArraySize(args, nargs, i, &x))
    165         return 0;
    166     *p_arg = (short) x;
    167     return 1;
    168 }
    169 
    170 /* XXX The following four are too similar.  Should share more code. */
    171 
    172 int
    173 PyArg_GetLongArray(PyObject *args, int nargs, int i, int n, long *p_arg)
    174 {
    175     PyObject *v, *w;
    176     if (!PyArg_GetObject(args, nargs, i, &v))
    177         return 0;
    178     if (PyTuple_Check(v)) {
    179         if (PyTuple_Size(v) != n) {
    180             return PyErr_BadArgument();
    181         }
    182         for (i = 0; i < n; i++) {
    183             w = PyTuple_GetItem(v, i);
    184             if (!PyInt_Check(w)) {
    185                 return PyErr_BadArgument();
    186             }
    187             p_arg[i] = PyInt_AsLong(w);
    188         }
    189         return 1;
    190     }
    191     else if (PyList_Check(v)) {
    192         if (PyList_Size(v) != n) {
    193             return PyErr_BadArgument();
    194         }
    195         for (i = 0; i < n; i++) {
    196             w = PyList_GetItem(v, i);
    197             if (!PyInt_Check(w)) {
    198                 return PyErr_BadArgument();
    199             }
    200             p_arg[i] = PyInt_AsLong(w);
    201         }
    202         return 1;
    203     }
    204     else {
    205         return PyErr_BadArgument();
    206     }
    207 }
    208 
    209 int
    210 PyArg_GetShortArray(PyObject *args, int nargs, int i, int n, short *p_arg)
    211 {
    212     PyObject *v, *w;
    213     if (!PyArg_GetObject(args, nargs, i, &v))
    214         return 0;
    215     if (PyTuple_Check(v)) {
    216         if (PyTuple_Size(v) != n) {
    217             return PyErr_BadArgument();
    218         }
    219         for (i = 0; i < n; i++) {
    220             w = PyTuple_GetItem(v, i);
    221             if (!PyInt_Check(w)) {
    222                 return PyErr_BadArgument();
    223             }
    224             p_arg[i] = (short) PyInt_AsLong(w);
    225         }
    226         return 1;
    227     }
    228     else if (PyList_Check(v)) {
    229         if (PyList_Size(v) != n) {
    230             return PyErr_BadArgument();
    231         }
    232         for (i = 0; i < n; i++) {
    233             w = PyList_GetItem(v, i);
    234             if (!PyInt_Check(w)) {
    235                 return PyErr_BadArgument();
    236             }
    237             p_arg[i] = (short) PyInt_AsLong(w);
    238         }
    239         return 1;
    240     }
    241     else {
    242         return PyErr_BadArgument();
    243     }
    244 }
    245 
    246 int
    247 PyArg_GetDoubleArray(PyObject *args, int nargs, int i, int n, double *p_arg)
    248 {
    249     PyObject *v, *w;
    250     if (!PyArg_GetObject(args, nargs, i, &v))
    251         return 0;
    252     if (PyTuple_Check(v)) {
    253         if (PyTuple_Size(v) != n) {
    254             return PyErr_BadArgument();
    255         }
    256         for (i = 0; i < n; i++) {
    257             w = PyTuple_GetItem(v, i);
    258             if (!extractdouble(w, &p_arg[i]))
    259                 return 0;
    260         }
    261         return 1;
    262     }
    263     else if (PyList_Check(v)) {
    264         if (PyList_Size(v) != n) {
    265             return PyErr_BadArgument();
    266         }
    267         for (i = 0; i < n; i++) {
    268             w = PyList_GetItem(v, i);
    269             if (!extractdouble(w, &p_arg[i]))
    270                 return 0;
    271         }
    272         return 1;
    273     }
    274     else {
    275         return PyErr_BadArgument();
    276     }
    277 }
    278 
    279 int
    280 PyArg_GetFloatArray(PyObject *args, int nargs, int i, int n, float *p_arg)
    281 {
    282     PyObject *v, *w;
    283     if (!PyArg_GetObject(args, nargs, i, &v))
    284         return 0;
    285     if (PyTuple_Check(v)) {
    286         if (PyTuple_Size(v) != n) {
    287             return PyErr_BadArgument();
    288         }
    289         for (i = 0; i < n; i++) {
    290             w = PyTuple_GetItem(v, i);
    291             if (!extractfloat(w, &p_arg[i]))
    292                 return 0;
    293         }
    294         return 1;
    295     }
    296     else if (PyList_Check(v)) {
    297         if (PyList_Size(v) != n) {
    298             return PyErr_BadArgument();
    299         }
    300         for (i = 0; i < n; i++) {
    301             w = PyList_GetItem(v, i);
    302             if (!extractfloat(w, &p_arg[i]))
    303                 return 0;
    304         }
    305         return 1;
    306     }
    307     else {
    308         return PyErr_BadArgument();
    309     }
    310 }
    311