/* xlftab.c - xlisp function table */
/* Copyright (c) 1989, by David Michael Betz.                            */
/* You may give out copies of this software; for conditions see the file */
/* COPYING included with this distribution.                              */

#include "xlisp.h"

/* include system dependant definitions */
#include "osdefs.h"

/* SUBR/FSUBR indicator */
#define S	SUBR
#define F	FSUBR
#ifdef MULVALS
/* extra codes for subrs that return multiple values */
#define SM  (SUBR+ TYPEFIELD+1)
#define FM  (FSUBR+ TYPEFIELD+1)
#else
#define SM  SUBR
#define FM  FSUBR
#endif

/* forward declarations */
LOCAL LVAL xnotimp _((void));

/* xnotimp - function table entries that are currently not implemented */
LOCAL LVAL xnotimp()
{
    xlfail("function not implemented");
    return NIL;
}

/* the function table */
#if defined(_Windows) && ! defined(WIN32)   /* L. Tierney */
FUNDEF far funtab[] = {
#else
FUNDEF funtab[] = {
#endif
/* DO NOT ALTER ENTRIES UNTIL AFTER OBPRIN1 */
	/* read macro functions */
{   NULL,               S, rmhash       },
{   NULL,               S, rmquote      },
{   NULL,               S, rmdquote     },
{   NULL,               S, rmbquote     },
{   NULL,               S, rmcomma      },
{   NULL,               S, rmlpar       },
{   NULL,               S, rmrpar       },
{   NULL,               S, rmsemi       },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },

	/* methods */
{   NULL,               S, clnew        },
{   NULL,               S, clisnew      },
{   NULL,               S, clanswer     },
{   NULL,               S, obisnew      },
{   NULL,               S, obclass      },
{   NULL,               S, obshow       },
{   NULL,               S, obprin1      },
{   NULL,               S, clmethod     },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },

	/* evaluator functions */
{   "EVAL",             SM, xeval       },
{   "APPLY",            SM, xapply      },
{   "FUNCALL",          SM, xfuncall    },
{   "QUOTE",            F, xquote       },
{   "IDENTITY",         S, xquote       },  /* IDENTITY is same as QUOTE */
{   "FUNCTION",         F, xfunction    },
{   "COMPLEMENT",       F, xcomplement  },
{   "BACKQUOTE",        F, xbquote      },
{   "LAMBDA",           F, xlambda      },

	/* symbol functions */
{   "SET",              S, xset         },
{   "SETQ",             F, xsetq        },
{   "SETF",             F, xsetf        },
{   "DEFUN",            F, xdefun       },
{   "DEFMACRO",         F, xdefmacro    },
{   "GENSYM",           S, xgensym      },
{   "MAKE-SYMBOL",      S, xmakesymbol  },
{   "INTERN",           SM, xintern     },
{   "SYMBOL-NAME",      S, xsymname     },
{   "SYMBOL-VALUE",     S, xsymvalue    },
{   "SYMBOL-PLIST",     S, xsymplist    },
{   "GET",              S, xget         },
{   "GETF",             S, xgetf        },
{   "PUTPROP",          S, xputprop     },
{   "REMPROP",          S, xremprop     },
{   "HASH",             S, xhash        },

	/* array functions */
{   "MAKE-ARRAY",       S, xmkarray     },
{   "AREF",             S, xaref        },
			
	/* list functions */
{   "CAR",              S, xcar         },
{   "CDR",              S, xcdr         },
			
{   "CAAR",             S, xcaar        },
{   "CADR",             S, xcadr        },
{   "CDAR",             S, xcdar        },
{   "CDDR",             S, xcddr        },

{   "CAAAR",            S, xcaaar       },
{   "CAADR",            S, xcaadr       },
{   "CADAR",            S, xcadar       },
{   "CADDR",            S, xcaddr       },
{   "CDAAR",            S, xcdaar       },
{   "CDADR",            S, xcdadr       },
{   "CDDAR",            S, xcddar       },
{   "CDDDR",            S, xcdddr       },

{   "CAAAAR",           S, xcaaaar      },
{   "CAAADR",           S, xcaaadr      },
{   "CAADAR",           S, xcaadar      },
{   "CAADDR",           S, xcaaddr      },
{   "CADAAR",           S, xcadaar      },
{   "CADADR",           S, xcadadr      },
{   "CADDAR",           S, xcaddar      },
{   "CADDDR",           S, xcadddr      },
{   "CDAAAR",           S, xcdaaar      },
{   "CDAADR",           S, xcdaadr      },
{   "CDADAR",           S, xcdadar      },
{   "CDADDR",           S, xcdaddr      },
{   "CDDAAR",           S, xcddaar      },
{   "CDDADR",           S, xcddadr      },
{   "CDDDAR",           S, xcdddar      },
{   "CDDDDR",           S, xcddddr      },

{   "CONS",             S, xcons        },
{   "LIST",             S, xlist        },
{   "LIST*",            S, xliststar    },
{   "APPEND",           S, xappend      },
{   "REVERSE",          S, xreverse     },
{   "LAST",             S, xlast        },
{   "NTH",              S, xnth         },
{   "NTHCDR",           S, xnthcdr      },
{   "MEMBER",           S, xmember      },
{   "ASSOC",            S, xassoc       },
{   "SUBST",            S, xsubst       },
{   "SUBLIS",           S, xsublis      },
{   "NSUBST",           S, xnsubst      },
{   "NSUBST-IF",        S, xnsubstif    },
{   "NSUBST-IF-NOT",    S, xnsubstifnot },
{   "NSUBLIS",          S, xnsublis     },
{   "REMOVE",           S, xremove      },
{   "LENGTH",           S, xlength      },
{   "LIST-LENGTH",      S, xlistlength  },
{   "MAPC",             S, xmapc        },
{   "MAPCAR",           S, xmapcar      },
{   "MAPL",             S, xmapl        },
{   "MAPLIST",          S, xmaplist     },
{   "MAPCAN",           S, xmapcan      },
{   "MAPCON",           S, xmapcon      },
			
	/* destructive list functions */
{   "RPLACA",           S, xrplca       },
{   "RPLACD",           S, xrplcd       },
{   "NCONC",            S, xnconc       },
{   "DELETE",           S, xdelete      },

	/* predicate functions */
{   "ATOM",             S, xatom        },
{   "SYMBOLP",          S, xsymbolp     },
{   "NUMBERP",          S, xnumberp     },
{   "BOUNDP",           S, xboundp      },
{   "NULL",             S, xnull        },
{   "LISTP",            S, xlistp       },
{   "CONSP",            S, xconsp       },
{   "VECTORP",          S, xvectorp     },
{   "MINUSP",           S, xminusp      },
{   "ZEROP",            S, xzerop       },
{   "PLUSP",            S, xplusp       },
{   "EVENP",            S, xevenp       },
{   "ODDP",             S, xoddp        },
{   "EQ",               S, xeq          },
{   "EQL",              S, xeql         },
{   "EQUAL",            S, xequal       },

	/* special forms */
{   "COND",             FM, xcond       },
{   "CASE",             FM, xcase       },
{   "AND",              FM, xand        },
{   "OR",               FM, xor         },
{   "LET",              FM, xlet        },
{   "LET*",             FM, xletstar    },
{   "IF",               FM, xif         },
{   "PROG",             FM, xprog       },
{   "PROG*",            FM, xprogstar   },
{   "PROG1",            F, xprog1       },
{   "PROG2",            F, xprog2       },
{   "PROGN",            FM, xprogn      },
{   "GO",               F, xgo          },
{   "RETURN",           F, xreturn      },
{   "DO",               FM, xdo         },
{   "DO*",              FM, xdostar     },
{   "DOLIST",           FM, xdolist     },
{   "DOTIMES",          FM, xdotimes    },
{   "CATCH",            FM, xcatch      },
{   "THROW",            F, xthrow       },
	
	/* debugging and error handling functions */
{   "ERROR",            S, xerror       },
{   "CERROR",           S, xcerror      },
{   "BREAK",            S, xbreak       },
{   "CLEAN-UP",         S, xcleanup     },
{   "TOP-LEVEL",        S, xtoplevel    },
{   "CONTINUE",         S, xcontinue    },
{   "ERRSET",           F, xerrset      },
{   "BAKTRACE",         S, xbaktrace    },
{   "EVALHOOK",         SM, xevalhook   },

	/* arithmetic functions */
{   "TRUNCATE",         SM, xfix        },
{   "FLOAT",            S, xfloat       },
{   "+",                S, xadd         },
{   "-",                S, xsub         },
{   "*",                S, xmul         },
{   "/",                S, xdiv         },
{   "1+",               S, xadd1        },
{   "1-",               S, xsub1        },
{   "REM",              S, xrem         },
{   "MIN",              S, xmin         },
{   "MAX",              S, xmax         },
{   "ABS",              S, xabs         },
{   "SIN",              S, xsin         },
{   "COS",              S, xcos         },
{   "TAN",              S, xtan         },
{   "EXPT",             S, xexpt        },
{   "EXP",              S, xexp         },
{   "SQRT",             S, xsqrt        },
{   "RANDOM",           S, xrand        },
			
	/* bitwise logical functions */
{   "LOGAND",           S, xlogand      },
{   "LOGIOR",           S, xlogior      },
{   "LOGXOR",           S, xlogxor      },
{   "LOGNOT",           S, xlognot      },
#ifdef BIGNUMS
{   "LOGEQV",           S, xlogeqv	},
{   "LOGNAND",	        S, xlognand	},
{   "LOGNOR",		S, xlognor	},
{   "LOGANDC1",		S, xlogandc1	},
{   "LOGANDC2",		S, xlogandc2	},
{   "LOGORC1",		S, xlogorc1	},
{   "LOGORC2",		S, xlogorc2	},
{   "LOGTEST",		S, xlogtest	},
{   "LOGBITP",		S, xlogbitp	},
{   "LOGCOUNT",		S, xlogcount	},
{   "INTEGER-LENGTH",	S, xintlen	},
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
{   "ASH",              S, xash         },

	/* numeric comparison functions */
{   "<",                S, xlss         },
{   "<=",               S, xleq         },
{   "=",                S, xequ         },
{   "/=",               S, xneq         },
{   ">=",               S, xgeq         },
{   ">",                S, xgtr         },
			
	/* string functions */
{   "CONCATENATE",      S, xconcatenate },
{   "SUBSEQ",           S, xsubseq      },
{   "STRING",           S, xstring      },
{   "CHAR",             S, xchar        },

	/* I/O functions */
{   "READ",             S, xread        },
{   "READ-PRESERVING-WHITESPACE",S, xreadpw     },
{   "PRINT",            S, xprint       },
{   "PRIN1",            S, xprin1       },
{   "PRINC",            S, xprinc       },
{   "TERPRI",           S, xterpri      },
{   "FLATSIZE",         S, xflatsize    },
{   "FLATC",            S, xflatc       },
			
	/* file I/O functions */
{   "OPEN",             S, xopen        },
{   "FORMAT",           S, xformat      },
{   "CLOSE",            S, xclose       },
{   "READ-CHAR",        S, xrdchar      },
{   "PEEK-CHAR",        S, xpkchar      },
{   "WRITE-CHAR",       S, xwrchar      },
{   "READ-LINE",        S, xreadline    },
{   "UNREAD-CHAR",      S, xunrdchar    },

	/* system functions */
{   "LOAD",             S, xload        },
{   "DRIBBLE",          S, xtranscript  },
{   "SYSTEM::ENABLE-INTERRUPTS",S, xenablintr },

/* functions specific to xldmem.c */
{   "GC",               S, xgc          },
{   "EXPAND",           S, xexpand      },
{   "ALLOC",            S, xalloc       },
{   "ROOM",             S, xmem         },
{   "REGISTER-FINALIZER",S, xregfinal    },
{   "MAKE-WEAK-BOX",    S, xmkweakbox   },
{   "WEAK-BOX-VALUE",   S, xweakboxval  },
#ifdef SAVERESTORE
{   "SAVE",             S, xsave        },
{   "RESTORE",          S, xrestore     },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
/* end of functions specific to xldmem.c */

{   "TYPE-OF",          S, xtype        },
{   "EXIT",             S, xexit        },
{   "PEEK",             S, xpeek        },
{   "POKE",             S, xpoke        },
{   "ADDRESS-OF",       S, xaddrs       },
{   "SYSTEM:POINTER-ADDRESS", S, xnpaddr },
{   "SYSTEM:POINTER-PROTECTED", S, xnpprot },
{   "SYSTEM:POINTER-INCREMENT", S, xnpincr },

	/* new functions and special forms */
{   "VECTOR",           S, xvector      },
{   "BLOCK",            FM, xblock      },
{   "RETURN-FROM",      F, xrtnfrom     },
{   "TAGBODY",          F, xtagbody     },
{   "PSETQ",            F, xpsetq       },
{   "PSETF",            F, xpsetf       },
{   "FLET",             FM, xflet       },
{   "LABELS",           FM, xlabels     },
{   "MACROLET",         FM, xmacrolet   },
{   "UNWIND-PROTECT",   FM, xunwindprotect},
{   "PPRINT",           SM, xpp         },
{   "STRING<",          S, xstrlss      },
{   "STRING<=",         S, xstrleq      },
{   "STRING=",          S, xstreql      },
{   "STRING/=",         S, xstrneq      },
{   "STRING>=",         S, xstrgeq      },
{   "STRING>",          S, xstrgtr      },
{   "STRING-LESSP",     S, xstrilss     },
{   "STRING-NOT-GREATERP",S,xstrileq    },
{   "STRING-EQUAL",     S, xstrieql     },
{   "STRING-NOT-EQUAL", S, xstrineq     },
{   "STRING-NOT-LESSP", S, xstrigeq     },
{   "STRING-GREATERP",  S, xstrigtr     },
{   "INTEGERP",         S, xintegerp    },
{   "FLOATP",           S, xfloatp      },
{   "STRINGP",          S, xstringp     },
{   "ARRAYP",           S, xarrayp      },
{   "STREAMP",          S, xstreamp     },
{   "OBJECTP",          S, xobjectp     },
{   "STRING-UPCASE",    S, xupcase      },
{   "STRING-DOWNCASE",  S, xdowncase    },
{   "STRING-CAPITALIZE",S, xcapcase     },
{   "NSTRING-UPCASE",   S, xnupcase     },
{   "NSTRING-DOWNCASE", S, xndowncase   },
{   "NSTRING-CAPITALIZE",S, xncapcase   },
{   "STRING-TRIM",      S, xtrim        },
{   "STRING-LEFT-TRIM", S, xlefttrim    },
{   "STRING-RIGHT-TRIM",S, xrighttrim   },
{   "WHEN",             FM, xwhen       },
{   "UNLESS",           FM, xunless     },
{   "LOOP",             FM, xloop       },
{   "SYMBOL-FUNCTION",  S, xsymfunction },
{   "FBOUNDP",          S, xfboundp     },
{   "SEND",             SM, xsend       },
{   "SEND-SUPER",       SM, xsendsuper  },
{   "PROGV",            FM, xprogv      },
{   "CHARACTERP",       S, xcharp       },
{   "CHAR-INT",         S, xcharint     },
{   "INT-CHAR",         S, xintchar     },
{   "READ-BYTE",        S, xrdbyte      },
{   "WRITE-BYTE",       S, xwrbyte      },
{   "MAKE-STRING-INPUT-STREAM", S, xmkstrinput      },
{   "MAKE-STRING-OUTPUT-STREAM",S, xmkstroutput     },
{   "GET-OUTPUT-STREAM-STRING", S, xgetstroutput    },
{   "GET-OUTPUT-STREAM-LIST",   S, xgetlstoutput    },
{   "GCD",              S, xgcd         },
{   "FUNCTION-LAMBDA-EXPRESSION",    SM, xgetlambda       },
{   "MACROEXPAND",      SM, xmacroexpand },
{   "MACROEXPAND-1",    SM,x1macroexpand},
{   "MACRO-FUNCTION",   S, xmacrofun    },
{   "CHAR<",            S, xchrlss      },
{   "CHAR<=",           S, xchrleq      },
{   "CHAR=",            S, xchreql      },
{   "CHAR/=",           S, xchrneq      },
{   "CHAR>=",           S, xchrgeq      },
{   "CHAR>",            S, xchrgtr      },
{   "CHAR-LESSP",       S, xchrilss     },
{   "CHAR-NOT-GREATERP",S, xchrileq     },
{   "CHAR-EQUAL",       S, xchrieql     },
{   "CHAR-NOT-EQUAL",   S, xchrineq     },
{   "CHAR-NOT-LESSP",   S, xchrigeq     },
{   "CHAR-GREATERP",    S, xchrigtr     },
{   "UPPER-CASE-P",     S, xuppercasep  },
{   "LOWER-CASE-P",     S, xlowercasep  },
{   "BOTH-CASE-P",      S, xbothcasep   },
{   "DIGIT-CHAR-P",     S, xdigitp      },
{   "ALPHANUMERICP",    S, xalphanumericp},
{   "ALPHA-CHAR-P",     S, xalphacharp  },
{   "CHAR-UPCASE",      S, xchupcase    },
{   "CHAR-DOWNCASE",    S, xchdowncase  },
{   "DIGIT-CHAR",       S, xdigitchar   },
{   "CHAR-CODE",        S, xcharcode    },
{   "CODE-CHAR",        S, xcodechar    },
{   "ENDP",             S, xendp        },
{   "REMOVE-IF",        S, xremif       },
{   "REMOVE-IF-NOT",    S, xremifnot    },
{   "DELETE-IF",        S, xdelif       },
{   "DELETE-IF-NOT",    S, xdelifnot    },
{   "TRACE",            F, xtrace       },
{   "UNTRACE",          F, xuntrace     },
{   "SORT",             S, xsort        },
{   "STABLE-SORT",      S, xsort        },
#ifdef SUBSTITUTE
{   "SUBSTITUTE",               S, xsubstitute  },
{   "SUBSTITUTE-IF",            S, xsubstituteif},
{   "SUBSTITUTE-IF-NOT",        S, xsubstituteifnot},
{   "NSUBSTITUTE",              S, xnsubstitute },
{   "NSUBSTITUTE-IF",           S, xnsubstituteif},
{   "NSUBSTITUTE-IF-NOT",       S, xnsubstituteifnot},
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
#ifdef TIMES
{   "TIME",             FM, xtime       },
{   "GET-INTERNAL-RUN-TIME",    S, xruntime  },
{   "GET-INTERNAL-REAL-TIME",   S, xrealtime },
{   "GET-INTERNAL-GC-TIME",     S, xgctime   },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
	/* extra table entries */
#ifdef POSFCNS
{   "COUNT",            S, xcount       },
{   "FIND",             S, xfind        },
{   "POSITION",         S, xposition    },
{   "COUNT-IF",         S, xcountif     },
{   "FIND-IF",          S, xfindif      },
{   "POSITION-IF",      S, xpositionif  },
{   "COUNT-IF-NOT",     S, xcountifnot  },
{   "FIND-IF-NOT",      S, xfindifnot   },
{   "POSITION-IF-NOT",  S, xpositionifnot },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
{   "COERCE",           S, xcoerce      },
{   "ELT",              S, xelt         },
#ifdef SRCHFCN
{   "SEARCH",           S, xsearch      },
#else
{   NULL,               S, xnotimp      },
#endif
#ifdef MAPFCNS
{   "MAP",              S, xmap         },
{   "MAP-INTO",         S, xmapinto     },
{   "SOME",             S, xsome        },
{   "EVERY",            S, xevery       },
{   "NOTANY",           S, xnotany      },
{   "NOTEVERY",         S, xnotevery    },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
{   "REPLACE",		S, xreplace	},
{   "SYSTEM:TYPED-VECTOR-ELEMENT-SIZE",S, xtveceltsize	},
{   "FILE-POSITION",    S, xfileposition},
{   "FILE-LENGTH",      S, xfilelength  },
{   "FRESH-LINE",       S, xfreshline   },
{   "OPEN-STREAM-P",    S, xopenstreamp },
{   "INPUT-STREAM-P",   S, xinputstreamp},
{   "OUTPUT-STREAM-P",  S, xoutputstreamp},
#ifdef FILETABLE
{   "TRUENAME",         S, xtruename    },
{   "DELETE-FILE",      S, xdeletefile  },
{   "FILE-WRITE-DATE",  S, xfilemtime   },
{   "RENAME-FILE",      S, xrenamefile  },
{   "SYSTEM::BASE-DIRECTORY",S, xbasedir     },
{   "SYSTEM::FILE-TYPE",S, xfiletype    },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif
{   "DEFSTRUCT",        F, xdefstruct   },
{   "%STRUCT-TYPE-P",   S, xstrtypep    },
{   "%MAKE-STRUCT",     S, xmkstruct    },
{   "%COPY-STRUCT",     S, xcpystruct   },
{   "%STRUCT-REF",      S, xstrref      },
{   "%STRUCT-SET",      S, xstrset      },
{   "ASIN",             S, xasin        },
{   "ACOS",             S, xacos        },
{   "ATAN",             S, xatan        },
#ifdef APPLYHOOK
{   "APPLYHOOK",        SM, xapplyhook  },
#else
{   NULL,               S, xnotimp      },
#endif
{   "NREVERSE",         S, xnreverse    },
{   "BUTLAST",          S, xbutlast     },
{   "TYPEP",            S, xtypep       },
#ifdef REDUCE
{   "REDUCE",           S, xreduce      },
#else
{   NULL,               S, xnotimp      },
#endif
#ifdef REMDUPS
{   "REMOVE-DUPLICATES",S, xremove_duplicates },
{   "DELETE-DUPLICATES",S, xremove_duplicates },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif

#ifdef SETS
{   "ADJOIN",           S, xadjoin          },
{   "UNION",            S, xunion           },
{   "INTERSECTION",     S, xintersection    },
{   "SET-DIFFERENCE",   S, xset_difference  },
{   "SUBSETP",          S, xsubsetp         },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif

#ifdef HASHFCNS
{   "GETHASH",          SM, xgethash        },
{   "REMHASH",          S, xremhash         },
{   "MAKE-HASH-TABLE",  S, xmakehash        },
{   "CLRHASH",          S, xclrhash         },
{   "MAPHASH",          S, xmaphash         },
{   "HASH-TABLE-COUNT", S, xhashcount       },
{   "HASH-TABLE-P",     S, xhashtablep      },
{   "HASH-TABLE-TEST",  S, xhashtablefun    },
{   "HASH-TABLE-SIZE",  S, xhashtablesize   },
{   "HASH-TABLE-REHASH-THRESHOLD", S, xhashtablerhthresh },
{   "HASH-TABLE-REHASH-SIZE", S, xhashtablerhsize },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif

{   "COMPLEXP",         S, xcomplexp        },
{   "COMPLEX",          S, xcomplex         },
{   "CONJUGATE",        S, xconjugate       },
{   "REALPART",         S, xrealpart        },
{   "IMAGPART",         S, ximagpart        },
{   "LOG",              S, xlog             },
{   "FLOOR",            SM, xfloor          },
{   "CEILING",          SM, xceil           },
{   "ROUND",            SM, xround          },
{   "PHASE",            S, xphase           },
{   "LCM",              S, xlcm             },
{   "MOD",              S, xmod             },

#ifdef BIGNUMS
{   "FTRUNCATE",        S, xffix            },
{   "FFLOOR",           S, xffloor          },
{   "FCEILING",         S, xfceil           },
{   "FROUND",           S, xfround          },
{   "RATIONALP",        S, xrationalp       },
{   "NUMERATOR",        S, xnumerator       },
{   "DENOMINATOR",      S, xdenominator     },
{   "RATIONAL",         S, xrational        },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif

{   "DEFCONSTANT",      F, xdefconstant     },
{   "CONSTANTP",        S, xconstantp       },
{   "DEFPARAMETER",     F, xdefparameter    },
{   "DEFVAR",           F, xdefvar          },
{   "MAKUNBOUND",       S, xmakunbound      },
{   "FMAKUNBOUND",      S, xfmakunbound     },
{   "SPECIALP",         S, xspecialp        },
{   "MARK-AS-SPECIAL",  S, xmarkspecial     },
{   "MAKE-LIST",        S, xmklist          },
{   "FORCE-OUTPUT",     S, xforceoutput     },

{   "TOP-LEVEL-LOOP",   S, xtoplevelloop    },
{   "RESET-SYSTEM",     S, xresetsystem     },

#ifdef STSZ
{   "SET-STACK-MARK",   S, xsetmark     },
#else
{   NULL,               S, xnotimp      },
#endif

{   "ARRAY-IN-BOUNDS-P",     S, xarrayinboundsp     },
{   "ARRAY-DIMENSIONS",      S, xarraydimensions    },
{   "ARRAY-RANK",            S, xarrayrank          },
{   "ARRAY-TOTAL-SIZE",      S, xarraytotalsize     },
{   "ARRAY-DIMENSION",       S, xarraydimension     },
{   "ARRAY-ROW-MAJOR-INDEX", S, xarrayrowmajorindex },
{   "ROW-MAJOR-AREF",        S, xrowmajoraref       },
{   "ARRAY-ELEMENT-TYPE",    S, xarrayelementtype   },

#ifdef PACKAGES
{   "MAKE-PACKAGE",          S, xmakepackage        },
{   "IN-PACKAGE",            F, xinpackage          },
{   "EXPORT",                S, xexport             },
{   "UNEXPORT",              S, xunexport           },
{   "IMPORT",                S, ximport             },
{   "SYMBOL-PACKAGE",        S, xsympackage         },
{   "USE-PACKAGE",           S, xusepackage         },
{   "UNUSE-PACKAGE",         S, xunusepackage       },
{   "PACKAGE-USE-LIST",      S, xpackageuselist     },
{   "PACKAGE-USED-BY-LIST",  S, xpackageusedbylist  },
{   "PACKAGE-SHADOWING-SYMBOLS", S, xpackageshadows },
{   "PACKAGE-NAME",          S, xpackagename        },
{   "PACKAGE-NICKNAMES",     S, xpackagenicknames   },
{   "PACKAGE-OBARRAY",       S, xpackageobarray     },
{   "PACKAGE-VALID-P",       S, xpackagevalidp      },
{   "LIST-ALL-PACKAGES",     S, xlistallpackages    },
{   "UNINTERN",              S, xunintern           },
{   "SHADOW",                S, xshadow             },
{   "SHADOWING-IMPORT",      S, xshadowingimport    },
{   "FIND-PACKAGE",          S, xfindpackage        },
{   "FIND-SYMBOL",           SM, xfindsymbol        },
{   "DELETE-PACKAGE",        S, xdeletepackage      },
{   "RENAME-PACKAGE",        S, xrenamepackage      },
{   "FIND-ALL-SYMBOLS",      S, xfindallsymbols     },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif /* PACKAGES */
#ifdef MULVALS
{   "VALUES",                SM, xvalues            },
{   "MULTIPLE-VALUE-CALL",   FM, xmulvalcall        },
{   "MULTIPLE-VALUE-PROG1",  FM, xmulvalprog1       },
{   "NTH-VALUE",             F, xnthvalue           },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif /* MULVALUES */
{   "FUNCTIONP",        S, xfunctionp   },

{   "COPY-LIST",        S, xcopyseq     },
{   "COPY-SEQ",         S, xcopyseq     },
#ifdef CONDITIONS
{   "SIGNAL",           S, xsignal      },
{   "WARN",             S, xwarn        },
{   "INVOKE-DEBUGGER",  S, xdebug       },
{   "STACK-VALUE",      S, xstackval    },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif /* CONDITIONS */
#if (defined(TIMES) && defined(MULVALS) && defined(BIGNUMS))
{   "GET-DECODED-TIME", SM, xgetdectime },
#else
{   NULL,               S, xnotimp      },
#endif
{   "MAKE-STRING",      S, xmkstring    },
{   "MAKE-RANDOM-STATE",S, xmkrndstate  },
{   "RANDOM-STATE-P",   S, xrndstatep   },

#ifdef BYTECODE
{   "MAKE-BYTE-CODE",	S, xlmakebcode	},
{   "BYTE-CODE-CLOSE",	S, xlbcclose	},
{   "DYNAMIC-VALUE",	S, xldval	},
{   "GET-LAMBDA-NAME",	S, xlgetlambdaname},
{   "COERCE-TO-MACRO",	S, xlcoercemacro},
{   "MAKE-CPS-NODE",	S, xlmakecpsnode},
{   "CPS-NODE-INTERNAL",S, xlcpsinternal},
{   "CPS-NODE-TRANSFORM",S, xlcpstransform},
{   "CPS-LEAF-NODE-P",	S, xlcpsleafnodep},
{   "CPS-LAMBDA-NODE-P",S, xlcpslambdanodep},
{   "CPS-CALL-NODE-P",	S, xlcpscallnodep},
{   "CPS-ANY-REFERENCES-P",S, xlcpsanyrefs},
{   "CPS-FIND-REFERENCES",S, xlcpsfindrefs},
{   "CPS-NODE-CHILDREN",S, xlcpsnodechildren},
{   "CPS-NODE-PARENT",	S, xlcpsnodeparent},
{   "CPS-NODE-SIMPLIFIED-P",S, xlcpsnodesimplified},
{   "CPS-NODE-NOTE",	S, xlcpsnodenote},
{   "CPS-LEAF-NODE-VALUE",S, xlcpsleafnodevalue},
{   "CPS-LEAF-NODE-COUNT",S, xlcpsleafnodecount},
{   "CPS-LAMBDA-NODE-ARGLIST",S, xlcpslambdanodearglist},
{   "CPS-LAMBDA-NODE-LAMBDA-LIST",S, xlcpslambdanodelambdalist},
{   "CPS-LAMBDA-NODE-NAME",S, xlcpslambdanodename},
{   "CPS-SET-NODE-CHILDREN",	S, xlcpssetnodechildren		},
{   "CPS-SET-NODE-PARENT",		S, xlcpssetnodeparent		},
{   "CPS-SET-NODE-SIMPLIFIED",	S, xlcpssetnodesimplified	},
{   "CPS-SET-NODE-NOTE",		S, xlcpssetnodenote		},
{   "CPS-SET-LEAF-NODE-VALUE",	S, xlcpssetleafnodevalue	},
{   "CPS-SET-LEAF-NODE-COUNT",	S, xlcpssetleafnodecount	},
{   "CPS-SET-LAMBDA-NODE-ARGLIST",	S, xlcpssetlambdanodearglist	},
{   "CPS-SET-LAMBDA-NODE-LAMBDA-LIST",S, xlcpssetlambdanodelambdalist},
{   "CPS-SET-LAMBDA-NODE-NAME",	S, xlcpssetlambdanodename	},
{   "CPS-LAMBDA-NODE-BODY",		S, xlcpslambdanodebody		},
{   "CPS-CALL-NODE-FUNCTION",	S, xlcpscallnodefunction	},
{   "CPS-CALL-NODE-ARGS",		S, xlcpscallnodeargs		},
{   "%SET-GET",         S, xsetget      },
{   "%SET-SYMBOL-VALUE", S, xsetsymval   },
{   "%SET-SYMBOL-FUNCTION", S, xsetsymfun },
{   "%SET-SYMBOL-PLIST", S, xsetsymplist },
{   "%SET-AREF",        S, xsetaref     },
{   "%SET-GETHASH",     S, xsetgethash  },
{   "%SET-CAR",     S, xsetcar  },
{   "%SET-CDR",     S, xsetcdr  },
{   "%SET-NTH",     S, xsetnth  },
{   "%SET-ELT",     S, xsetelt  },
{   "%SET-SVREF",     S, xsetsvref  },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif /* BYTECODE */

{	"GET-WORKING-DIRECTORY",	S, xgetwd			},
{	"SET-WORKING-DIRECTORY",	S, xsetwd			},

#ifdef SHAREDLIBS
{   "SHARED-LIBRARY::SHLIB-OPEN",               S, xshlibopen      },
{   "SHARED-LIBRARY::SHLIB-SYMADDR",            S, xshlibsymaddr   },
{   "SHARED-LIBRARY::SHLIB-CLOSE",              S, xshlibclose     },
{   "SHARED-LIBRARY::CALL-BY-ADDRESS",          S, xshlibcalladdr  },
#ifdef _Windows
{   "SHARED-LIBRARY::STDCALL-BY-ADDRESS",       S, xshlibstdcalladdr},
#else
{   NULL,                                       S, xnotimp         },
#endif
{   "ARRAY-DATA-ADDRESS",                       S, xarraydata_addr },
{   "SHARED-LIBRARY::MAKE-SUBR",                S, xmakesubr       },
{   "SHARED-LIBRARY::CLEAR-SUBR",               S, xclearsubr      },
{   "SHARED-LIBRARY::SHLIB-INIT",               S, xshlibinit      },
{   "SHARED-LIBRARY::SHLIB-INFO",               S, xshlibinfo      },
{   "SYSTEM:CPTR-PROTECT",                      S, xcptrprotect    },
#else
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
#endif /* SHAREDLIBS */

{   "LOCALLY",          FM, xprogn      },
{   "THE",              FM, xthe        },
{   "SYMBOL-MACROLET",  FM, xsymaclet   },
{   "XLISP::INSTALL-FUNCTION", S, xinstallfun},

	/* extra table entries */
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },
{   NULL,               S, xnotimp      },

    /* include system dependent function pointers */
#include "osptrs.h"
    /* Two patches here to promote module portability to xscheme:*/
    /* $putpatch.c$: "MODULE_XLFTAB_C_FUNTAB_S" */
    /* $putpatch.c$: "MODULE_XLFTAB_C_FUNTAB_F" */
{0,0,0} /* end of table marker */

};			

int ftabsize = sizeof(funtab); /* TAA MOD -- added validity check */


syntax highlighted by Code2HTML, v. 0.9.1