static struct { /* Built-ins */ char *name; double (*func)();} builtins [] = { "sin", sin, "cos", cos, "atan", atan, "log", Log, /* checks argument */ "log10", Log10, /* checks argument */ "exp", Exp, /* checks argument */ "sqrt", Sqrt, /* checks argument */ "int", integer, "abs", fabs, 0, 0};init() /* install constants and built-ins in table */{ int i; Symbol *s; for (i = 0; consts[i].name; i++) install(consts[i].name, VAR, consts[i].eval); for (i = 0; builtins[i].name; i++) { s = install(builtins[i].name, BLTIN, 0.0); s->u.ptr = builtins[i].func; }}3.5.5.
makefileYFLAGS = -dOBJS = hoc.o code.o init.o math.o symbol.ohoc4: $(OBJS) cc $(OBJS) -lm -o hoc4hoc.o code.o init.o symbol.o: hoc.hcode.o init.o symbol.o: x.tab.hx.tab.h: y.tab.h -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.hpr: hoc.y hoc.h code.c init.c math.c symbol.c @pr $? @touch prclean: rm -f $(OBJS) [xy].tab.[ch]3.5.6.
math.c#include <math.h>#include <errno.h>extern int errno;double errcheck();double Log(x) double x;{ return errcheck(log(x), "log");}double Log10(x) double x;{ return errcheck(log10(x), "log10");}double Sqrt(x) double x;{ return errcheck(sqrt(x), "sqrt");}double Exp(x) double x;{ return errcheck(exp(x), "exp");}double Pow(x, y) double x, y;{ return errcheck(pow(x,y), "exponentiation");}double integer(x) double x;{ return (double)(long)x;}double errcheck(d, s) /* check result of library call */ double d; char *s;{ if (errno == EDOM) { errno = 0; execerror(s, "argument out of domain"); } else if (errno == ERANGE) { errno = 0; execerror(s, "result out of range"); } return d;}3.5.7
symbol.c#include "hoc.h"#include "y.tab.h"static Symbol *symlist = 0; /* symbol table: linked list */Symbol *lookup(s) /* find s in symbol table */ char *s;{ Symbol *sp; for (sp = symlist; sp != (Symbol*)0; sp = sp->next) if (strcmp(sp->name, s) == 0) return sp; return 0; /* 0 ==> not found */}