2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
9 static char rcs_id[] = "$Id: func.c,v 1.3 1996/11/26 15:02:25 ceriel Exp $" ;
13 /* expression types for predefined functions are assembled */
17 /* handle all predefined functions */
18 #define cv(X) conversion(type,X); pop=X
26 error("Not enough arguments");
28 error("Too many arguments");
33 callfcn(fcnnr,cnt,typetable)
44 if(debug) print("fcn=%d\n",fcnnr);
48 case ABSSYM: cv(DOUBLETYPE);
52 case ASCSYM: cv(STRINGTYPE);
57 case ATNSYM: cv(DOUBLETYPE);
61 case CDBLSYM: cv(DOUBLETYPE);
63 case CHRSYM: cv(INTTYPE);
68 case CSNGSYM: cv(DOUBLETYPE);
70 case CINTSYM: cv(INTTYPE);
72 case COSSYM: cv(DOUBLETYPE);
76 case CVISYM: cv(STRINGTYPE);
81 case CVSSYM: cv(STRINGTYPE);
86 case CVDSYM: cv(STRINGTYPE);
101 case EXPSYM: cv(DOUBLETYPE);
105 case FIXSYM: cv(DOUBLETYPE);
113 warning("function not supported");
116 case HEXSYM: cv(INTTYPE);
117 C_cal("_hex"); res=STRINGTYPE;
121 case INSTRSYM: cv(DOUBLETYPE);
126 case INTSYM: cv(DOUBLETYPE);
130 case LEFTSYM: parm(2);
131 extraconvert(type, STRINGTYPE,typetable[1]);
136 C_asp((arith) BEMPTRSIZE);
137 C_asp((arith) BEMINTSIZE);
138 C_lfr((arith) BEMPTRSIZE);
140 case LENSYM: cv(STRINGTYPE);
145 case LOCSYM: cv(INTTYPE);
150 case LOGSYM: cv(DOUBLETYPE);
154 case MKISYM: cv(INTTYPE);
159 case MKSSYM: cv(DOUBLETYPE);
164 case MKDSYM: cv(DOUBLETYPE);
169 case OCTSYM: cv(INTTYPE);
174 case PEEKSYM: cv(INTTYPE);
179 case POSSYM: C_asp((arith) typestring(type));
181 C_loe_dnam("_pos",(arith) 0);
183 case RIGHTSYM: parm(2);
184 extraconvert(type, STRINGTYPE,typetable[1]);
189 C_asp((arith) BEMINTSIZE);
190 C_asp((arith) BEMPTRSIZE);
191 C_lfr((arith) BEMPTRSIZE);
193 case RNDSYM: if( cnt==1) pop=type;
198 case SGNSYM: cv(DOUBLETYPE);
203 case SINSYM: cv(DOUBLETYPE);
207 case SPACESYM: cv(INTTYPE);
212 case SPCSYM: cv(INTTYPE);
217 case SQRSYM: cv(DOUBLETYPE);
221 case STRSYM: cv(DOUBLETYPE);
223 res=STRINGTYPE; /* NEW */
227 parm(2); /* 2 is NEW */
228 if (typetable[1] == STRINGTYPE) {
230 C_asp((arith)BEMPTRSIZE);
231 C_lfr((arith)BEMINTSIZE);
232 typetable[1] = INTTYPE;
236 typetable[1]); /* NEW */
238 cv(DOUBLETYPE); /* NEW */
241 C_asp((arith)typestring(DOUBLETYPE)); /*NEW*/
243 case TABSYM: cv(INTTYPE);
248 case TANSYM: cv(DOUBLETYPE);
252 case VALSYM: cv(STRINGTYPE);
253 C_loi((arith)BEMPTRSIZE);
258 case VARPTRSYM: cv(DOUBLETYPE);
262 default: error("unknown function");
265 if(pop) C_asp((arith) typestring(pop));
266 if(res) C_lfr((arith) typestring(res));