}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.6.9
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 */}Symbol *install(s, t, d) /* install s in symbol table */ char *s; int t; double d;{ Symbol *sp; char *emalloc(); sp = (Symbol*)emalloc(sizeof(Symbol)); sp->name = emalloc(strlen(s)+1); /* +1 for '\0' */ strcpy(sp->name, s); sp->type = t; sp->u.val = d; sp->next = symlist; /* put at front of list */ symlist = sp; return sp;}char *emalloc(n) /* check return from malloc */ unsigned n;{ char *p, *malloc(); p = malloc(n); if (p == 0) execerror("out of memory", (char*)0); return p;}3.7
hoc63.7.1
ackfunc ack() { n = n+1 if ($1 == 0) return ($2+1) if ($2 == 0) return (ack($1 - 1, 1)) return (ack($1 - 1, ack($1, $2 - 1)))}n=0ack(3,3)print n, "calls\n"3.7.2
ack1func ack() { n = n+1 if ($1 == 0) return ($2+1) if ($2 == 0) return (ack($1 - 1, 1)) return (ack($1 - 1, ack($1, $2 - 1)))}n=0while (read(x)) { read(y) print ack(x,y), "\n"}print n,"\n"3.7.3
code.c#include "hoc.h"#include "y.tab.h"#include <stdio.h>#define NSTACK 256static Datum stack[NSTACK]; /* the stack */static Datum *stackp; /* next free spot on stack */