1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 /* Functions used by cgen output */
27 #include "allobjects.h"
28 #include "cgensupport.h"
31 /* Functions to extract arguments.
32 These needs to know the total number of arguments supplied,
33 since the argument list is a tuple only of there is more than
37 getiobjectarg(args
, nargs
, i
, p_arg
)
38 register object
*args
;
43 if (args
== NULL
|| !is_tupleobject(args
) ||
44 nargs
!= gettuplesize(args
) ||
45 i
< 0 || i
>= nargs
) {
49 args
= gettupleitem(args
, i
);
60 getilongarg(args
, nargs
, i
, p_arg
)
61 register object
*args
;
66 if (args
== NULL
|| !is_tupleobject(args
) ||
67 nargs
!= gettuplesize(args
) ||
68 i
< 0 || i
>= nargs
) {
71 args
= gettupleitem(args
, i
);
73 if (args
== NULL
|| !is_intobject(args
)) {
76 *p_arg
= getintvalue(args
);
81 getishortarg(args
, nargs
, i
, p_arg
)
82 register object
*args
;
87 if (!getilongarg(args
, nargs
, i
, &x
))
94 extractdouble(v
, p_arg
)
99 /* Fall through to error return at end of function */
101 else if (is_floatobject(v
)) {
102 *p_arg
= GETFLOATVALUE((floatobject
*)v
);
105 else if (is_intobject(v
)) {
106 *p_arg
= GETINTVALUE((intobject
*)v
);
109 else if (is_longobject(v
)) {
110 *p_arg
= dgetlongvalue(v
);
117 extractfloat(v
, p_arg
)
122 /* Fall through to error return at end of function */
124 else if (is_floatobject(v
)) {
125 *p_arg
= GETFLOATVALUE((floatobject
*)v
);
128 else if (is_intobject(v
)) {
129 *p_arg
= GETINTVALUE((intobject
*)v
);
132 else if (is_longobject(v
)) {
133 *p_arg
= dgetlongvalue(v
);
140 getifloatarg(args
, nargs
, i
, p_arg
)
141 register object
*args
;
147 if (!getiobjectarg(args
, nargs
, i
, &v
))
149 if (!extractfloat(v
, &x
))
156 getistringarg(args
, nargs
, i
, p_arg
)
162 if (!getiobjectarg(args
, nargs
, i
, &v
))
164 if (!is_stringobject(v
)) {
167 *p_arg
= getstringvalue(v
);
172 getichararg(args
, nargs
, i
, p_arg
)
178 if (!getistringarg(args
, nargs
, i
, &x
))
180 if (x
[0] == '\0' || x
[1] != '\0') {
181 /* Not exactly one char */
189 getilongarraysize(args
, nargs
, i
, p_arg
)
195 if (!getiobjectarg(args
, nargs
, i
, &v
))
197 if (is_tupleobject(v
)) {
198 *p_arg
= gettuplesize(v
);
201 if (is_listobject(v
)) {
202 *p_arg
= getlistsize(v
);
209 getishortarraysize(args
, nargs
, i
, p_arg
)
215 if (!getilongarraysize(args
, nargs
, i
, &x
))
221 /* XXX The following four are too similar. Should share more code. */
224 getilongarray(args
, nargs
, i
, n
, p_arg
)
228 long *p_arg
; /* [n] */
231 if (!getiobjectarg(args
, nargs
, i
, &v
))
233 if (is_tupleobject(v
)) {
234 if (gettuplesize(v
) != n
) {
237 for (i
= 0; i
< n
; i
++) {
238 w
= gettupleitem(v
, i
);
239 if (!is_intobject(w
)) {
242 p_arg
[i
] = getintvalue(w
);
246 else if (is_listobject(v
)) {
247 if (getlistsize(v
) != n
) {
250 for (i
= 0; i
< n
; i
++) {
251 w
= getlistitem(v
, i
);
252 if (!is_intobject(w
)) {
255 p_arg
[i
] = getintvalue(w
);
265 getishortarray(args
, nargs
, i
, n
, p_arg
)
269 short *p_arg
; /* [n] */
272 if (!getiobjectarg(args
, nargs
, i
, &v
))
274 if (is_tupleobject(v
)) {
275 if (gettuplesize(v
) != n
) {
278 for (i
= 0; i
< n
; i
++) {
279 w
= gettupleitem(v
, i
);
280 if (!is_intobject(w
)) {
283 p_arg
[i
] = getintvalue(w
);
287 else if (is_listobject(v
)) {
288 if (getlistsize(v
) != n
) {
291 for (i
= 0; i
< n
; i
++) {
292 w
= getlistitem(v
, i
);
293 if (!is_intobject(w
)) {
296 p_arg
[i
] = getintvalue(w
);
306 getidoublearray(args
, nargs
, i
, n
, p_arg
)
310 double *p_arg
; /* [n] */
313 if (!getiobjectarg(args
, nargs
, i
, &v
))
315 if (is_tupleobject(v
)) {
316 if (gettuplesize(v
) != n
) {
319 for (i
= 0; i
< n
; i
++) {
320 w
= gettupleitem(v
, i
);
321 if (!extractdouble(w
, &p_arg
[i
]))
326 else if (is_listobject(v
)) {
327 if (getlistsize(v
) != n
) {
330 for (i
= 0; i
< n
; i
++) {
331 w
= getlistitem(v
, i
);
332 if (!extractdouble(w
, &p_arg
[i
]))
343 getifloatarray(args
, nargs
, i
, n
, p_arg
)
347 float *p_arg
; /* [n] */
350 if (!getiobjectarg(args
, nargs
, i
, &v
))
352 if (is_tupleobject(v
)) {
353 if (gettuplesize(v
) != n
) {
356 for (i
= 0; i
< n
; i
++) {
357 w
= gettupleitem(v
, i
);
358 if (!extractfloat(w
, &p_arg
[i
]))
363 else if (is_listobject(v
)) {
364 if (getlistsize(v
) != n
) {
367 for (i
= 0; i
< n
; i
++) {
368 w
= getlistitem(v
, i
);
369 if (!extractfloat(w
, &p_arg
[i
]))