ack/lang/basic/src/func.c
2006-02-04 00:57:05 +00:00

270 lines
5.5 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
#include "bem.h"
#ifndef NORSCID
static char rcs_id[] = "$Id$" ;
#endif
/* expression types for predefined functions are assembled */
int typetable[10];
int exprlimit;
/* handle all predefined functions */
#define cv(X) conversion(type,X); pop=X
parm(cnt)
int cnt;
{
if( cnt> exprlimit)
error("Not enough arguments");
if( cnt < exprlimit)
error("Too many arguments");
}
callfcn(fcnnr,cnt,typetable)
int fcnnr,cnt;
int *typetable;
{
int pop=DOUBLETYPE;
int res=DOUBLETYPE;
int type;
type= typetable[0];
exprlimit=cnt;
if(debug) print("fcn=%d\n",fcnnr);
switch(fcnnr)
{
case ABSSYM: cv(DOUBLETYPE);
C_cal("_abr");
parm(1);
break;
case ASCSYM: cv(STRINGTYPE);
C_cal("_asc");
res=INTTYPE;
parm(1);
break;
case ATNSYM: cv(DOUBLETYPE);
C_cal("_atn");
parm(1);
break;
case CDBLSYM: cv(DOUBLETYPE);
return(DOUBLETYPE);;
case CHRSYM: cv(INTTYPE);
C_cal("_chr");
res=STRINGTYPE;
parm(1);
break;
case CSNGSYM: cv(DOUBLETYPE);
return(DOUBLETYPE);
case CINTSYM: cv(INTTYPE);
return(INTTYPE);
case COSSYM: cv(DOUBLETYPE);
C_cal("_cos");
parm(1);
break;
case CVISYM: cv(STRINGTYPE);
C_cal("_cvi");
res=INTTYPE;
parm(1);
break;
case CVSSYM: cv(STRINGTYPE);
C_cal("_cvd");
res=DOUBLETYPE;
parm(1);
break;
case CVDSYM: cv(STRINGTYPE);
C_cal("_cvd");
res=DOUBLETYPE;
parm(1);
break;
case EOFSYM:
if( cnt==0)
{
res= INTTYPE;
pop= INTTYPE;
C_loc((arith) -1);
} else cv(INTTYPE);
C_cal("_ioeof");
res=INTTYPE;
break;
case EXPSYM: cv(DOUBLETYPE);
C_cal("_exp");
parm(1);
break;
case FIXSYM: cv(DOUBLETYPE);
C_cal("_fix");
res=INTTYPE;
parm(1);
break;
case INPSYM:
case LPOSSYM:
case FRESYM: pop=0;
warning("function not supported");
parm(1);
break;
case HEXSYM: cv(INTTYPE);
C_cal("_hex"); res=STRINGTYPE;
parm(1);
break;
case OUTSYM:
case INSTRSYM: cv(DOUBLETYPE);
C_cal("_instr");
res=STRINGTYPE;
parm(1);
break;
case INTSYM: cv(DOUBLETYPE);
C_cal("_fcint");
parm(1);
break;
case LEFTSYM: parm(2);
extraconvert(type, STRINGTYPE,typetable[1]);
type= typetable[1];
cv(INTTYPE);
C_cal("_left");
res=STRINGTYPE;
C_asp((arith) BEMPTRSIZE);
C_asp((arith) BEMINTSIZE);
C_lfr((arith) BEMPTRSIZE);
return(STRINGTYPE);
case LENSYM: cv(STRINGTYPE);
C_cal("_length");
res=INTTYPE;
parm(1);
break;
case LOCSYM: cv(INTTYPE);
C_cal("_loc");
res=INTTYPE;
parm(1);
break;
case LOGSYM: cv(DOUBLETYPE);
C_cal("_log");
parm(1);
break;
case MKISYM: cv(INTTYPE);
C_cal("_mki");
res=STRINGTYPE;
parm(1);
break;
case MKSSYM: cv(DOUBLETYPE);
C_cal("_mkd");
res=STRINGTYPE;
parm(1);
break;
case MKDSYM: cv(DOUBLETYPE);
C_cal("_mkd");
res=STRINGTYPE;
parm(1);
break;
case OCTSYM: cv(INTTYPE);
C_cal("_oct");
res=STRINGTYPE;
parm(1);
break;
case PEEKSYM: cv(INTTYPE);
C_cal("_peek");
res=INTTYPE;
parm(1);
break;
case POSSYM: C_asp((arith) typestring(type));
C_exa_dnam("_pos");
C_loe_dnam("_pos",(arith) 0);
return(INTTYPE);
case RIGHTSYM: parm(2);
extraconvert(type, STRINGTYPE,typetable[1]);
type= typetable[1];
cv(INTTYPE);
C_cal("_right");
res=STRINGTYPE;
C_asp((arith) BEMINTSIZE);
C_asp((arith) BEMPTRSIZE);
C_lfr((arith) BEMPTRSIZE);
return(STRINGTYPE);
case RNDSYM: if( cnt==1) pop=type;
else pop=0;
C_cal("_rnd");
res= DOUBLETYPE;
break;
case SGNSYM: cv(DOUBLETYPE);
C_cal("_sgn");
res=INTTYPE;
parm(1);
break;
case SINSYM: cv(DOUBLETYPE);
C_cal("_sin");
parm(1);
break;
case SPACESYM: cv(INTTYPE);
C_cal("_space");
res=STRINGTYPE;
parm(1);
break;
case SPCSYM: cv(INTTYPE);
C_cal("_spc");
res=0;
parm(1);
break;
case SQRSYM: cv(DOUBLETYPE);
C_cal("_sqt");
parm(1);
break;
case STRSYM: cv(DOUBLETYPE);
C_cal("_nstr");
res=STRINGTYPE; /* NEW */
parm(1);
break;
case STRINGSYM:
parm(2); /* 2 is NEW */
if (typetable[1] == STRINGTYPE) {
C_cal("_asc");
C_asp((arith)BEMPTRSIZE);
C_lfr((arith)BEMINTSIZE);
typetable[1] = INTTYPE;
}
extraconvert(type,
DOUBLETYPE,
typetable[1]); /* NEW */
type= typetable[1];
cv(DOUBLETYPE); /* NEW */
C_cal("_string");
res=STRINGTYPE;
C_asp((arith)typestring(DOUBLETYPE)); /*NEW*/
break;
case TABSYM: cv(INTTYPE);
C_cal("_tab");
res=0;
parm(1);
break;
case TANSYM: cv(DOUBLETYPE);
C_cal("_tan");
parm(1);
break;
case VALSYM: cv(STRINGTYPE);
C_loi((arith)BEMPTRSIZE);
C_cal("atoi");
res=INTTYPE;
parm(1);
break;
case VARPTRSYM: cv(DOUBLETYPE);
C_cal("_valptr");
parm(1);
break;
default: error("unknown function");
}
if(pop) C_asp((arith) typestring(pop));
if(res) C_lfr((arith) typestring(res));
return(res);
}