ยปCore Development>Code coverage>RISCOS/Modules/swimodule.c

Python code coverage for RISCOS/Modules/swimodule.c

#countcontent
1n/a/* swi
2n/a
3n/a RISC OS swi functions
4n/a
5n/a 1.00 Chris Stretch
6n/a
7n/a
8n/a 1.01 12 May 1999 Laurence Tratt
9n/a
10n/a * Changed swi.error to be a class based exception rather than string based
11n/a * Added swi.ArgError which is generated for errors when the user passes invalid arguments to
12n/a functions etc
13n/a * Added "errnum" attribute to swi.error, so one can now check to see what the error number was
14n/a
15n/a 1.02 03 March 2002 Dietmar Schwertberger
16n/a * Added string, integer, integers, tuple and tuples
17n/a*/
18n/a
19n/a#include "oslib/os.h"
20n/a#include <kernel.h>
21n/a#include "Python.h"
22n/a
23n/a
24n/a#define PyBlock_Check(op) ((op)->ob_type == &PyBlockType)
25n/a
26n/a
27n/astatic PyObject *SwiError; /* Exception swi.error */
28n/astatic PyObject *ArgError; /* Exception swi.ArgError */
29n/astatic os_error *e;
30n/a
31n/astatic PyObject *swi_oserror(void)
32n/a{ PyErr_SetString(SwiError,e->errmess);
33n/a PyObject_SetAttrString(PyErr_Occurred(), "errnum", PyInt_FromLong(e->errnum));
34n/a return 0;
35n/a}
36n/a
37n/astatic PyObject *swi_error(char *s)
38n/a{ PyErr_SetString(ArgError,s);
39n/a return 0;
40n/a}
41n/a
42n/atypedef struct
43n/a{ PyObject_HEAD
44n/a void *block;
45n/a int length; /*length in bytes*/
46n/a int heap;
47n/a} PyBlockObject;
48n/a
49n/astatic PyTypeObject PyBlockType;
50n/a
51n/a/* block commands */
52n/a
53n/astatic PyObject *PyBlock_New(PyObject *self,PyObject *args)
54n/a{ int size;
55n/a PyBlockObject *b;
56n/a PyObject *init=0;
57n/a if(!PyArg_ParseTuple(args,"i|O",&size,&init)) return NULL;
58n/a if(size<1) size=1;
59n/a b=PyObject_NEW(PyBlockObject,&PyBlockType);
60n/a if(!b) return NULL;
61n/a b->block=malloc(4*size);
62n/a if(!b->block)
63n/a { Py_DECREF(b);
64n/a return PyErr_NoMemory();
65n/a }
66n/a b->length=4*size;
67n/a b->heap=1;
68n/a if(init)
69n/a { if(PyString_Check(init))
70n/a { int n=PyString_Size(init);
71n/a if (n>4*size) n=4*size;
72n/a memcpy(b->block,PyString_AsString(init),n);
73n/a memset((char*)b->block+n,0,4*size-n);
74n/a }
75n/a else
76n/a { int n,k;
77n/a long *p=(long*)b->block;
78n/a if(!PyList_Check(init)) goto fail;
79n/a n=PyList_Size(init);
80n/a if (n>size) n=size;
81n/a for(k=0;k<n;k++)
82n/a { PyObject *q=PyList_GetItem(init,k);
83n/a if(!PyInt_Check(q)) goto fail;
84n/a p[k]=PyInt_AsLong(q);
85n/a }
86n/a for(;k<size;k++) p[k]=0;
87n/a }
88n/a }
89n/a return (PyObject *)b;
90n/a fail:PyErr_SetString(PyExc_TypeError,
91n/a "block initialiser must be string or list of integers");
92n/a Py_DECREF(b);
93n/a return NULL;
94n/a}
95n/a
96n/astatic PyObject *PyRegister(PyObject *self,PyObject *args)
97n/a{ int size,ptr;
98n/a PyBlockObject *b;
99n/a if(!PyArg_ParseTuple(args,"ii",&size,&ptr)) return NULL;
100n/a if(size<1) size=1;
101n/a b=PyObject_NEW(PyBlockObject,&PyBlockType);
102n/a if(!b) return NULL;
103n/a b->block=(void*)ptr;
104n/a b->length=4*size;
105n/a b->heap=0;
106n/a return (PyObject *)b;
107n/a}
108n/a
109n/astatic PyObject *PyBlock_ToString(PyBlockObject *self,PyObject *arg)
110n/a{ int s=0,e=self->length;
111n/a if(!PyArg_ParseTuple(arg,"|ii",&s,&e)) return NULL;
112n/a if(s<0||e>self->length||s>e)
113n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
114n/a return NULL;
115n/a }
116n/a return PyString_FromStringAndSize((char*)self->block+s,e-s);
117n/a}
118n/a
119n/astatic PyObject *PyBlock_NullString(PyBlockObject *self,PyObject *arg)
120n/a{ int s=0,e=self->length,i;
121n/a char *p=(char*)self->block;
122n/a if(!PyArg_ParseTuple(arg,"|ii",&s,&e)) return NULL;
123n/a if(s<0||e>self->length||s>e)
124n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
125n/a return NULL;
126n/a }
127n/a for(i=s;i<e;i++) if(p[i]==0) break;
128n/a return PyString_FromStringAndSize((char*)self->block+s,i-s);
129n/a}
130n/a
131n/astatic PyObject *PyBlock_CtrlString(PyBlockObject *self,PyObject *arg)
132n/a{ int s=0,e=self->length,i;
133n/a char *p=(char*)self->block;
134n/a if(!PyArg_ParseTuple(arg,"|ii",&s,&e)) return NULL;
135n/a if(s<0||e>self->length||s>e)
136n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
137n/a return NULL;
138n/a }
139n/a for(i=s;i<e;i++) if(p[i]<32) break;
140n/a return PyString_FromStringAndSize((char*)self->block+s,i-s);
141n/a}
142n/a
143n/astatic PyObject *PyBlock_PadString(PyBlockObject *self,PyObject *arg)
144n/a{ int s=0,e=self->length,n,m;
145n/a char *str;
146n/a char c;
147n/a char *p=(char*)self->block;
148n/a if(!PyArg_ParseTuple(arg,"s#c|ii",&str,&n,&c,&s,&e)) return NULL;
149n/a if(s<0||e>self->length||s>e)
150n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
151n/a return NULL;
152n/a }
153n/a m=e-s;
154n/a if(n>m) n=m;
155n/a memcpy(p+s,str,n);memset(p+s+n,c,m-n);
156n/a Py_INCREF(Py_None);return Py_None;
157n/a}
158n/a
159n/astatic PyObject *PyBlock_BitSet(PyBlockObject *self,PyObject *arg)
160n/a{ int i,x,y;
161n/a int *p=(int*)self->block;
162n/a if(!PyArg_ParseTuple(arg,"iii",&i,&x,&y)) return NULL;
163n/a if(i<0||i>=self->length/4)
164n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
165n/a return NULL;
166n/a }
167n/a p[i]=(p[i]&y)^x;
168n/a Py_INCREF(Py_None);return Py_None;
169n/a}
170n/a
171n/astatic PyObject *PyBlock_Resize(PyBlockObject *self,PyObject *arg)
172n/a{ int n;
173n/a if(!PyArg_ParseTuple(arg,"i",&n)) return NULL;
174n/a if(n<1) n=1;
175n/a if(self->heap)
176n/a { void *v=realloc(self->block,4*n);
177n/a if (!v) return PyErr_NoMemory();
178n/a self->block=v;
179n/a }
180n/a self->length=4*n;
181n/a Py_INCREF(Py_None);return Py_None;
182n/a}
183n/a
184n/astatic PyObject *PyBlock_ToFile(PyBlockObject *self,PyObject *arg)
185n/a{ int s=0,e=self->length/4;
186n/a PyObject *f;
187n/a FILE *fp;
188n/a if(!PyArg_ParseTuple(arg,"O|ii",&f,&s,&e)) return NULL;
189n/a fp=PyFile_AsFile(f);
190n/a if (!fp)
191n/a { PyErr_SetString(PyExc_TypeError, "arg must be open file");
192n/a return NULL;
193n/a }
194n/a fwrite((int*)(self->block)+s,4,e-s,fp);
195n/a Py_INCREF(Py_None);return Py_None;
196n/a}
197n/a
198n/astatic struct PyMethodDef PyBlock_Methods[]=
199n/a{ { "tostring",(PyCFunction)PyBlock_ToString,1},
200n/a { "padstring",(PyCFunction)PyBlock_PadString,1},
201n/a { "nullstring",(PyCFunction)PyBlock_NullString,1},
202n/a { "ctrlstring",(PyCFunction)PyBlock_CtrlString,1},
203n/a { "bitset",(PyCFunction)PyBlock_BitSet,1},
204n/a { "resize",(PyCFunction)PyBlock_Resize,1},
205n/a { "tofile",(PyCFunction)PyBlock_ToFile,1},
206n/a { NULL,NULL} /* sentinel */
207n/a};
208n/a
209n/astatic int block_len(PyBlockObject *b)
210n/a{ return b->length/4;
211n/a}
212n/a
213n/astatic PyObject *block_concat(PyBlockObject *b,PyBlockObject *c)
214n/a{ PyErr_SetString(PyExc_IndexError,"block concatenation not implemented");
215n/a return NULL;
216n/a}
217n/a
218n/astatic PyObject *block_repeat(PyBlockObject *b,Py_ssize_t i)
219n/a{ PyErr_SetString(PyExc_IndexError,"block repetition not implemented");
220n/a return NULL;
221n/a}
222n/a
223n/astatic PyObject *block_item(PyBlockObject *b,Py_ssize_t i)
224n/a{ if(i<0||4*i>=b->length)
225n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
226n/a return NULL;
227n/a }
228n/a return PyInt_FromLong(((long*)(b->block))[i]);
229n/a}
230n/a
231n/astatic PyObject *block_slice(PyBlockObject *b,Py_ssize_t i,Py_ssize_t j)
232n/a{ Py_ssize_t n,k;
233n/a long *p=b->block;
234n/a PyObject *result;
235n/a if(j>b->length/4) j=b->length/4;
236n/a if(i<0||i>j)
237n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
238n/a return NULL;
239n/a }
240n/a n=j-i;
241n/a result=PyList_New(n);
242n/a for(k=0;k<n;k++) PyList_SetItem(result,k,PyInt_FromSsize_t(p[i+k]));
243n/a return result;
244n/a}
245n/a
246n/astatic int block_ass_item(PyBlockObject *b,Py_ssize_t i,PyObject *v)
247n/a{ if(i<0||i>=b->length/4)
248n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
249n/a return -1;
250n/a }
251n/a if(!PyInt_Check(v))
252n/a { PyErr_SetString(PyExc_TypeError,"block item must be integer");
253n/a return -1;
254n/a }
255n/a ((long*)(b->block))[i]=PyInt_AsLong(v);
256n/a return 0;
257n/a}
258n/a
259n/astatic int block_ass_slice(PyBlockObject *b,Py_ssize_t i,Py_ssize_t j,PyObject *v)
260n/a{ Py_ssize_t n,k;
261n/a long *p=b->block;
262n/a if(j>b->length/4) j=b->length/4;
263n/a if(i<0||i>j)
264n/a { PyErr_SetString(PyExc_IndexError,"block index out of range");
265n/a return -1;
266n/a }
267n/a if(!PyList_Check(v)) goto fail;
268n/a n=PyList_Size(v);
269n/a if(n>j-i) n=j-i;
270n/a for(k=0;k<n;k++)
271n/a { PyObject *q=PyList_GetItem(v,k);
272n/a if(!PyInt_Check(q)) goto fail;
273n/a p[i+k]=PyInt_AsLong(q);
274n/a }
275n/a for(;k<j-i;k++) p[i+k]=0;
276n/a return 0;
277n/a fail:PyErr_SetString(PyExc_TypeError,"block slice must be integer list");
278n/a return -1;
279n/a}
280n/a
281n/astatic PySequenceMethods block_as_sequence=
282n/a{ (inquiry)block_len, /*sq_length*/
283n/a (binaryfunc)block_concat, /*sq_concat*/
284n/a (ssizeargfunc)block_repeat, /*sq_repeat*/
285n/a (ssizeargfunc)block_item, /*sq_item*/
286n/a (ssizessizeargfunc)block_slice, /*sq_slice*/
287n/a (ssizeobjargproc)block_ass_item, /*sq_ass_item*/
288n/a (ssizessizeobjargproc)block_ass_slice, /*sq_ass_slice*/
289n/a};
290n/a
291n/astatic PyObject *PyBlock_GetAttr(PyBlockObject *s,char *name)
292n/a{
293n/a if (!strcmp(name, "length")) return PyInt_FromLong((long)s->length);
294n/a if (!strcmp(name, "start")) return PyInt_FromLong((long)s->block);
295n/a if (!strcmp(name,"end")) return PyInt_FromLong(((long)(s->block)+s->length));
296n/a if (!strcmp(name, "__members__"))
297n/a { PyObject *list = PyList_New(3);
298n/a if (list)
299n/a { PyList_SetItem(list, 0, PyString_FromString("length"));
300n/a PyList_SetItem(list, 1, PyString_FromString("start"));
301n/a PyList_SetItem(list, 2, PyString_FromString("end"));
302n/a if (PyErr_Occurred()) { Py_DECREF(list);list = NULL;}
303n/a }
304n/a return list;
305n/a }
306n/a return Py_FindMethod(PyBlock_Methods, (PyObject*) s,name);
307n/a}
308n/a
309n/astatic void PyBlock_Dealloc(PyBlockObject *b)
310n/a{
311n/a if(b->heap) {
312n/a if (b->heap)
313n/a ;
314n/a else
315n/a PyMem_DEL(b->block);
316n/a }
317n/a PyMem_DEL(b);
318n/a}
319n/a
320n/astatic PyTypeObject PyBlockType=
321n/a{ PyObject_HEAD_INIT(&PyType_Type)
322n/a 0, /*ob_size*/
323n/a "block", /*tp_name*/
324n/a sizeof(PyBlockObject), /*tp_size*/
325n/a 0, /*tp_itemsize*/
326n/a /* methods */
327n/a (destructor)PyBlock_Dealloc, /*tp_dealloc*/
328n/a 0, /*tp_print*/
329n/a (getattrfunc)PyBlock_GetAttr, /*tp_getattr*/
330n/a 0, /*tp_setattr*/
331n/a 0, /*tp_compare*/
332n/a 0, /*tp_repr*/
333n/a 0, /*tp_as_number*/
334n/a &block_as_sequence, /*tp_as_sequence*/
335n/a 0, /*tp_as_mapping*/
336n/a 0, /*tp_hash*/
337n/a};
338n/a
339n/a/* swi commands */
340n/a
341n/astatic PyObject *swi_swi(PyObject *self,PyObject *args)
342n/a{ PyObject *name,*format,*result,*v;
343n/a int swino,carry,rno=0,j,n;
344n/a char *swiname,*fmt,*outfmt;
345n/a _kernel_swi_regs r;
346n/a PyBlockObject *ao;
347n/a if(args==NULL||!PyTuple_Check(args)||(n=PyTuple_Size(args))<2)
348n/a { PyErr_BadArgument(); return NULL;}
349n/a name=PyTuple_GetItem(args,0);
350n/a if(!PyArg_Parse(name,"i",&swino))
351n/a { PyErr_Clear();
352n/a if(!PyArg_Parse(name,"s",&swiname)) return NULL;
353n/a e=xos_swi_number_from_string(swiname,&swino);
354n/a if(e) return swi_oserror();
355n/a }
356n/a format=PyTuple_GetItem(args,1);
357n/a if(!PyArg_Parse(format,"s",&fmt)) return NULL;
358n/a j=2;
359n/a for(;;fmt++)
360n/a { switch(*fmt)
361n/a { case '.': rno++;continue;
362n/a case ';':case 0: goto swicall;
363n/a case '0':case '1':case '2':case '3':case '4':
364n/a case '5':case '6':case '7':case '8':case '9':
365n/a r.r[rno++]=*fmt-'0';continue;
366n/a case '-':r.r[rno++]=-1;continue;
367n/a }
368n/a if(j>=n) return swi_error("Too few arguments");
369n/a v=PyTuple_GetItem(args,j++);
370n/a switch(*fmt)
371n/a { case 'i':if(!PyArg_Parse(v,"i",&r.r[rno])) return NULL;
372n/a break;
373n/a case 's':if(!PyArg_Parse(v,"s",(char**)(&r.r[rno]))) return NULL;
374n/a break;
375n/a case 'b':if(!PyArg_Parse(v,"O",(PyObject**)&ao)) return NULL;
376n/a if(!PyBlock_Check(v)) return swi_error("Not a block");
377n/a r.r[rno]=(int)(ao->block);
378n/a break;
379n/a case 'e':if(!PyArg_Parse(v,"O",(PyObject**)&ao)) return NULL;
380n/a if(!PyBlock_Check(v)) return swi_error("Not a block");
381n/a r.r[rno]=(int)(ao->block)+ao->length;
382n/a break;
383n/a default:return swi_error("Odd format character");
384n/a }
385n/a rno++;
386n/a }
387n/a swicall:e=(os_error*)_kernel_swi_c(swino,&r,&r,&carry);
388n/a if(e) return swi_oserror();
389n/a if(*fmt==0) { Py_INCREF(Py_None);return Py_None;}
390n/a n=0;
391n/a for(outfmt=++fmt;*outfmt;outfmt++) switch(*outfmt)
392n/a { case 'i':case 's':case '*':n++;break;
393n/a case '.':break;
394n/a default:return swi_error("Odd format character");
395n/a }
396n/a if(n==0) { Py_INCREF(Py_None);return Py_None;}
397n/a if(n!=1)
398n/a { result=PyTuple_New(n);
399n/a if(!result) return NULL;
400n/a }
401n/a rno=0;j=0;
402n/a for(;*fmt;fmt++)
403n/a { switch(*fmt)
404n/a { case 'i':v=PyInt_FromLong((long)r.r[rno++]); break;
405n/a case 's':v=PyString_FromString((char*)(r.r[rno++])); break;
406n/a case '.':rno++; continue;
407n/a case '*':v=PyInt_FromLong((long)carry); break;
408n/a }
409n/a if(!v) goto fail;
410n/a if(n==1) return v;
411n/a PyTuple_SetItem(result,j,v);
412n/a j++;
413n/a }
414n/a return result;
415n/a fail:Py_DECREF(result);return 0;
416n/a}
417n/a
418n/astatic PyObject *swi_string(PyObject *self, PyObject *arg)
419n/a{ char *s;
420n/a int l=-1;
421n/a if(!PyArg_ParseTuple(arg,"i|i",(unsigned int *)&s, &l)) return NULL;
422n/a if (l==-1)
423n/a l = strlen(s);
424n/a return PyString_FromStringAndSize((char*)s, l);
425n/a}
426n/a
427n/astatic char swi_string__doc__[] =
428n/a"string(address[, length]) -> string\n\
429n/aRead a null terminated string from the given address.";
430n/a
431n/a
432n/astatic PyObject *swi_integer(PyObject *self, PyObject *arg)
433n/a{ int *i;
434n/a
435n/a if(!PyArg_ParseTuple(arg,"i",(unsigned int *)&i))
436n/a return NULL;
437n/a return PyInt_FromLong(*i);
438n/a}
439n/a
440n/astatic char swi_integer__doc__[] =
441n/a"integer(address) -> string\n\
442n/aRead an integer from the given address.";
443n/a
444n/a
445n/astatic PyObject *swi_integers(PyObject *self, PyObject *arg)
446n/a{ int *i;
447n/a int c=-1;
448n/a PyObject *result, *result1;
449n/a
450n/a if(!PyArg_ParseTuple(arg,"i|i",(unsigned int *)&i, &c)) return NULL;
451n/a result=PyList_New(0);
452n/a if (result) {
453n/a while ( c>0 || (c==-1 && *i) ) {
454n/a result1 = PyInt_FromLong((long)*i);
455n/a if (!result1) {
456n/a Py_DECREF(result);
457n/a return NULL;
458n/a }
459n/a if (PyList_Append(result, result1)!=0) {
460n/a Py_DECREF(result);
461n/a Py_DECREF(result1);
462n/a return NULL;
463n/a };
464n/a i++;
465n/a if (c!=-1)
466n/a c--;
467n/a }
468n/a }
469n/a return result;
470n/a}
471n/a
472n/astatic char swi_integers__doc__[] =
473n/a"integers(address[, count]) -> string\n\
474n/aEither read a null terminated list of integers or\n\
475n/aa list of given length from the given address.";
476n/a
477n/a
478n/astatic PyObject *swi_tuples(PyObject *self, PyObject *arg)
479n/a{
480n/a unsigned char *i; /* points to current */
481n/a int c=-1, l=4, j, zero; /* count, length, index */
482n/a PyObject *result, *result1, *result11;
483n/a
484n/a if(!PyArg_ParseTuple(arg,"i|ii",(unsigned int *)&i, &l, &c)) return NULL;
485n/a result=PyList_New(0);
486n/a if (result) {
487n/a while (c) {
488n/a result1 = PyTuple_New(l);
489n/a if (!result1) {
490n/a Py_DECREF(result);
491n/a return NULL;
492n/a }
493n/a zero = (c==-1); /* check for zeros? */
494n/a for(j=0;j<l;j++) {
495n/a if (zero && *i)
496n/a zero = 0; /* non-zero found */
497n/a result11 = PyInt_FromLong((long)(*i));
498n/a if (!result11) {
499n/a Py_DECREF(result);
500n/a return NULL;
501n/a }
502n/a PyTuple_SetItem(result1, j, result11);
503n/a i++;
504n/a }
505n/a if (c==-1 && zero) {
506n/a Py_DECREF(result1);
507n/a c = 0;
508n/a break;
509n/a }
510n/a if (PyList_Append(result, result1)!=0) {
511n/a Py_DECREF(result1);
512n/a Py_DECREF(result);
513n/a return NULL;
514n/a }
515n/a if (c!=-1)
516n/a c--;
517n/a }
518n/a }
519n/a return result;
520n/a}
521n/a
522n/astatic char swi_tuples__doc__[] =
523n/a"tuples(address[, length=4[, count]]) -> string\n\
524n/aEither read a null terminated list of byte tuples or\n\
525n/aa list of given length from the given address.";
526n/a
527n/a
528n/astatic PyObject *swi_tuple(PyObject *self, PyObject *arg)
529n/a{
530n/a unsigned char *i; /* points to current */
531n/a int c=1, j;
532n/a PyObject *result, *result1;
533n/a
534n/a if(!PyArg_ParseTuple(arg,"i|i",(unsigned int *)&i, &c)) return NULL;
535n/a result = PyTuple_New(c);
536n/a if (!result)
537n/a return NULL;
538n/a for(j=0;j<c;j++) {
539n/a result1 = PyInt_FromLong((long)(i[j]));
540n/a if (!result1) {
541n/a Py_DECREF(result);
542n/a return NULL;
543n/a }
544n/a PyTuple_SetItem(result, j, result1);
545n/a }
546n/a return result;
547n/a}
548n/a
549n/astatic char swi_tuple__doc__[] =
550n/a"tuple(address[, count=1]]) -> tuple\n\
551n/aRead count bytes from given address.";
552n/a
553n/a
554n/astatic PyMethodDef SwiMethods[]=
555n/a{ { "swi", swi_swi, METH_VARARGS},
556n/a { "block", PyBlock_New, METH_VARARGS},
557n/a { "register", PyRegister, METH_VARARGS},
558n/a { "string", swi_string, METH_VARARGS, swi_string__doc__},
559n/a { "integer", swi_integer, METH_VARARGS, swi_integer__doc__},
560n/a { "integers", swi_integers, METH_VARARGS, swi_integers__doc__},
561n/a { "tuples", swi_tuples, METH_VARARGS, swi_tuples__doc__},
562n/a { "tuple", swi_tuple, METH_VARARGS, swi_tuple__doc__},
563n/a { NULL,NULL,0,NULL} /* Sentinel */
564n/a};
565n/a
566n/a
567n/avoid initswi()
568n/a{ PyObject *m, *d;
569n/a m = Py_InitModule("swi", SwiMethods);
570n/a d = PyModule_GetDict(m);
571n/a SwiError=PyErr_NewException("swi.error", NULL, NULL);
572n/a PyDict_SetItemString(d,"error",SwiError);
573n/a ArgError=PyErr_NewException("swi.ArgError", NULL, NULL);
574n/a PyDict_SetItemString(d,"ArgError",ArgError);
575n/a}