int fpecatch(); progname = argv[0]; init(); setjmp(begin); signal(SIGFPE, fpecatch); for (initcode(); yyparse(); initcode()) execute(prog); return 0;}warning(s, t) char *s, *t;{ fprintf(stderr, "%s: %s", progname, s); if (t && *t) fprintf(stderr, " %s", t); fprintf(stderr, " near line %d\n", lineno); while (c != '\n' && с != EOF) c = getchar(); /* flush rest of input line */ fseek(stdin, 0L, 2); /* flush rest of file */ longjmp(begin, 0);}3.6.6
init.c#include "hoc.h"#include "y.tab.h"#include <math.h>extern double Log(), Log10(), Sqrt(), Exp(), integer();static struct { /* Keywords */ char *name; int kval;} keywords[] = { "if", IF, "else", ELSE, "while", WHILE, "print", PRINT, 0, 0,};static struct { /* Constants */ char *name; double eval;} consts[] = { "PI", 3.14159265358979323846, "E", 2.71828182845904523536, "GAMMA", 0.57721566490153286060, /* Euler */ "DEG", 57.29577951308232087680, /* deg/radian */ "PHI", 1.61803398874989484820, /* golden ratio */ 0, 0};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, "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; keywords[i].name; i++) install(keywords[i].name, keywords[i].kval, 0.0); 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.6.7
makefileYFLAGS = -dOBJS = hoc.o code.o init.o math.o symbol.ohoc5: $(OBJS) cc $(OBJS) -lm -o hoc5hoc.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.6.8
math.c#include <math.h>#include <errno.h>extern int errno;double errcheck();double Log(x) double x;{ return errcheck(log(x), "log");