add hoc
diff --git a/src/cmd/hoc/hoc.h b/src/cmd/hoc/hoc.h
new file mode 100644
index 0000000..3cdc18a
--- /dev/null
+++ b/src/cmd/hoc/hoc.h
@@ -0,0 +1,83 @@
+typedef void (*Inst)(void);
+#define	STOP	(Inst) 0
+
+typedef struct Symbol	Symbol;
+typedef union Datum 	Datum;
+typedef struct Formal	Formal;
+typedef struct Saveval	Saveval;
+typedef struct Fndefn	Fndefn;
+typedef union Symval	Symval;
+
+union Symval { /* value of a symbol */
+	double	val;		/* VAR */
+	double	(*ptr)(double);	/* BLTIN */
+	Fndefn	*defn;		/* FUNCTION, PROCEDURE */
+	char	*str;		/* STRING */
+};
+
+struct Symbol {	/* symbol table entry */
+	char	*name;
+	long	type;
+	Symval u;
+	struct Symbol	*next;	/* to link to another */
+};
+Symbol	*install(char*, int, double), *lookup(char*);
+
+union Datum {	/* interpreter stack type */
+	double	val;
+	Symbol	*sym;
+};
+
+struct Saveval {	/* saved value of variable */
+	Symval	val;
+	long		type;
+	Saveval	*next;
+};
+
+struct Formal {	/* formal parameter */
+	Symbol	*sym;
+	Saveval	*save;
+	Formal	*next;
+};
+
+struct Fndefn {	/* formal parameter */
+	Inst	*code;
+	Formal	*formals;
+	int	nargs;
+};
+
+extern	Formal *formallist(Symbol*, Formal*);
+extern	double Fgetd(int);
+extern	int moreinput(void);
+extern	void restore(Symbol*);
+extern	void restoreall(void);
+extern	void execerror(char*, char*);
+extern	void define(Symbol*, Formal*), verify(Symbol*);
+extern	Datum pop(void);
+extern	void initcode(void), push(Datum), xpop(void), constpush(void);
+extern	void varpush(void);
+#define div hocdiv
+extern	void eval(void), add(void), sub(void), mul(void), div(void), mod(void);
+extern	void negate(void), power(void);
+extern	void addeq(void), subeq(void), muleq(void), diveq(void), modeq(void);
+
+extern	Inst *progp, *progbase, prog[], *code(Inst);
+extern	void assign(void), bltin(void), varread(void);
+extern	void prexpr(void), prstr(void);
+extern	void gt(void), lt(void), eq(void), ge(void), le(void), ne(void);
+extern	void and(void), or(void), not(void);
+extern	void ifcode(void), whilecode(void), forcode(void);
+extern	void call(void), arg(void), argassign(void);
+extern	void funcret(void), procret(void);
+extern	void preinc(void), predec(void), postinc(void), postdec(void);
+extern	void execute(Inst*);
+extern	void printtop(void);
+
+extern double	Log(double), Log10(double), Gamma(double), Sqrt(double), Exp(double);
+extern double	Asin(double), Acos(double), Sinh(double), Cosh(double), integer(double);
+extern double	Pow(double, double);
+
+extern	void init(void);
+extern	int yyparse(void);
+extern	void execerror(char*, char*);
+extern	void *emalloc(unsigned);