219 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "bem.h"
 | 
						|
 | 
						|
#ifndef NORSCID
 | 
						|
static char rcs_id[] = "$Header$" ;
 | 
						|
#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
 | 
						|
#define cl(X)	emcode("cal",X);
 | 
						|
 | 
						|
parm(cnt)
 | 
						|
int cnt;
 | 
						|
{
 | 
						|
	if( cnt> exprlimit)
 | 
						|
		error("Not enough arguments");
 | 
						|
	if( cnt < exprlimit)
 | 
						|
		error("Too many arguments");
 | 
						|
}
 | 
						|
 | 
						|
callfcn(fcnnr,cnt)
 | 
						|
int fcnnr,cnt;
 | 
						|
{
 | 
						|
	int pop=DOUBLETYPE;
 | 
						|
	int res=DOUBLETYPE;
 | 
						|
	int type;
 | 
						|
 | 
						|
 | 
						|
	type= typetable[0];
 | 
						|
	exprlimit=cnt;
 | 
						|
	if(debug) printf("fcn=%d\n",fcnnr);
 | 
						|
	switch(fcnnr)
 | 
						|
	{
 | 
						|
	case ABSSYM: 	cv(DOUBLETYPE);
 | 
						|
			cl("$_abr");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case ASCSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_asc"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case ATNSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_atn");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case CDBLSYM:	cv(DOUBLETYPE);  return(DOUBLETYPE);;
 | 
						|
	case CHRSYM:	cv(INTTYPE);
 | 
						|
			cl("$_chr"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case CSNGSYM:
 | 
						|
		cv(DOUBLETYPE); return(DOUBLETYPE);
 | 
						|
	case CINTSYM:	cv(INTTYPE);  return(INTTYPE);
 | 
						|
	case COSSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_cos");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case CVISYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_cvi"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case CVSSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_cvd"); res=DOUBLETYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case CVDSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_cvd"); res=DOUBLETYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case EOFSYM:	
 | 
						|
			if( cnt==0)
 | 
						|
			{
 | 
						|
				res= INTTYPE;
 | 
						|
				pop= INTTYPE;
 | 
						|
				emcode("loc","-1");
 | 
						|
			} else cv(INTTYPE);
 | 
						|
			cl("$_ioeof"); res=INTTYPE;
 | 
						|
			break;
 | 
						|
	case EXPSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_exp");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case FIXSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_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);
 | 
						|
			cl("$_hex"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case OUTSYM:
 | 
						|
	case INSTRSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_instr"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case INTSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_fcint");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case LEFTSYM:	parm(2);
 | 
						|
			extraconvert(type, STRINGTYPE,typetable[1]);
 | 
						|
			type= typetable[1];
 | 
						|
			cv(INTTYPE);
 | 
						|
			cl("$_left"); res=STRINGTYPE;
 | 
						|
			emcode("asp",EMPTRSIZE);
 | 
						|
			emcode("asp",EMINTSIZE);
 | 
						|
			emcode("lfr",EMPTRSIZE);
 | 
						|
			return(STRINGTYPE);
 | 
						|
	case LENSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_len"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case LOCSYM:	cv(INTTYPE);
 | 
						|
			cl("$_loc"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case LOGSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_log");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case MKISYM:	cv(INTTYPE);
 | 
						|
			cl("$_mki"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case MKSSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_mkd"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case MKDSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_mkd"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case OCTSYM:	cv(INTTYPE);
 | 
						|
			cl("$_oct"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case PEEKSYM:	cv(INTTYPE);
 | 
						|
			cl("$_peek"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case POSSYM:	emcode("asp",typestring(type));
 | 
						|
			emcode("exa","_pos");
 | 
						|
			emcode("loe","_pos");
 | 
						|
			return(INTTYPE);
 | 
						|
	case RIGHTSYM:	parm(2);
 | 
						|
			extraconvert(type, STRINGTYPE,typetable[1]);
 | 
						|
			type= typetable[1];
 | 
						|
			cv(INTTYPE);
 | 
						|
			cl("$_right"); res=STRINGTYPE;
 | 
						|
			emcode("asp",EMINTSIZE);
 | 
						|
			emcode("asp",EMPTRSIZE);
 | 
						|
			emcode("lfr",EMPTRSIZE);
 | 
						|
			return(STRINGTYPE);
 | 
						|
	case RNDSYM:	if( cnt==1) pop=type; else pop=0;
 | 
						|
			cl("$_rnd"); res= DOUBLETYPE;
 | 
						|
			break;
 | 
						|
	case SGNSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_sgn"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case SINSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_sin");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case SPACESYM:	cv(INTTYPE);
 | 
						|
			cl("$_space"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case SPCSYM:	cv(INTTYPE);
 | 
						|
			cl("$_spc"); res=0;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case SQRSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_sqt");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case STRSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_str");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case STRINGSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$_string"); res=STRINGTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case TABSYM:	cv(INTTYPE);
 | 
						|
			cl("$_tab"); res=0;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case TANSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_tan");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case VALSYM:	cv(STRINGTYPE);
 | 
						|
			cl("$atol"); res=INTTYPE;
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	case VARPTRSYM:	cv(DOUBLETYPE);
 | 
						|
			cl("$_valptr");
 | 
						|
			parm(1);
 | 
						|
			break;
 | 
						|
	default:	error("unknown function");
 | 
						|
	}
 | 
						|
	if(pop)
 | 
						|
		emcode("asp",typestring(pop));
 | 
						|
	if(res)
 | 
						|
	emcode("lfr",typestring(res));
 | 
						|
	return(res);
 | 
						|
}
 | 
						|
 |