summaryrefslogtreecommitdiff
path: root/eqn
diff options
context:
space:
mode:
Diffstat (limited to 'eqn')
-rw-r--r--eqn/checkeq.d/Makefile.mk23
-rw-r--r--eqn/checkeq.d/checkeq.c148
-rw-r--r--eqn/diacrit.c128
-rw-r--r--eqn/e.h184
-rw-r--r--eqn/e.y215
-rw-r--r--eqn/eqn.d/Makefile.mk56
-rw-r--r--eqn/eqn.d/eqn.1332
-rw-r--r--eqn/eqn.d/eqnchar.7212
-rw-r--r--eqn/eqnbox.c68
-rw-r--r--eqn/eqnchar.d/Makefile.mk28
-rw-r--r--eqn/eqnchar.d/ascii34
-rw-r--r--eqn/eqnchar.d/eqnchar90
-rw-r--r--eqn/eqnchar.d/genutf8.c89
-rw-r--r--eqn/eqnchar.d/greek11
-rw-r--r--eqn/eqnchar.d/iso29
-rw-r--r--eqn/font.c99
-rw-r--r--eqn/fromto.c103
-rw-r--r--eqn/funny.c64
-rw-r--r--eqn/glob.c57
-rw-r--r--eqn/integral.c74
-rw-r--r--eqn/io.c322
-rw-r--r--eqn/lex.c308
-rw-r--r--eqn/lookup.c261
-rw-r--r--eqn/mark.c49
-rw-r--r--eqn/matrix.c108
-rw-r--r--eqn/move.c70
-rw-r--r--eqn/neqn.d/Makefile.mk53
-rw-r--r--eqn/over.c84
-rw-r--r--eqn/paren.c172
-rw-r--r--eqn/pile.c137
-rw-r--r--eqn/shift.c204
-rw-r--r--eqn/size.c107
-rw-r--r--eqn/sqrt.c62
-rw-r--r--eqn/text.c234
-rw-r--r--eqn/version.c37
-rw-r--r--eqn/yyval.sed22
36 files changed, 4274 insertions, 0 deletions
diff --git a/eqn/checkeq.d/Makefile.mk b/eqn/checkeq.d/Makefile.mk
new file mode 100644
index 0000000000000..5e13d2021debb
--- /dev/null
+++ b/eqn/checkeq.d/Makefile.mk
@@ -0,0 +1,23 @@
+VPATH=..
+OBJ = checkeq.o
+
+FLAGS =
+
+.c.o:
+ $(CC) $(CFLAGS) $(WARN) $(CPPFLAGS) $(FLAGS) -c $<
+
+all: checkeq
+
+checkeq: $(OBJ)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(LIBS) -o checkeq
+
+install:
+ $(INSTALL) -c checkeq $(ROOT)$(BINDIR)/checkeq
+ $(STRIP) $(ROOT)$(BINDIR)/checkeq
+ rm -f $(ROOT)$(MANDIR)/man1/checkeq.1
+ ln -s eqn.1 $(ROOT)$(MANDIR)/man1/checkeq.1
+
+clean:
+ rm -f $(OBJ) checkeq core log *~
+
+mrproper: clean
diff --git a/eqn/checkeq.d/checkeq.c b/eqn/checkeq.d/checkeq.c
new file mode 100644
index 0000000000000..e925a17b0dfdf
--- /dev/null
+++ b/eqn/checkeq.d/checkeq.c
@@ -0,0 +1,148 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* from OpenSolaris "checkeq.c 1.6 05/06/02 SMI" */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ */
+#if __GNUC__ >= 3 && __GNUC_MINOR__ >= 4 || __GNUC__ >= 4
+#define USED __attribute__ ((used))
+#elif defined __GNUC__
+#define USED __attribute__ ((unused))
+#else
+#define USED
+#endif
+static const char sccsid[] USED = "@(#)/usr/ucb/checkeq.sl 4.1 (gritter) 9/15/05";
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static void check(FILE *);
+static char *fgetline(char **, size_t *, FILE *);
+
+static FILE *fin;
+static int delim = '$';
+
+int
+main(int argc, char **argv)
+{
+ if (argc <= 1)
+ check(stdin);
+ else
+ while (--argc > 0) {
+ if ((fin = fopen(*++argv, "r")) == NULL) {
+ perror(*argv);
+ exit(1);
+ }
+ printf("%s:\n", *argv);
+ check(fin);
+ fclose(fin);
+ }
+ return (0);
+}
+
+static void
+check(FILE *f)
+{
+ int start, line, eq, ndel, totdel;
+ char *in = NULL, *p;
+ size_t insize = 0;
+
+ start = eq = line = ndel = totdel = 0;
+ while (fgetline(&in, &insize, f) != NULL) {
+ line++;
+ ndel = 0;
+ for (p = in; *p; p++)
+ if (*p == delim)
+ ndel++;
+ if (*in == '.' && *(in+1) == 'E' && *(in+2) == 'Q') {
+ if (eq++)
+ printf(" Spurious EQ, line %d\n", line);
+ if (totdel)
+ printf(" EQ in %c%c, line %d\n",
+ delim, delim, line);
+ } else if (*in == '.' && *(in+1) == 'E' && *(in+2) == 'N') {
+ if (eq == 0)
+ printf(" Spurious EN, line %d\n", line);
+ else
+ eq = 0;
+ if (totdel > 0)
+ printf(" EN in %c%c, line %d\n",
+ delim, delim, line);
+ start = 0;
+ } else if (eq && *in == 'd' && *(in+1) == 'e' &&
+ *(in+2) == 'l' && *(in+3) == 'i' && *(in+4) == 'm') {
+ for (p = in+5; *p; p++)
+ if (*p != ' ') {
+ if (*p == 'o' && *(p+1) == 'f')
+ delim = 0;
+ else
+ delim = *p;
+ break;
+ }
+ if (delim == 0)
+ printf(" Delim off, line %d\n", line);
+ else
+ printf(" New delims %c%c, line %d\n",
+ delim, delim, line);
+ }
+ if (ndel > 0 && eq > 0)
+ printf(" %c%c in EQ, line %d\n", delim,
+ delim, line);
+ if (ndel == 0)
+ continue;
+ totdel += ndel;
+ if (totdel%2) {
+ if (start == 0)
+ start = line;
+ else {
+ printf(" %d line %c%c, lines %d-%d\n",
+ line-start+1, delim, delim, start, line);
+ start = line;
+ }
+ } else {
+ if (start > 0) {
+ printf(" %d line %c%c, lines %d-%d\n",
+ line-start+1, delim, delim, start, line);
+ start = 0;
+ }
+ totdel = 0;
+ }
+ }
+ if (totdel)
+ printf(" Unfinished %c%c\n", delim, delim);
+ if (eq)
+ printf(" Unfinished EQ\n");
+}
+
+static char *
+fgetline(char **lp, size_t *zp, FILE *fp)
+{
+ size_t n = 0;
+ int c;
+
+ while ((c = getc(fp)) != EOF) {
+ if (n >= *zp)
+ *lp = realloc(*lp, *zp += 600);
+ (*lp)[n++] = c;
+ if (c == '\n')
+ break;
+ }
+ if (n >= *zp)
+ *lp = realloc(*lp, *zp += 600);
+ (*lp)[n] = 0;
+ return c != EOF ? *lp : NULL;
+}
diff --git a/eqn/diacrit.c b/eqn/diacrit.c
new file mode 100644
index 0000000000000..07d0e17594673
--- /dev/null
+++ b/eqn/diacrit.c
@@ -0,0 +1,128 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "diacrit.c 1.6 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)diacrit.c 1.7 (gritter) 1/13/08
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+void
+diacrit(int p1, int type) {
+ int c, t;
+#ifndef NEQN
+ float effps;
+#endif /* NEQN */
+
+ c = oalloc();
+ t = oalloc();
+#ifdef NEQN
+ nrwid(p1, ps, p1);
+ printf(".nr 10 %gu\n", max(eht[p1]-ebase[p1]-VERT(2),0));
+#else /* NEQN */
+ effps = EFFPS(ps);
+ nrwid(p1, effps, p1);
+ printf(".nr 10 %gp\n", VERT(max(eht[p1]-ebase[p1]-EM(1,ps),0))); /* vertical shift if high */
+ printf(".if \\n(ct>1 .nr 10 \\n(10+\\s%s.25m\\s0\n", tsize(effps));
+ if (type != HAT && type != TILDE) {
+ printf(".nr %d \\s%s.1m\\s0\n", t, tsize(effps)); /* horiz shift if high */
+ printf(".if \\n(ct>1 .nr %d \\s%s.15m\\s0\n", t, tsize(effps));
+ } else
+ printf(".nr %d 0\n", t);
+#endif /* NEQN */
+ switch(type) {
+ case VEC: /* vec */
+#ifndef NEQN
+ printf(".ds %d \\v'-.4m'\\s%s\\(->\\s0\\v'.4m'\n",
+ c, tsize(max(effps-3, 6)));
+ break;
+#endif /* NEQN */
+ case DYAD: /* dyad */
+#ifdef NEQN
+ printf(".ds %d \\v'-12p'_\\v'12p'\n", c);
+#else /* !NEQN */
+ printf(".ds %d \\v'-.4m'\\s%s\\z\\(<-\\(->\\s0\\v'.4m'\n",
+ c, tsize(max(effps-3, 6)));
+#endif /* !NEQN */
+ break;
+ case HAT:
+ printf(".ds %d ^\n", c);
+ break;
+ case TILDE:
+ printf(".ds %d ~\n", c);
+ break;
+ case DOT:
+#ifndef NEQN
+ printf(".ds %d \\s%s\\v'-.67m'.\\v'.67m'\\s0\n", c, tsize(effps));
+#else /* NEQN */
+ printf(".ds %d \\v'-12p'.\\v'12p'\n", c);
+#endif /* NEQN */
+ break;
+ case DOTDOT:
+#ifndef NEQN
+ printf(".ds %d \\s%s\\v'-.67m'..\\v'.67m\\s0'\n", c, tsize(effps));
+#else /* NEQN */
+ printf(".ds %d \\v'-12p'..\\v'12p'\n", c);
+#endif /* NEQN */
+ break;
+ case BAR:
+#ifndef NEQN
+ printf(".ds %d \\s%s\\v'.28m'\\h'.05m'\\l'\\n(%du-.1m\\(rn'\\h'.05m'\\v'-.28m'\\s0\n",
+ c, tsize(effps), p1);
+#else /* NEQN */
+ printf(".ds %d \\v'-12p'\\l'\\n(%du'\\v'12p'\n",
+ c, p1);
+#endif /* NEQN */
+ break;
+ case UNDER:
+#ifndef NEQN
+ printf(".ds %d \\l'\\n(%du\\(ul'\n", c, p1);
+ printf(".nr %d 0\n", t);
+ printf(".nr 10 0-%gp\n", ebase[p1]);
+#else /* NEQN */
+ printf(".ds %d \\l'\\n(%du'\n", c, p1);
+#endif /* NEQN */
+ break;
+ }
+ nrwid(c, ps, c);
+#ifndef NEQN
+ if (!ital(lfont[p1]))
+ printf(".nr %d 0\n", t);
+ printf(".as %d \\h'-\\n(%du-\\n(%du/2u+\\n(%du'\\v'0-\\n(10u'\\*(%d",
+ p1, p1, c, t, c);
+ printf("\\v'\\n(10u'\\h'-\\n(%du+\\n(%du/2u-\\n(%du'\n", c, p1, t);
+ /* BUG - should go to right end of widest */
+#else /* NEQN */
+ printf(".as %d \\h'-\\n(%du-\\n(%du/2u'\\v'0-\\n(10u'\\*(%d",
+ p1, p1, c, c);
+ printf("\\v'\\n(10u'\\h'-\\n(%du+\\n(%du/2u'\n", c, p1);
+#endif /* NEQN */
+#ifndef NEQN
+ if (type != UNDER)
+ eht[p1] += VERT(EM(0.15, ps)); /* 0.15m */
+ if(dbg)printf(".\tdiacrit: %c over S%d, lf=%c, rf=%c, h=%g,b=%g\n",
+ type, p1, lfont[p1], rfont[p1], eht[p1], ebase[p1]);
+#else /* NEQN */
+ if (type != UNDER)
+ eht[p1] += VERT(1);
+ if (dbg) printf(".\tdiacrit: %c over S%d, h=%d, b=%d\n", type, p1, eht[p1], ebase[p1]);
+#endif /* NEQN */
+ ofree(c); ofree(t);
+}
diff --git a/eqn/e.h b/eqn/e.h
new file mode 100644
index 0000000000000..6c699fbe646d4
--- /dev/null
+++ b/eqn/e.h
@@ -0,0 +1,184 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from "e.h 1.5 05/06/02 SMI" "ucbeqn:e.h 1.1" */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)e.h 1.13 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include <stdio.h>
+#include <inttypes.h>
+#include "global.h"
+
+#if defined (__GLIBC__) && defined (_IO_getc_unlocked)
+#undef getc
+#define getc(f) _IO_getc_unlocked(f)
+#endif
+
+#define FATAL 1
+#define ROM '1'
+#ifndef NEQN
+#define ITAL '2'
+#define BLD '3'
+#else /* NEQN */
+#define ITAL '1'
+#define BLD '1'
+#endif /* NEQN */
+
+#define rom(c) (((c) & 0177) == ROM)
+#define ital(c) (((c) & 0177) == ITAL)
+#define bld(c) (((c) & 0177) == BLD)
+
+#define OP 0200
+#define op(c) ((c) & OP)
+
+#ifndef NEQN
+#define VERT(n) (n)
+#define POINT 72
+#define EM(m, ps) ((((float)(m)*(ps) * resolution) / POINT))
+#else /* NEQN */
+#define VERT(n) (20 * (n))
+#endif /* NEQN */
+#define EFFPS(p) ((p) >= 6 ? (p) : 6)
+
+extern int dbg;
+extern int ct;
+extern int lp[];
+extern int used[]; /* available registers */
+extern float ps; /* dflt init pt size */
+#define resolution 72 /* was: resolution of ditroff */
+extern float deltaps; /* default change in ps */
+extern float gsize; /* global size */
+extern int gfont; /* global font */
+extern int ft; /* dflt font */
+extern FILE *curfile; /* current input file */
+extern int ifile; /* input file number */
+extern int linect; /* line number in current file */
+extern int eqline; /* line where eqn started */
+extern int svargc;
+extern char **svargv;
+#ifndef NEQN
+extern float eht[100];
+extern float ebase[100];
+#else /* NEQN */
+extern int eht[100];
+extern int ebase[100];
+#endif /* NEQN */
+extern int lfont[100];
+extern int rfont[100];
+extern int eqnreg, eqnht;
+extern int lefteq, righteq;
+extern int lastchar; /* last character read by lex */
+extern int markline; /* 1 if this EQ/EN contains mark or lineup */
+extern char *progname;
+
+typedef struct s_tbl {
+ char *name;
+ char *defn;
+ struct s_tbl *next;
+} tbl;
+extern char *spaceval; /* use in place of normal \x (for pic) */
+
+/* diacrit.c */
+void diacrit(int, int);
+/* e.c */
+int yyparse(void);
+/* eqnbox.c */
+void eqnbox(int, int, int);
+/* font.c */
+void setfont(char);
+void font(int, int);
+void fatbox(int);
+void globfont(void);
+/* fromto.c */
+void fromto(int, int, int);
+/* funny.c */
+void funny(int);
+/* glob.c */
+/* integral.c */
+void integral(int, int, int);
+void setintegral(void);
+/* io.c */
+int main(int, char **);
+void eqnexit(int);
+int eqn(int, char **);
+#define getline(s, n) eqngetline(s, n)
+int getline(char **, size_t *);
+void do_inline(void);
+void putout(int);
+float max(float, float);
+int oalloc(void);
+void ofree(int);
+void setps(float);
+void nrwid(int, float, int);
+void setfile(int, char **);
+void yyerror(char *);
+void init(void);
+void error(int, const char *, ...);
+/* lex.c */
+int gtc(void);
+int openinfile(void);
+void pbstr(register char *);
+int yylex(void);
+int getstr(char *, register int);
+int cstr(char *, int, int);
+void define(int);
+void space(void);
+char *strsave(char *);
+void include(void);
+void delim(void);
+/* lookup.c */
+tbl *lookup(tbl **, char *, char *);
+void init_tbl(void);
+/* mark.c */
+void mark(int);
+void lineup(int);
+/* matrix.c */
+void column(int, int);
+void matrix(int);
+/* move.c */
+void move(int, int, int);
+/* over.c */
+void boverb(int, int);
+/* paren.c */
+void paren(int, int, int);
+void brack(int, char *, char *, char *);
+/* pile.c */
+void lpile(int, int, int);
+/* shift.c */
+void bshiftb(int, int, int);
+void shift(int);
+void shift2(int, int, int);
+/* size.c */
+void setsize(char *);
+void size(float, int);
+void globsize(void);
+char *tsize(float);
+/* sqrt.c */
+#define sqrt(n) eqnsqrt(n)
+void sqrt(int);
+/* text.c */
+void text(int, char *);
+int trans(int, char *);
+void shim(int);
+void roman(int);
+void name4(int, int);
diff --git a/eqn/e.y b/eqn/e.y
new file mode 100644
index 0000000000000..a28a3ee53a8eb
--- /dev/null
+++ b/eqn/e.y
@@ -0,0 +1,215 @@
+%{
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+%}
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+%{#
+/* from "e.y 1.6 05/06/10 SMI" "ucbeqn:e.y 1.1" */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)e.y 1.7 (gritter) 10/2/07
+ */
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+#include "e.h"
+#include <stdlib.h>
+#include <inttypes.h>
+
+int fromflg;
+
+#define __YYSCLASS /* to get external access to yyval with HP-UX yacc */
+%}
+%union {
+ int token;
+ char *str;
+}
+%token <str> CONTIG QTEXT SPACE THIN TAB
+%token <token> MATRIX LCOL CCOL RCOL COL
+%token <token> MARK LINEUP
+%token <token> SUM INT PROD UNION INTER
+%token <token> LPILE PILE CPILE RPILE ABOVE
+%token <token> DEFINE TDEFINE NDEFINE DELIM GSIZE GFONT INCLUDE
+%type <str> text
+%type <token> eqn box lineupbox matrix lcol ccol rcol col sbox tbox size font
+%type <token> lpile cpile rpile pile sub sup int left right diacrit fwd up back
+%type <token> down from to pbox
+%right FROM TO
+%left OVER SQRT
+%right SUP SUB
+%right SIZE FONT ROMAN ITALIC BOLD FAT
+%right UP DOWN BACK FWD
+%left LEFT RIGHT
+%right DOT DOTDOT HAT TILDE BAR UNDER VEC DYAD
+
+%%
+
+stuff : eqn { putout($1); }
+ | error { error(!FATAL, "syntax error"); }
+ | { eqnreg = 0; }
+ ;
+
+eqn : box
+ | eqn box { eqnbox($1, $2, 0); }
+ | eqn lineupbox { eqnbox($1, $2, 1); }
+ | LINEUP { lineup(0); }
+ ;
+
+lineupbox: LINEUP box { $$ = $2; lineup(1); }
+ ;
+
+matrix : MATRIX { $$ = ct; } ;
+
+collist : column
+ | collist column
+ ;
+
+column : lcol '{' list '}' { column('L', $1); }
+ | ccol '{' list '}' { column('C', $1); }
+ | rcol '{' list '}' { column('R', $1); }
+ | col '{' list '}' { column('-', $1); }
+ ;
+
+lcol : LCOL { $$ = ct++; } ;
+ccol : CCOL { $$ = ct++; } ;
+rcol : RCOL { $$ = ct++; } ;
+col : COL { $$ = ct++; } ;
+
+sbox : sup box %prec SUP { $$ = $2; }
+ ;
+
+tbox : to box %prec TO { $$ = $2; }
+ | %prec FROM { $$ = 0; }
+ ;
+
+box : box OVER box { boverb($1, $3); }
+ | MARK box { mark($2); }
+ | size box %prec SIZE { size($1, $2); }
+ | font box %prec FONT { font($1, $2); }
+ | FAT box { fatbox($2); }
+ | SQRT box { sqrt($2); }
+ | lpile '{' list '}' { lpile('L', $1, ct); ct = $1; }
+ | cpile '{' list '}' { lpile('C', $1, ct); ct = $1; }
+ | rpile '{' list '}' { lpile('R', $1, ct); ct = $1; }
+ | pile '{' list '}' { lpile('-', $1, ct); ct = $1; }
+ | box sub box sbox %prec SUB { shift2($1, $3, $4); }
+ | box sub box %prec SUB { bshiftb($1, $2, $3); }
+ | box sup box %prec SUP { bshiftb($1, $2, $3); }
+ | int sub box sbox %prec SUB { integral($1, $3, $4); }
+ | int sub box %prec SUB { integral($1, $3, 0); }
+ | int sup box %prec SUP { integral($1, 0, $3); }
+ | int { integral($1, 0, 0); }
+ | left eqn right { paren($1, $2, $3); }
+ | pbox
+ | box from box tbox %prec FROM { fromto($1, $3, $4); fromflg=0; }
+ | box to box %prec TO { fromto($1, 0, $3); }
+ | box diacrit { diacrit($1, $2); }
+ | fwd box %prec UP { move(FWD, $1, $2); }
+ | up box %prec UP { move(UP, $1, $2); }
+ | back box %prec UP { move(BACK, $1, $2); }
+ | down box %prec UP { move(DOWN, $1, $2); }
+ | matrix '{' collist '}' { matrix($1); }
+ ;
+
+int : INT { setintegral(); }
+ ;
+
+fwd : FWD text { $$ = atoi((char *) $2); } ;
+up : UP text { $$ = atoi((char *) $2); } ;
+back : BACK text { $$ = atoi((char *) $2); } ;
+down : DOWN text { $$ = atoi((char *) $2); } ;
+
+diacrit : HAT { $$ = HAT; }
+ | VEC { $$ = VEC; }
+ | DYAD { $$ = DYAD; }
+ | BAR { $$ = BAR; }
+ | UNDER { $$ = UNDER; } /* under bar */
+ | DOT { $$ = DOT; }
+ | TILDE { $$ = TILDE; }
+ | DOTDOT { $$ = DOTDOT; } /* umlaut = double dot */
+ ;
+
+from : FROM { $$=ps; ps -= 3; fromflg = 1;
+ if(dbg)printf(".\tfrom: old ps %d, new ps %g, fflg %d\n", $$, ps, fromflg);
+ }
+ ;
+
+to : TO { $$=ps; if(fromflg==0)ps -= 3;
+ if(dbg)printf(".\tto: old ps %d, new ps %g\n", $$, ps);
+ }
+ ;
+
+left : LEFT text { $$ = ((char *)$2)[0]; }
+ | LEFT '{' { $$ = '{'; }
+ ;
+
+right : RIGHT text { $$ = ((char *)$2)[0]; }
+ | RIGHT '}' { $$ = '}'; }
+ | { $$ = 0; }
+ ;
+
+list : eqn { lp[ct++] = $1; }
+ | list ABOVE eqn { lp[ct++] = $3; }
+ ;
+
+lpile : LPILE { $$ = ct; } ;
+cpile : CPILE { $$ = ct; } ;
+pile : PILE { $$ = ct; } ;
+rpile : RPILE { $$ = ct; } ;
+
+size : SIZE text { $$ = ps; setsize((char *) $2); }
+ ;
+
+font : ROMAN { setfont(ROM); }
+ | ITALIC { setfont(ITAL); }
+ | BOLD { setfont(BLD); }
+ | FONT text { setfont(((char *)$2)[0]); }
+ ;
+
+sub : SUB { shift(SUB); }
+ ;
+
+sup : SUP { shift(SUP); }
+ ;
+
+pbox : '{' eqn '}' { $$ = $2; }
+ | QTEXT { text(QTEXT, (char *) $1); }
+ | CONTIG { text(CONTIG, (char *) $1); }
+ | SPACE { text(SPACE, 0); }
+ | THIN { text(THIN, 0); }
+ | TAB { text(TAB, 0); }
+ | SUM { funny(SUM); }
+ | PROD { funny(PROD); }
+ | UNION { funny(UNION); }
+ | INTER { funny(INTER); } /* intersection */
+ ;
+
+text : CONTIG
+ | QTEXT
+ ;
+
+%%
diff --git a/eqn/eqn.d/Makefile.mk b/eqn/eqn.d/Makefile.mk
new file mode 100644
index 0000000000000..d6e573ce1344f
--- /dev/null
+++ b/eqn/eqn.d/Makefile.mk
@@ -0,0 +1,56 @@
+VPATH=..
+OBJ = diacrit.o e.o eqnbox.o font.o fromto.o funny.o glob.o integral.o \
+ io.o lex.o lookup.o mark.o matrix.o move.o over.o paren.o pile.o \
+ shift.o size.o sqrt.o text.o version.o
+
+FLAGS = -I. -I.. -I../../include $(DEFINES)
+
+.c.o:
+ $(CC) $(CFLAGS) $(WARN) $(CPPFLAGS) $(FLAGS) -c $<
+
+all: eqn
+
+eqn: $(OBJ)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(LIBS) -o eqn
+
+e.c: e.y
+ $(YACC) -d ../e.y
+ sed -f ../yyval.sed <y.tab.c >$@
+
+y.tab.h: e.c
+
+install:
+ test -d $(ROOT)$(BINDIR) || mkdir -p $(ROOT)$(BINDIR)
+ $(INSTALL) -c eqn $(ROOT)$(BINDIR)/eqn
+ $(STRIP) $(ROOT)$(BINDIR)/eqn
+ test -d $(ROOT)$(MANDIR)/man1 || mkdir -p $(ROOT)$(MANDIR)/man1
+ test -d $(ROOT)$(MANDIR)/man7 || mkdir -p $(ROOT)$(MANDIR)/man7
+ $(INSTALL) -c -m 644 eqn.1 $(ROOT)$(MANDIR)/man1/eqn.1
+ $(INSTALL) -c -m 644 eqnchar.7 $(ROOT)$(MANDIR)/man7/eqnchar.7
+
+clean:
+ rm -f $(OBJ) eqn e.c y.tab.* core log *~
+
+mrproper: clean
+
+diacrit.o: ../diacrit.c ../e.h y.tab.h
+eqnbox.o: ../eqnbox.c ../e.h
+font.o: ../font.c ../e.h
+fromto.o: ../fromto.c ../e.h
+funny.o: ../funny.c ../e.h y.tab.h
+glob.o: ../glob.c ../e.h
+integral.o: ../integral.c ../e.h y.tab.h
+io.o: ../io.c ../e.h
+lex.o: ../lex.c ../e.h y.tab.h
+lookup.o: ../lookup.c ../e.h y.tab.h
+mark.o: ../mark.c ../e.h
+matrix.o: ../matrix.c ../e.h
+move.o: ../move.c ../e.h y.tab.h
+over.o: ../over.c ../e.h
+paren.o: ../paren.c ../e.h
+pile.o: ../pile.c ../e.h
+shift.o: ../shift.c ../e.h y.tab.h
+size.o: ../size.c ../e.h
+sqrt.o: ../sqrt.c ../e.h
+text.o: ../text.c ../e.h y.tab.h
+e.o: e.c ../e.h
diff --git a/eqn/eqn.d/eqn.1 b/eqn/eqn.d/eqn.1
new file mode 100644
index 0000000000000..7b7459e95af88
--- /dev/null
+++ b/eqn/eqn.d/eqn.1
@@ -0,0 +1,332 @@
+'\" e
+.\" Sccsid @(#)eqn.1b 1.6 (gritter) 12/12/05
+.\" Derived from eqn(1), Unix 7th edition:
+.\" Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" Redistributions of source code and documentation must retain the
+.\" above copyright notice, this list of conditions and the following
+.\" disclaimer.
+.\" Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed or owned by Caldera
+.\" International, Inc.
+.\" Neither the name of Caldera International, Inc. nor the names of
+.\" other contributors may be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\"
+.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
+.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE
+.\" LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+.\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.TH EQN 1 "12/12/05" "Heirloom Documentation Tools" "BSD System Compatibility"
+.EQ
+delim $$
+.EN
+.SH NAME
+eqn, neqn, checkeq \- typeset mathematics
+.SH SYNOPSIS
+\fBeqn\fR
+[\fB\-d\fIxy\fR]
+[\fB\-f\fIn\fR]
+[\fB\-s\fIn\fR]
+[\fIfile\fR] ...
+.br
+\fBneqn\fR [\fIfile\fR] ...
+.br
+\fBcheckeq\fR
+.SH DESCRIPTION
+.I Eqn
+is a
+troff(1)
+preprocessor
+for typesetting mathematics
+on a phototypesetter,
+.I neqn
+on terminals.
+Usage is almost always
+.PP
+ eqn file ... | troff
+.br
+ neqn file ... | nroff
+.PP
+If no files are specified,
+these programs
+read from the standard input.
+A line beginning with `.EQ' marks the start of an equation;
+the end of an equation
+is marked by a line beginning with `.EN'.
+Neither of these lines is altered,
+so they may be defined in macro packages
+to get
+centering, numbering, etc.
+It is also possible to set two characters as `delimiters';
+subsequent text between delimiters is also treated as
+.ul
+eqn
+input.
+Delimiters may be set to characters
+.I x
+and
+.I y
+with the command-line argument
+.BI \-d xy
+or (more commonly) with
+`delim
+.IR xy '
+between .EQ and .EN.
+The left and right delimiters may be identical.
+Delimiters are turned off by `delim off'.
+All text that is neither between delimiters nor between .EQ and .EN
+is passed through untouched.
+.PP
+The program
+.I checkeq
+reports missing or unbalanced delimiters and .EQ/.EN pairs.
+.PP
+Tokens within
+.I eqn
+are separated by
+spaces, tabs, newlines, braces, double quotes,
+tildes or circumflexes.
+Braces {} are used for grouping;
+generally speaking,
+anywhere a single character like
+.I x
+could appear, a complicated construction
+enclosed in braces may be used instead.
+Tilde ~ represents a full space in the output,
+circumflex ^ half as much.
+.PP
+.vs 13p
+Subscripts and superscripts are produced with the keywords
+.B sub
+and
+.B sup.
+Thus
+.I "x sub i"
+makes
+$x sub i$,
+.I "a sub i sup 2"
+produces
+$a sub i sup 2$,
+and
+.I "e sup {x sup 2 + y sup 2}"
+gives
+$e sup {x sup 2 + y sup 2}$.
+.PP
+Fractions are made with
+.BR over :
+.I "a over b"
+yields $a over b$.
+.PP
+.B sqrt
+makes square roots:
+.I "1 over sqrt {ax sup 2 +bx+c}"
+results in
+$1 over sqrt {ax sup 2 +bx+c}$ .
+.PP
+The keywords
+.B from
+and
+.B to
+introduce lower and upper
+limits on arbitrary things:
+$lim from {n-> inf} sum from 0 to n x sub i$
+is made with
+.I "lim from {n\-> inf } sum from 0 to n x sub i."
+.PP
+Left and right brackets, braces, etc., of the right height are made with
+.B left
+and
+.B right:
+.I "left [ x sup 2 + y sup 2 over alpha right ] ~=~1"
+produces
+$left [ x sup 2 + y sup 2 over alpha right ] ~=~1$.
+The
+.B right
+clause is optional.
+Legal characters after
+.B left
+and
+.B right
+are braces, brackets, bars,
+.B c
+and
+.B f
+for ceiling and floor,
+and "" for nothing at all (useful for a right-side-only bracket).
+.PP
+Vertical piles of things are made with
+.BR pile ,
+.BR lpile ,
+.BR cpile ,
+and
+.BR rpile :
+.I "pile {a above b above c}"
+produces
+$pile {a above b above c}$.
+There can be an arbitrary number of elements in a pile.
+.B lpile
+left-justifies,
+.B pile
+and
+.B cpile
+center, with different vertical spacing,
+and
+.B rpile
+right justifies.
+.PP
+Matrices are made with
+.BR matrix :
+.I "matrix { lcol { x sub i above y sub 2 } ccol { 1 above 2 } }"
+produces
+$matrix { lcol { x sub i above y sub 2 } ccol { 1 above 2 } }$.
+In addition, there is
+.B rcol
+for a right-justified column.
+.PP
+.vs 12p
+Diacritical marks are made with
+.BR dot ,
+.BR dotdot ,
+.BR hat ,
+.BR tilde ,
+.BR bar ,
+.BR vec ,
+.BR dyad ,
+and
+.BR under :
+.I "x dot = f(t) bar"
+is
+$x dot = f(t) bar$,
+.I "y dotdot bar ~=~ n under"
+is
+$y dotdot bar ~=~ n under$,
+and
+.I "x vec ~=~ y dyad"
+is
+$x vec ~=~ y dyad$.
+.PP
+Sizes and font can be changed with
+.B size
+.I n
+or
+.B size
+.BI \(+- n,
+.BR roman ,
+.BR italic ,
+.BR bold ,
+and
+.BR font
+.I n.
+Size and fonts can be changed globally in a document by
+.B gsize
+.I n
+and
+.B gfont
+.IR n ,
+or by the command-line arguments
+.BI \-s n
+and
+.BI \-f n.
+.PP
+Normally subscripts and superscripts are reduced by
+3 point sizes from the previous size;
+this may be changed by the command-line argument
+.BI \-p n.
+.PP
+Successive display arguments can be lined up.
+Place
+.B mark
+before the desired lineup point in the first equation;
+place
+.B lineup
+at the place that is to line up vertically in subsequent equations.
+.PP
+Shorthands may be defined
+or existing keywords redefined with
+.BI define :
+.I "define thing % replacement %"
+defines a new token called
+.I thing
+which will be replaced by
+.I replacement
+whenever it appears thereafter.
+The
+.I %
+may be any character that does not occur in
+.I replacement.
+.PP
+Keywords like
+.I sum
+.EQ
+( sum )
+.EN
+.I int
+.EQ
+( int )
+.EN
+.I inf
+.EQ
+( inf )
+.EN
+and shorthands like
+>=
+.EQ
+(>=)
+.EN
+\->
+.EQ
+(->),
+.EN
+and
+!=
+.EQ
+( != )
+.EN
+are recognized.
+Greek letters are spelled out in the desired case, as in
+.I alpha
+or
+.I GAMMA.
+Mathematical words like sin, cos, log are made Roman automatically.
+.IR Troff (1)
+four-character escapes like \e(bs (\(bs)
+can be used anywhere.
+Strings enclosed in double quotes "..."
+are passed through untouched;
+this permits keywords to be entered as text,
+and can be used to communicate
+with
+.I troff
+when all else fails.
+.SH "SEE ALSO"
+.PP
+troff(1), tbl(1), ms(7), eqnchar(7)
+.br
+B. W. Kernighan and L. L. Cherry,
+.ul
+Typesetting Mathematics\(emUser's Guide
+.br
+J. F. Ossanna,
+.ul
+NROFF/TROFF User's Manual
+.SH NOTES
+.PP
+To embolden digits, parens, etc.,
+it is necessary to quote them,
+as in `bold "12.3"'.
diff --git a/eqn/eqn.d/eqnchar.7 b/eqn/eqn.d/eqnchar.7
new file mode 100644
index 0000000000000..b806bc17ba6e4
--- /dev/null
+++ b/eqn/eqn.d/eqnchar.7
@@ -0,0 +1,212 @@
+'\" e
+.\" Sccsid @(#)eqnchar.7b 1.2 (gritter) 12/9/05
+.\" Derived from eqnchar(7), Unix 7th edition:
+.\" Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" Redistributions of source code and documentation must retain the
+.\" above copyright notice, this list of conditions and the following
+.\" disclaimer.
+.\" Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed or owned by Caldera
+.\" International, Inc.
+.\" Neither the name of Caldera International, Inc. nor the names of
+.\" other contributors may be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\"
+.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
+.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE
+.\" LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+.\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.TH EQNCHAR 7 "12/9/05" "Heirloom Documentation Tools" "BSD System Compatibility"
+.EQ
+tdefine ciplus % "\o'\(pl\(ci'" %
+ndefine ciplus % O+ %
+tdefine citimes % "\o'\(mu\(ci'" %
+ndefine citimes % Ox %
+tdefine =wig % "\(eq\h'-\w'\(eq'u-\w'\s-2\(ap'u/2u'\v'-.4m'\s-2\z\(ap\(ap\s+2\v'.4m'\h'\w'\(eq'u-\w'\s-2\(ap'u/2u'" %
+ndefine =wig % ="~" %
+tdefine bigstar % "\o'\(pl\(mu'" %
+ndefine bigstar % X|- %
+tdefine =dot % "\z\(eq\v'-.6m'\h'.2m'\s+2.\s-2\v'.6m'\h'.1m'" %
+ndefine =dot % = dot %
+tdefine orsign % "\s-2\v'-.15m'\z\e\e\h'-.05m'\z\(sl\(sl\v'.15m'\s+2" %
+ndefine orsign % \e/ %
+tdefine andsign % "\s-2\v'-.15m'\z\(sl\(sl\h'-.05m'\z\e\e\v'.15m'\s+2" %
+ndefine andsign % /\e %
+tdefine =del % "\v'.3m'\z=\v'-.6m'\h'.3m'\s-1\(*D\s+1\v'.3m'" %
+ndefine =del % = to DELTA %
+tdefine oppA % "\s-2\v'-.15m'\z\e\e\h'-.05m'\z\(sl\(sl\v'-.15m'\h'-.75m'\z-\z-\h'.2m'\z-\z-\v'.3m'\h'.4m'\s+2" %
+ndefine oppA % V- %
+tdefine oppE %"\s-3\v'.2m'\z\(em\v'-.5m'\z\(em\v'-.5m'\z\(em\v'.55m'\h'.9m'\z\(br\z\(br\v'.25m'\s+3" %
+ndefine oppE % E/ %
+tdefine incl % "\s-1\z\(or\h'-.1m'\v'-.45m'\z\(em\v'.7m'\z\(em\v'.2m'\(em\v'-.45m'\s+1" %
+ndefine incl % C_ %
+tdefine nomem % "\o'\(mo\(sl'" %
+ndefine nomem % C-/ %
+tdefine angstrom % "\fR\zA\v'-.3m'\h'.2m'\(de\v'.3m'\fP\h'.2m'" %
+ndefine angstrom % A to o %
+tdefine star %{ roman "\v'.5m'\s+3*\s-3\v'-.5m'"}%
+ndefine star % * %
+tdefine || % \(or\(or %
+tdefine <wig % "\z<\v'.4m'\(ap\v'-.4m'" %
+ndefine <wig %{ < from "~" }%
+tdefine >wig % "\z>\v'.4m'\(ap\v'-.4m'" %
+ndefine >wig %{ > from "~" }%
+tdefine langle % "\s-3\b'\(sl\e'\s0" %
+ndefine langle %<%
+tdefine rangle % "\s-3\b'\e\(sl'\s0" %
+ndefine rangle %>%
+tdefine hbar % "\zh\v'-.6m'\h'.05m'\(ru\v'.6m'" %
+ndefine hbar % h\u-\d %
+ndefine ppd % _| %
+tdefine ppd % "\o'\(ru\s-2\(or\s+2'" %
+tdefine <-> % "\o'\(<-\(->'" %
+ndefine <-> % "<-->" %
+tdefine <=> % "\s-2\z<\v'.05m'\h'.2m'\z=\h'.55m'=\h'-.6m'\v'-.05m'>\s+2" %
+ndefine <=> % "<=>" %
+tdefine |< % "\o'<\(or'" %
+ndefine |< % <| %
+tdefine |> % "\o'>\(or'" %
+ndefine |> % |> %
+tdefine ang % "\v'-.15m'\z\s-2\(sl\s+2\v'.15m'\(ru" %
+ndefine ang % /_ %
+tdefine rang % "\z\(or\h'.15m'\(ru" %
+ndefine rang % L %
+tdefine 3dot % "\v'-.8m'\z.\v'.5m'\z.\v'.5m'.\v'-.2m'" %
+ndefine 3dot % .\u.\u.\d\d %
+tdefine thf % ".\v'-.5m'.\v'.5m'." %
+ndefine thf % ..\u.\d %
+tdefine quarter % roman \(14 %
+ndefine quarter % 1/4 %
+tdefine 3quarter % roman \(34 %
+ndefine 3quarter % 3/4 %
+tdefine degree % \(de %
+ndefine degree % nothing sup o %
+tdefine square % \(sq %
+ndefine square % [] %
+tdefine circle % \(ci %
+ndefine circle % O %
+tdefine blot % "\fB\(sq\fP" %
+ndefine blot % HIX %
+tdefine bullet % \(bu %
+ndefine bullet % oxe %
+tdefine -wig % "\(~=" %
+ndefine -wig % - to "~" %
+tdefine wig % \(ap %
+ndefine wig % "~" %
+tdefine prop % \(pt %
+ndefine prop % oc %
+tdefine empty % \(es %
+ndefine empty % O/ %
+tdefine member % \(mo %
+ndefine member % C- %
+tdefine cup % \(cu %
+ndefine cup % U %
+define cap % \(ca %
+define subset % \(sb %
+define supset % \(sp %
+define !subset % \(ib %
+define !supset % \(ip %
+.EN
+.SH NAME
+eqnchar \- special character definitions for eqn
+.SH SYNOPSIS
+.HP
+.ad l
+.nh
+.B eqn /usr/pub/eqnchar
+.RB [ files ]
+.B | troff
+.RB [ options ]
+.HP
+.B neqn /usr/pub/eqnchar
+.RB [ files ]
+.B | nroff
+.RB [ options ]
+.br
+.hy 1
+.ad b
+.SH DESCRIPTION
+.I Eqnchar
+contains
+.I troff
+and
+.I nroff
+character definitions for constructing characters that are not
+available on the Graphic Systems typesetter.
+These definitions are primarily intended for use with
+.I eqn
+and
+.IR neqn .
+It contains
+definitions for the following characters
+.PP
+.nf
+.ta \w'angstrom 'u \n(.lu/3u +\w'angstrom 'u \n(.lu*2u/3u +\w'angstrom 'u
+.EQ
+"ciplus" ciplus "|\||" || "square" square
+.EN
+.EQ
+"citimes" citimes "langle" langle "circle" circle
+.EN
+.EQ
+"wig" wig "rangle" rangle "blot" blot
+.EN
+.EQ
+"-wig" -wig "hbar" hbar "bullet" bullet
+.EN
+.EQ
+">wig" >wig "ppd" ppd "prop" prop
+.EN
+.EQ
+"<wig" <wig "<->" <-> "empty" empty
+.EN
+.EQ
+"=wig" =wig "<=>" <=> "member" member
+.EN
+.EQ
+"star" star "|\|" |< "nomem" nomem
+.EN
+.EQ
+"bigstar" bigstar "|\|>" |> "cup" cup
+.EN
+.EQ
+"=dot" =dot "ang" ang "cap" cap
+.EN
+.EQ
+"orsign" orsign "rang" rang "incl" incl
+.EN
+.EQ
+"andsign" andsign "3dot" 3dot "subset" subset
+.EN
+.EQ
+"=del" =del "thf" thf "supset" supset
+.EN
+.EQ
+"oppA" oppA "quarter" quarter "!subset" !subset
+.EN
+.EQ
+"oppE" oppE "3quarter" 3quarter "!supset" !supset
+.EN
+.EQ
+"angstrom" angstrom "degree" degree
+.EN
+.SH FILES
+/usr/pub/eqnchar
+.SH SEE ALSO
+troff(1), eqn(1)
diff --git a/eqn/eqnbox.c b/eqn/eqnbox.c
new file mode 100644
index 0000000000000..c51f0a4b95dc3
--- /dev/null
+++ b/eqn/eqnbox.c
@@ -0,0 +1,68 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "eqnbox.c 1.3 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)eqnbox.c 1.7 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+eqnbox(int p1, int p2, int lu) {
+#ifndef NEQN
+ float b, h;
+#else /* NEQN */
+ int b, h;
+#endif /* NEQN */
+ char *sh;
+
+ yyval.token = p1;
+ b = max(ebase[p1], ebase[p2]);
+ eht[yyval.token] = h = b + max(eht[p1]-ebase[p1],
+ eht[p2]-ebase[p2]);
+ ebase[yyval.token] = b;
+#ifndef NEQN
+ if(dbg)printf(".\te:eb: S%d <- S%d S%d; b=%g, h=%g\n",
+ yyval.token, p1, p2, b, h);
+#else /* NEQN */
+ if(dbg)printf(".\te:eb: S%d <- S%d S%d; b=%d, h=%d\n",
+ yyval.token, p1, p2, b, h);
+#endif /* NEQN */
+ if (ital(rfont[p1]) && rom(lfont[p2])) {
+ if (op(lfont[p2]))
+ sh = "\\|";
+ else
+ sh = "\\^";
+ } else
+ sh = "";
+ if (lu) {
+ printf(".nr %d \\w'\\s%s\\*(%d%s'\n", p1, tsize(ps), p1, sh);
+ printf(".ds %d \\h'|\\n(97u-\\n(%du'\\*(%d\n", p1, p1, p1);
+ }
+ printf(".as %d \"%s\\*(%d\n", yyval.token, sh, p2);
+ rfont[p1] = rfont[p2];
+ ofree(p2);
+}
diff --git a/eqn/eqnchar.d/Makefile.mk b/eqn/eqnchar.d/Makefile.mk
new file mode 100644
index 0000000000000..6154b87c05963
--- /dev/null
+++ b/eqn/eqnchar.d/Makefile.mk
@@ -0,0 +1,28 @@
+FILES = ascii eqnchar greek iso utf-8
+
+.c.o:
+ $(CC) $(CFLAGS) $(WARN) $(CPPFLAGS) $(EUC) -c $<
+
+all: $(FILES)
+
+utf-8: genutf8
+ -./genutf8 >utf-8
+
+genutf8: genutf8.o
+ -$(CC) $(CFLAGS) $(LDFLAGS) genutf8.o $(LIBS) -o genutf8
+
+genutf8.o: genutf8.c
+ -$(CC) $(CFLAGS) $(WARN) $(CPPFLAGS) $(EUC) -c genutf8.c
+
+install: all
+ test -d $(ROOT)$(PUBDIR) || mkdir -p $(ROOT)$(PUBDIR)
+ for i in $(FILES); \
+ do \
+ test -s $$i || continue; \
+ $(INSTALL) -c -m 644 $$i $(ROOT)$(PUBDIR)/$$i || exit; \
+ done
+
+clean:
+ rm -f utf-8 genutf8 genutf8.o core log *~
+
+mrproper: clean
diff --git a/eqn/eqnchar.d/ascii b/eqn/eqnchar.d/ascii
new file mode 100644
index 0000000000000..0df53fd6e9982
--- /dev/null
+++ b/eqn/eqnchar.d/ascii
@@ -0,0 +1,34 @@
+|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel|
+|010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si |
+|020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb|
+|030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us |
+|040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' |
+|050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / |
+|060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 |
+|070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? |
+|100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G |
+|110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O |
+|120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W |
+|130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ |
+|140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g |
+|150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o |
+|160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w |
+|170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del|
+
+
+| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
+| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
+| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
+| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
+| 20 sp | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
+| 28 ( | 29 ) | 2a * | 2b + | 2c , | 2d - | 2e . | 2f / |
+| 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
+| 38 8 | 39 9 | 3a : | 3b ; | 3c < | 3d = | 3e > | 3f ? |
+| 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
+| 48 H | 49 I | 4a J | 4b K | 4c L | 4d M | 4e N | 4f O |
+| 50 P | 51 Q | 52 R | 53 S | 54 T | 55 U | 56 V | 57 W |
+| 58 X | 59 Y | 5a Z | 5b [ | 5c \ | 5d ] | 5e ^ | 5f _ |
+| 60 ` | 61 a | 62 b | 63 c | 64 d | 65 e | 66 f | 67 g |
+| 68 h | 69 i | 6a j | 6b k | 6c l | 6d m | 6e n | 6f o |
+| 70 p | 71 q | 72 r | 73 s | 74 t | 75 u | 76 v | 77 w |
+| 78 x | 79 y | 7a z | 7b { | 7c | | 7d } | 7e ~ | 7f del|
diff --git a/eqn/eqnchar.d/eqnchar b/eqn/eqnchar.d/eqnchar
new file mode 100644
index 0000000000000..87d96f6c0ce16
--- /dev/null
+++ b/eqn/eqnchar.d/eqnchar
@@ -0,0 +1,90 @@
+.EQ
+tdefine ciplus % "\(pl\h'-\w'\(pl\^'u'\v'.3n'\(ci\v'-.3n'" %
+ndefine ciplus % O+ %
+tdefine citimes % "\(mu\h'-\w'\(mu\^'u'\v'.3n'\(ci\v'-.3n'" %
+ndefine citimes % Ox %
+tdefine =wig % "\(~=" %
+ndefine =wig % ="~" %
+tdefine bigstar %{ roman "\v'.5n'\s+4*\s-4\v'-.5n'"}%
+ndefine bigstar % X|- %
+tdefine =dot % "\z\s+2\(eq\s-2\v'-.6m'\h'.2m'\s+2.\s-2\v'.6m'\h'.1m'" %
+ndefine =dot % = dot %
+tdefine orsign % "\e\s+1\(sl\s-1" %
+ndefine orsign % \e/ %
+tdefine andsign % "\s+1\(sl\s-1\e" %
+ndefine andsign % /\e %
+tdefine =del % "\v'.3m'\z=\v'-.6m'\h'.3n'\s-2\(*D\s+2\v'.3m'" %
+ndefine =del % = to DELTA %
+tdefine oppA % "\v'-.3n'\z\(mi\v'.3n'\e\s+1\(sl\s-1" %
+ndefine oppA % V- %
+tdefine oppE %"\s-3\v'.2m'\z\(em\v'-.5m'\z\(em\v'-.5m'\z\(em\v'.55m'\h'.9m'\z\(br\z\(br\v'.25m'\s+3" %
+ndefine oppE % E/ %
+tdefine incl % "\s-2\(or\v'-.4m'\z\(em\v'.75m'\z\(em\v'.2m'\(em\v'-.55m'\s+2" %
+ndefine incl % C_ %
+tdefine nomem % "\o'\(mo\(sl'" %
+ndefine nomem % C-/ %
+tdefine angstrom % "\fR\zA\v'-.3m'\h'.2m'\(de\v'.3m'\fP\h'.2m'" %
+ndefine angstrom % A to o %
+tdefine star %{ roman "\v'.5n'\s+2*\s-2\v'-.5n'"}%
+ndefine star % * %
+tdefine || % \(or\(or %
+tdefine <wig % "\z<\v'.4m'\(ap\v'-.4m'" %
+ndefine <wig %{ < from "~" }%
+tdefine >wig % "\z>\v'.4m'\(ap\v'-.4m'" %
+ndefine >wig %{ > from "~" }%
+tdefine langle % "\v'-.3n'\s-1\z\(sl\s-1\v'1n'\e\v'-1n'\s+2\v'.3n'" %
+ndefine langle %<%
+tdefine rangle % "\v'-.3n'\s-2\z\e\s+1\v'1n'\(sl\v'-1n'\s+1\v'.3n'" %
+ndefine rangle %>%
+tdefine hbar % "\zh\v'-.6m'\h'.05m'\(ru\v'.6m'" %
+ndefine hbar % h\u-\d %
+tdefine ppd % "\o'\(ru\s-3\(or\s+3'" %
+ndefine ppd % _| %
+tdefine <-> % "\z\(<-\|\(->" %
+ndefine <-> % "<-->" %
+tdefine <=> % "\z\(lh\|\(rh" %
+ndefine <=> % "<=>" %
+tdefine |< % "\o'<\(or'" %
+ndefine |< % <| %
+tdefine |> % "\o'>\(or'" %
+ndefine |> % |> %
+tdefine ang % "\z\(sl\v'-.1n'\(ru\v'.1n'" %
+ndefine ang % /_ %
+tdefine rang % "\v'-.2n'\(or\v'.1n'\(ru\v'.1n'" %
+ndefine rang % L %
+tdefine 3dot % "\v'-.7m'\z.\v'.4m'\z.\v'.4m'.\v'-.1m'" %
+ndefine 3dot % .\u.\u.\d\d %
+tdefine thf % ".\v'-.5m'.\v'.5m'." %
+ndefine thf % ..\u.\d %
+tdefine quarter % roman \(14 %
+ndefine quarter % 1/4 %
+tdefine 3quarter % roman \(34 %
+ndefine 3quarter % 3/4 %
+tdefine degree % \(de %
+ndefine degree % nothing sup o %
+tdefine square % \(sq %
+ndefine square % [] %
+tdefine circle % \(ci %
+ndefine circle % O %
+tdefine blot % "\fB\(sq\fP" %
+ndefine blot % HIX %
+tdefine bullet % \(bu %
+ndefine bullet % oxe %
+tdefine -wig % "\(mi\h'-\w'\(mi'u-\w'\(ap'u/2u'\v'-.4n'\(ap\v'.4n'\h'\w'\(mi'u-\w'\(ap'u/2u'" %
+ndefine -wig % - to "~" %
+tdefine wig % \(ap %
+ndefine wig % "~" %
+tdefine prop % \(pt %
+ndefine prop % oc %
+tdefine empty % \(es %
+ndefine empty % O/ %
+tdefine member % \(mo %
+ndefine member % C- %
+tdefine cup % \(cu %
+ndefine cup % U %
+define cap % \(ca %
+define subset % \(sb %
+define supset % \(sp %
+define !subset % \(ib %
+define !supset % \(ip %
+.EN
diff --git a/eqn/eqnchar.d/genutf8.c b/eqn/eqnchar.d/genutf8.c
new file mode 100644
index 0000000000000..d43b3624411de
--- /dev/null
+++ b/eqn/eqnchar.d/genutf8.c
@@ -0,0 +1,89 @@
+/*
+ * Generate a table of UTF-8 characters.
+ *
+ * Copyright (C) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Public Domain
+ *
+ * Sccsid @(#)genutf8.c 1.1 (gritter) 9/13/05
+ */
+#ifdef EUC
+#include <locale.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <stdio.h>
+
+const char *const ctl[] = {
+ "nul",
+ "soh",
+ "stx",
+ "etx",
+ "eot",
+ "enq",
+ "ack",
+ "bel",
+ "bs",
+ "ht",
+ "nl",
+ "vt",
+ "np",
+ "cr",
+ "so",
+ "si",
+ "dle",
+ "dc1",
+ "dc2",
+ "dc3",
+ "dc4",
+ "nak",
+ "syn",
+ "etb",
+ "can",
+ "em",
+ "sub",
+ "esc",
+ "fs",
+ "gs",
+ "rs",
+ "us"
+};
+
+int
+main(void)
+{
+ int wc;
+ int i, n;
+
+ if (setlocale(LC_CTYPE, "en_US.utf8") == NULL)
+ if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL)
+ return 1;
+ for (wc = 0; wc <= 0xffff; wc++) {
+ if ((wc&017) == 0)
+ printf("U+%04X ", wc);
+ if (wc < 040)
+ n = printf("%s", ctl[wc]);
+ else if (wc == 0177)
+ n = printf("del");
+ else if (wc >= 0200 && wc < 0240)
+ n = printf("CTL");
+ else if (iswprint(wc)) {
+ if ((n = wcwidth(wc)) == 0)
+ n = 1;
+ printf("%lc", wc);
+ } else
+ n = 0;
+ for (i = n; i < 4; i++)
+ putchar(' ');
+ if (((wc+1)&017) == 0)
+ putchar('\n');
+ }
+ return 0;
+}
+#else /* !EUC */
+int
+main(void)
+{
+ return 1;
+}
+#endif /* !EUC */
diff --git a/eqn/eqnchar.d/greek b/eqn/eqnchar.d/greek
new file mode 100644
index 0000000000000..cb6442235aad9
--- /dev/null
+++ b/eqn/eqnchar.d/greek
@@ -0,0 +1,11 @@
+alpha A A | beta B B | gamma \ \
+GAMMA G G | delta D D | DELTA W W
+epsilon S S | zeta Q Q | eta N N
+THETA T T | theta O O | lambda L L
+LAMBDA E E | mu M M | nu @ @
+xi X X | pi J J | PI P P
+rho K K | sigma Y Y | SIGMA R R
+tau I I | phi U U | PHI F F
+psi V V | PSI H H | omega C C
+OMEGA Z Z | nabla [ [ | not _ _
+partial ] ] | integral ^ ^
diff --git a/eqn/eqnchar.d/iso b/eqn/eqnchar.d/iso
new file mode 100644
index 0000000000000..c31921e404fef
--- /dev/null
+++ b/eqn/eqnchar.d/iso
@@ -0,0 +1,29 @@
+| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
+| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
+| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
+| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
+| 20 sp | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
+| 28 ( | 29 ) | 2a * | 2b + | 2c , | 2d - | 2e . | 2f / |
+| 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
+| 38 8 | 39 9 | 3a : | 3b ; | 3c < | 3d = | 3e > | 3f ? |
+| 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
+| 48 H | 49 I | 4a J | 4b K | 4c L | 4d M | 4e N | 4f O |
+| 50 P | 51 Q | 52 R | 53 S | 54 T | 55 U | 56 V | 57 W |
+| 58 X | 59 Y | 5a Z | 5b [ | 5c \ | 5d ] | 5e ^ | 5f _ |
+| 60 ` | 61 a | 62 b | 63 c | 64 d | 65 e | 66 f | 67 g |
+| 68 h | 69 i | 6a j | 6b k | 6c l | 6d m | 6e n | 6f o |
+| 70 p | 71 q | 72 r | 73 s | 74 t | 75 u | 76 v | 77 w |
+| 78 x | 79 y | 7a z | 7b { | 7c | | 7d } | 7e ~ | 7f del|
+
+| a0 nbs| a1 ¡ | a2 ¢ | a3 £ | a4 ¤ | a5 ¥ | a6 ¦ | a7 § |
+| a8 ¨ | a9 © | aa ª | ab « | ac ¬ | ad ­ | ae ® | af ¯ |
+| b0 ° | b1 ± | b2 ² | b3 ³ | b4 ´ | b5 µ | b6 ¶ | b7 · |
+| b8 ¸ | b9 ¹ | ba º | bb » | bc ¼ | bd ½ | be ¾ | bf ¿ |
+| c0 À | c1 Á | c2 Â | c3 Ã | c4 Ä | c5 Å | c6 Æ | c7 Ç |
+| c8 È | c9 É | ca Ê | cb Ë | cc Ì | cd Í | ce Î | cf Ï |
+| d0 Ð | d1 Ñ | d2 Ò | d3 Ó | d4 Ô | d5 Õ | d6 Ö | d7 × |
+| d8 Ø | d9 Ù | da Ú | db Û | dc Ü | dd Ý | de Þ | df ß |
+| e0 à | e1 á | e2 â | e3 ã | e4 ä | e5 å | e6 æ | e7 ç |
+| e8 è | e9 é | ea ê | eb ë | ec ì | ed í | ee î | ef ï |
+| f0 ð | f1 ñ | f2 ò | f3 ó | f4 ô | f5 õ | f6 ö | f7 ÷ |
+| f8 ø | f9 ù | fa ú | fb û | fc ü | fd ý | fe þ | ff ÿ |
diff --git a/eqn/font.c b/eqn/font.c
new file mode 100644
index 0000000000000..540485b872163
--- /dev/null
+++ b/eqn/font.c
@@ -0,0 +1,99 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "font.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)font.c 1.5 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+setfont(char ch1) {
+ /* use number '1', '2', '3' for roman, italic, bold */
+ yyval.token = ft;
+ if (ch1 == 'r' || ch1 == 'R')
+ ft = ROM;
+ else if (ch1 == 'i' || ch1 == 'I')
+ ft = ITAL;
+ else if (ch1 == 'b' || ch1 == 'B')
+ ft = BLD;
+ else
+ ft = ch1;
+ printf(".ft %c\n", ft);
+#ifndef NEQN
+ if(dbg)printf(".\tsetfont %c %c\n", ch1, ft);
+#else /* NEQN */
+ if(dbg)printf(".\tsetfont %c\n", ft);
+#endif /* NEQN */
+}
+
+void
+font(int p1, int p2) {
+ /* old font in p1, new in ft */
+ yyval.token = p2;
+ lfont[yyval.token] = rfont[yyval.token] = ital(ft) ? ITAL : ROM;
+#ifndef NEQN
+ if(dbg)printf(".\tb:fb: S%d <- \\f%c S%d \\f%c b=%g,h=%g,lf=%c,rf=%c\n",
+ yyval.token, ft, p2, p1, ebase[yyval.token], eht[yyval.token], lfont[yyval.token], rfont[yyval.token]);
+#else /* NEQN */
+ if(dbg)printf(".\tb:fb: S%d <- \\f%c S%d \\f%c b=%d,h=%d,lf=%c,rf=%c\n",
+ yyval.token, ft, p2, p1, ebase[yyval.token], eht[yyval.token], lfont[yyval.token], rfont[yyval.token]);
+#endif /* NEQN */
+ printf(".ds %d \\f%c\\*(%d\\f%c\n",
+ yyval.token, ft, p2, p1);
+ ft = p1;
+ printf(".ft %c\n", ft);
+}
+
+void
+fatbox(int p) {
+ yyval.token = p;
+ nrwid(p, ps, p);
+ printf(".ds %d \\*(%d\\h'-\\n(%du+0.05m'\\*(%d\n", p, p, p, p);
+ if(dbg)printf(".\tfat %d, sh=0.05m\n", p);
+}
+
+void
+globfont(void) {
+ char temp[20];
+
+ getstr(temp, 20);
+ yyval.token = eqnreg = 0;
+ gfont = temp[0];
+ switch (gfont) {
+ case 'r': case 'R':
+ gfont = '1';
+ break;
+ case 'i': case 'I':
+ gfont = '2';
+ break;
+ case 'b': case 'B':
+ gfont = '3';
+ break;
+ }
+ printf(".ft %c\n", gfont);
+ ft = gfont;
+}
diff --git a/eqn/fromto.c b/eqn/fromto.c
new file mode 100644
index 0000000000000..618a10f3c8ab5
--- /dev/null
+++ b/eqn/fromto.c
@@ -0,0 +1,103 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "fromto.c 1.3 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)fromto.c 1.5 (gritter) 10/19/06
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+fromto(int p1, int p2, int p3) {
+ float pss;
+#ifndef NEQN
+ float b, h1, b1;
+#else /* NEQN */
+ int b, h1, b1;
+#endif /* NEQN */
+ yyval.token = oalloc();
+ lfont[yyval.token] = rfont[yyval.token] = 0;
+ h1 = eht[yyval.token] = eht[p1];
+ b1 = ebase[p1];
+ b = 0;
+ pss = EFFPS(ps);
+ ps += 3;
+ nrwid(p1, ps, p1);
+ printf(".nr %d \\n(%d\n", yyval.token, p1);
+ if( p2>0 ) {
+ nrwid(p2, pss, p2);
+ printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, yyval.token, yyval.token, p2);
+ eht[yyval.token] += eht[p2];
+ b = eht[p2];
+ }
+ if( p3>0 ) {
+ nrwid(p3, pss, p3);
+ printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p3, yyval.token, yyval.token, p3);
+ eht[yyval.token] += eht[p3];
+ }
+ printf(".ds %d ", yyval.token); /* bottom of middle box */
+ if( p2>0 ) {
+#ifndef NEQN
+ printf("\\v'%gp'\\h'\\n(%du-\\n(%du/2u'\\s%s\\*(%d\\s%s",
+ eht[p2]-ebase[p2]+b1, yyval.token, p2, tsize(pss), p2, tsize(EFFPS(ps)));
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%gp'\\\n",
+ yyval.token, p2, -(eht[p2]-ebase[p2]+b1));
+#else /* NEQN */
+ printf("\\v'%du'\\h'\\n(%du-\\n(%du/2u'\\s%s\\*(%d\\s%s",
+ eht[p2]-ebase[p2]+b1, yyval.token, p2, tsize(pss), p2, tsize(EFFPS(ps)));
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%du'\\\n",
+ yyval.token, p2, -(eht[p2]-ebase[p2]+b1));
+#endif /* NEQN */
+ }
+#ifndef NEQN
+ printf("\\h'\\n(%du-\\n(%du/2u'\\*(%d\\h'\\n(%du-\\n(%du/2u'\\\n",
+ yyval.token, p1, p1, yyval.token, p1);
+#else /* NEQN */
+ printf("\\h'\\n(%du-\\n(%du/2u'\\*(%d\\h'\\n(%du-\\n(%du+2u/2u'\\\n",
+ yyval.token, p1, p1, yyval.token, p1);
+#endif /* NEQN */
+ if( p3>0 ) {
+#ifndef NEQN
+ printf("\\v'%gp'\\h'-\\n(%du-\\n(%du/2u'\\s%s\\*(%d\\s%s\\h'\\n(%du-\\n(%du/2u'\\v'%gp'\\\n",
+ -(h1-b1+ebase[p3]), yyval.token, p3, tsize(pss), p3, tsize(EFFPS(ps)), yyval.token, p3, (h1-b1+ebase[p3]));
+#else /* NEQN */
+ printf("\\v'%du'\\h'-\\n(%du-\\n(%du/2u'\\s%s\\*(%d\\s%s\\h'\\n(%du-\\n(%du/2u'\\v'%du'\\\n",
+ -(h1-b1+ebase[p3]), yyval.token, p3, tsize(pss), p3, tsize(EFFPS(ps)), yyval.token, p3, (h1-b1+ebase[p3]));
+#endif /* NEQN */
+ }
+ printf("\n");
+ ebase[yyval.token] = b + b1;
+#ifndef NEQN
+ if(dbg)printf(".\tfrom to: S%d <- %d f %d t %d; h=%g b=%g\n",
+ yyval.token, p1, p2, p3, eht[yyval.token], ebase[yyval.token]);
+#else /* NEQN */
+ if(dbg)printf(".\tfrom to: S%d <- %d f %d t %d; h=%d b=%d\n",
+ yyval.token, p1, p2, p3, eht[yyval.token], ebase[yyval.token]);
+#endif /* NEQN */
+ ofree(p1);
+ if( p2>0 ) ofree(p2);
+ if( p3>0 ) ofree(p3);
+}
diff --git a/eqn/funny.c b/eqn/funny.c
new file mode 100644
index 0000000000000..ba230e21ce3fd
--- /dev/null
+++ b/eqn/funny.c
@@ -0,0 +1,64 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "funny.c 1.6 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)funny.c 1.6 (gritter) 10/19/06
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+funny(int n) {
+ char *f = NULL;
+
+ yyval.token = oalloc();
+ switch(n) {
+ case SUM:
+ f = "\\(*S"; break;
+ case UNION:
+ f = "\\(cu"; break;
+ case INTER: /* intersection */
+ f = "\\(ca"; break;
+ case PROD:
+ f = "\\(*P"; break;
+ default:
+ error(FATAL, "funny type %d in funny", n);
+ }
+#ifndef NEQN
+ printf(".ds %d \\s%s\\v'.3m'\\s+5%s\\s-5\\v'-.3m'\\s%s\n", yyval.token, tsize(ps), f, tsize(ps));
+ eht[yyval.token] = VERT(EM(1.0, ps+5) - EM(0.2, ps));
+ ebase[yyval.token] = VERT(EM(0.3, ps));
+ if(dbg)printf(".\tfunny: S%d <- %s; h=%g b=%g\n",
+ yyval.token, f, eht[yyval.token], ebase[yyval.token]);
+#else /* NEQN */
+ printf(".ds %d %s\n", yyval.token, f);
+ eht[yyval.token] = VERT(2);
+ ebase[yyval.token] = 0;
+ if(dbg)printf(".\tfunny: S%d <- %s; h=%d b=%d\n",
+ yyval.token, f, eht[yyval.token], ebase[yyval.token]);
+#endif /* NEQN */
+ lfont[yyval.token] = rfont[yyval.token] = ROM;
+}
diff --git a/eqn/glob.c b/eqn/glob.c
new file mode 100644
index 0000000000000..6416707b2821a
--- /dev/null
+++ b/eqn/glob.c
@@ -0,0 +1,57 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "glob.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)glob.c 1.8 (gritter) 10/19/06
+ */
+
+#include "e.h"
+
+int dbg; /* debugging print if non-zero */
+int lp[512]; /* stack for things like piles and matrices */
+int ct; /* pointer to lp */
+int used[100]; /* available registers */
+float ps; /* default init point size */
+/*int resolution = 72; * was: resolution of ditroff */
+float deltaps = 3; /* default change in ps */
+float gsize = 10; /* default initial point size */
+int gfont = ITAL; /* italic */
+int ft; /* default font */
+FILE *curfile; /* current input file */
+int ifile;
+int linect; /* line number in file */
+int eqline; /* line where eqn started */
+int svargc;
+char **svargv;
+#ifndef NEQN
+float eht[100];
+float ebase[100];
+#else /* NEQN */
+int eht[100];
+int ebase[100];
+#endif /* NEQN */
+int lfont[100];
+int rfont[100];
+int eqnreg; /* register where final string appears */
+int eqnht; /* inal height of equation */
+int lefteq = '\0'; /* left in-line delimiter */
+int righteq = '\0'; /* right in-line delimiter */
+int lastchar; /* last character read by lex */
+int markline = 0; /* 1 if this EQ/EN contains mark or lineup */
+char *progname;
diff --git a/eqn/integral.c b/eqn/integral.c
new file mode 100644
index 0000000000000..55c2eb4949cb3
--- /dev/null
+++ b/eqn/integral.c
@@ -0,0 +1,74 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "integral.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)integral.c 1.5 (gritter) 10/19/06
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+integral(int p, int p1, int p2) {
+#ifndef NEQN
+ if (p1 != 0)
+ printf(".ds %d \\h'-0.4m'\\v'0.4m'\\*(%d\\v'-0.4m'\n", p1, p1);
+ if (p2 != 0)
+ printf(".ds %d \\v'-0.3m'\\*(%d\\v'0.3m'\n", p2, p2);
+#endif
+ if (p1 != 0 && p2 != 0)
+ shift2(p, p1, p2);
+ else if (p1 != 0)
+ bshiftb(p, SUB, p1);
+ else if (p2 != 0)
+ bshiftb(p, SUP, p2);
+#ifndef NEQN
+ if(dbg)printf(".\tintegral: S%d; h=%g b=%g\n",
+ p, eht[p], ebase[p]);
+#else /* NEQN */
+ if(dbg)printf(".\tintegral: S%d; h=%d b=%d\n",
+ p, eht[p], ebase[p]);
+#endif /* NEQN */
+ lfont[p] = ROM;
+}
+
+void
+setintegral(void) {
+ char *f;
+
+ yyval.token = oalloc();
+ f = "\\(is";
+#ifndef NEQN
+ printf(".ds %d \\s%s\\v'.1m'\\s+4%s\\s-4\\v'-.1m'\\s%s\n",
+ yyval.token, tsize(ps), f, tsize(ps));
+ eht[yyval.token] = VERT(EM(1.15, ps+4));
+ ebase[yyval.token] = VERT(EM(0.3, ps));
+#else /* NEQN */
+ printf(".ds %d %s\n", yyval.token, f);
+ eht[yyval.token] = VERT(2);
+ ebase[yyval.token] = 0;
+#endif /* NEQN */
+ lfont[yyval.token] = rfont[yyval.token] = ROM;
+}
diff --git a/eqn/io.c b/eqn/io.c
new file mode 100644
index 0000000000000..6b4c490bcaece
--- /dev/null
+++ b/eqn/io.c
@@ -0,0 +1,322 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983-1988, 2001 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+/* from OpenSolaris "io.c 1.10 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)io.c 1.13 (gritter) 1/13/08
+ */
+
+# include "e.h"
+#include <stdarg.h>
+#include <stdlib.h>
+#include <libgen.h>
+
+char *in; /* input buffer */
+size_t insize; /* input buffer size */
+int noeqn;
+
+int
+main(int argc,char **argv) {
+
+ progname = basename(argv[0]);
+ eqnexit(eqn(argc, argv));
+ /*NOTREACHED*/
+ return 0;
+}
+
+void
+eqnexit(int n) {
+#ifdef gcos
+ if (n)
+ fprintf(stderr, "run terminated due to eqn error\n");
+ exit(0);
+#endif
+ exit(n);
+}
+
+int
+eqn(int argc,char **argv) {
+ int i, type;
+
+ setfile(argc,argv);
+ init_tbl(); /* install keywords in tables */
+ while ((type=getline(&in, &insize)) != EOF) {
+ eqline = linect;
+ if (type == lefteq)
+ do_inline();
+ else if (*in == '.') {
+ char *p;
+ printf("%s",in);
+ for (p = in + 1; *p == ' ' || *p == '\t'; p++);
+ if (!*p || *p != 'E' || p[1] != 'Q') continue;
+ for (i=11; i<100; used[i++]=0);
+ printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+ printf(".if \\n(.X .nrf 99 \\n(.s\n");
+ markline = 0;
+ init();
+ yyparse();
+ if (eqnreg>0) {
+ printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
+ /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
+ /* eqnreg, svargv[ifile], eqline, linect); */
+ printf(".nr MK %d\n", markline); /* for -ms macros */
+ printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
+ printf(".rn %d 10\n", eqnreg);
+ if(!noeqn)printf("\\*(10\n");
+ }
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ printf(".EN");
+ if (lastchar == EOF) {
+ putchar('\n');
+ break;
+ }
+ if (putchar(lastchar) != '\n')
+ while (putchar(gtc()) != '\n');
+ } else
+ printf("%s",in);
+ }
+ return(0);
+}
+
+int
+getline(char **sp, size_t *np) {
+ register int c, n = 0, esc = 0, par = 0, brack = 0;
+ char *xp;
+ for (;;) {
+ c = gtc();
+ if (n+1 >= *np) {
+ xp = realloc(*sp, *np += 128);
+ if (xp == NULL) {
+ error( !FATAL, "input line too long: %.20s\n",
+ in);
+ xp[--n] = '\0';
+ break;
+ }
+ *sp = xp;
+ }
+ (*sp)[n++] = c;
+ if (c=='\\')
+ esc++;
+ else {
+ if (c=='\n' || c==EOF ||
+ (c==lefteq && !esc && !par && !brack))
+ break;
+ if (par)
+ par--;
+ if (brack && c == ']')
+ brack = 0;
+ if (esc) {
+ switch (c) {
+ case '*':
+ case 'f':
+ case 'g':
+ case 'k':
+ case 'n':
+ case 'P':
+ case 'V':
+ case 'Y':
+ break;
+ case '(':
+ par += 2;
+ break;
+ case '[':
+ brack++;
+ break;
+ default:
+ esc = 0;
+ }
+ }
+ }
+ }
+ if (c==lefteq && !esc)
+ n--;
+ (*sp)[n++] = '\0';
+ return(c);
+}
+
+void
+do_inline(void) {
+ int ds;
+
+ printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+ printf(".if \\n(.X .nrf 99 \\n(.s\n");
+ ds = oalloc();
+ printf(".rm %d \n", ds);
+ do{
+ if (*in)
+ printf(".as %d \"%s\n", ds, in);
+ init();
+ yyparse();
+ if (eqnreg > 0) {
+ printf(".as %d \\*(%d\n", ds, eqnreg);
+ ofree(eqnreg);
+ }
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ } while (getline(&in, &insize) == lefteq);
+ if (*in)
+ printf(".as %d \"%s", ds, in);
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ printf("\\*(%d\n", ds);
+ ofree(ds);
+}
+
+void
+putout(int p1) {
+#ifndef NEQN
+ float before, after;
+ if(dbg)printf(".\tanswer <- S%d, h=%g,b=%g\n",p1, eht[p1], ebase[p1]);
+#else /* NEQN */
+ int before, after;
+ if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
+#endif /* NEQN */
+ eqnht = eht[p1];
+ printf(".ds %d ", p1);
+ /* suppposed to leave room for a subscript or superscript */
+#ifndef NEQN
+ before = eht[p1] - ebase[p1] - VERT(EM(1.2, ps));
+#else /* NEQN */
+ before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */
+#endif /* NEQN */
+ if (spaceval != NULL)
+ printf("\\x'0-%s'", spaceval);
+ else if (before > 0)
+#ifndef NEQN
+ printf("\\x'0-%gp'", before);
+#else /* NEQN */
+ printf("\\x'0-%du'", before);
+#endif /* NEQN */
+ printf("\\f%c\\s%s\\*(%d%s\n",
+ gfont, tsize(gsize), p1, ital(rfont[p1]) ? "\\|" : "");
+ printf(".ie \\n(.X=0 .as %d \\s\\n(99\n", p1);
+ printf(".el .as %d \\s[\\n(99]\n", p1);
+ printf(".as %d \\f\\n(98", p1);
+#ifndef NEQN
+ after = ebase[p1] - VERT(EM(0.2, ps));
+#else /* NEQN */
+ after = ebase[p1] - VERT(1);
+#endif /* NEQN */
+ if (spaceval == NULL && after > 0)
+#ifndef NEQN
+ printf("\\x'%gp'", after);
+#else /* NEQN */
+ printf("\\x'%du'", after);
+#endif /* NEQN */
+ putchar('\n');
+ eqnreg = p1;
+ if (spaceval != NULL) {
+ free(spaceval);
+ spaceval = NULL;
+ }
+
+}
+
+float
+max(float i,float j) {
+ return (i>j ? i : j);
+}
+
+int
+oalloc(void) {
+ int i;
+ for (i=11; i<100; i++)
+ if (used[i]++ == 0) return(i);
+ error( FATAL, "no eqn strings left", i);
+ return(0);
+}
+
+void
+ofree(int n) {
+ used[n] = 0;
+}
+
+void
+setps(float p) {
+ printf(".ps %g\n", EFFPS(p));
+}
+
+void
+nrwid(int n1, float p, int n2) {
+ printf(".nr %d \\w'\\s%s\\*(%d'\n", n1, tsize(EFFPS(p)), n2);
+}
+
+void
+setfile(int argc, char **argv) {
+ static char *nullstr = "-";
+
+ svargc = --argc;
+ svargv = argv;
+ while (svargc > 0 && svargv[1][0] == '-') {
+ switch (svargv[1][1]) {
+
+ case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
+ case 's': gsize = atof(&svargv[1][2]); break;
+ case 'p': deltaps = atof(&svargv[1][2]); break;
+ case 'f': gfont = svargv[1][2]; break;
+ case 'e': noeqn++; break;
+ case 'r': /*resolution = atoi(&svargv[1][2]);*/ break;
+ case 0: goto endargs;
+ default: dbg = 1;
+ }
+ svargc--;
+ svargv++;
+ }
+ endargs:
+ ifile = 1;
+ linect = 1;
+ if (svargc <= 0) {
+ curfile = stdin;
+ svargv[1] = nullstr;
+ }
+ else
+ openinfile(); /* opens up the first input file */
+}
+
+void
+yyerror(char *unused) {;}
+
+void
+init(void) {
+ ct = 0;
+ ps = gsize;
+ ft = gfont;
+ setps(ps);
+ printf(".ft %c\n", ft);
+}
+
+void
+error(int fatal, const char *s1, ...) {
+ va_list ap;
+
+ if (fatal>0)
+ printf("%s fatal error: ", progname);
+ va_start(ap, s1);
+ vfprintf(stdout, s1, ap);
+ va_end(ap);
+ printf("\nfile %s, between lines %d and %d\n",
+ svargv[ifile], eqline, linect);
+ fprintf(stderr, "%s: ", progname);
+ if (fatal>0)
+ fprintf(stderr, "fatal error: ");
+ va_start(ap, s1);
+ vfprintf(stderr, s1, ap);
+ va_end(ap);
+ fprintf(stderr, "\nfile %s, between lines %d and %d\n",
+ svargv[ifile], eqline, linect);
+ if (fatal > 0)
+ eqnexit(1);
+}
diff --git a/eqn/lex.c b/eqn/lex.c
new file mode 100644
index 0000000000000..2e7884efc170c
--- /dev/null
+++ b/eqn/lex.c
@@ -0,0 +1,308 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "lex.c 1.6 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)lex.c 1.7 (gritter) 11/21/07
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+#define SSIZE 400
+char token[SSIZE];
+int sp;
+#define putbak(c) *ip++ = c;
+#define PUSHBACK 300 /* maximum pushback characters */
+char ibuf[PUSHBACK+SSIZE]; /* pushback buffer for definitions, etc. */
+char *ip = ibuf;
+
+int
+gtc(void) {
+ loop:
+ if (ip > ibuf)
+ return(*--ip); /* already present */
+ lastchar = getc(curfile);
+ if (lastchar=='\n')
+ linect++;
+ if (lastchar != EOF)
+ return(lastchar);
+ if (++ifile > svargc) {
+ return(EOF);
+ }
+ fclose(curfile);
+ linect = 1;
+ if (openinfile() == 0)
+ goto loop;
+ return(EOF);
+}
+/*
+ * open file indexed by ifile in svargv, return non zero if fail
+ */
+int
+openinfile(void)
+{
+ if (strcmp(svargv[ifile], "-") == 0){
+ curfile = stdin;
+ return(0);
+ } else if ((curfile=fopen(svargv[ifile], "r")) != NULL){
+ return(0);
+ }
+ error(FATAL, "can't open file %s", svargv[ifile]);
+ return(1);
+}
+
+void
+pbstr(register char *str)
+{
+ register char *p;
+
+ p = str;
+ while (*p++);
+ --p;
+ if (ip >= &ibuf[PUSHBACK])
+ error( FATAL, "pushback overflow");
+ while (p > str)
+ putbak(*--p);
+}
+
+int
+yylex(void) {
+ register int c;
+ tbl *tp;
+ extern tbl *keytbl[], *deftbl[];
+
+ beg:
+ while ((c=gtc())==' ' || c=='\n')
+ ;
+ yylval.token = c;
+ switch(c) {
+
+ case EOF:
+ return(EOF);
+ case '~':
+ return(SPACE);
+ case '^':
+ return(THIN);
+ case '\t':
+ return(TAB);
+ case '{':
+ return('{');
+ case '}':
+ return('}');
+ case '"':
+ for (sp=0; (c=gtc())!='"' && c != '\n'; ) {
+ if (c == '\\')
+ if ((c = gtc()) != '"')
+ token[sp++] = '\\';
+ token[sp++] = c;
+ if (sp>=SSIZE)
+ error(FATAL, "quoted string %.20s... too long", token);
+ }
+ token[sp]='\0';
+ yylval.str = &token[0];
+ if (c == '\n')
+ error(!FATAL, "missing \" in %.20s", token);
+ return(QTEXT);
+ }
+ if (c==righteq)
+ return(EOF);
+
+ putbak(c);
+ if (getstr(token, SSIZE)) return EOF;
+ if (dbg)printf(".\tlex token = |%s|\n", token);
+ if ((tp = lookup(deftbl, token, NULL)) != NULL) {
+ putbak(' ');
+ pbstr(tp->defn);
+ putbak(' ');
+ if (dbg)
+ printf(".\tfound %s|=%s|\n", token, tp->defn);
+ }
+ else if ((tp = lookup(keytbl, token, NULL)) == NULL) {
+ if(dbg)printf(".\t%s is not a keyword\n", token);
+ return(CONTIG);
+ }
+ else if ((intptr_t)tp->defn == DEFINE || (intptr_t)tp->defn == NDEFINE || (intptr_t)tp->defn == TDEFINE)
+ define((intptr_t)tp->defn);
+ else if (tp->defn == (char *) DELIM)
+ delim();
+ else if (tp->defn == (char *) GSIZE)
+ globsize();
+ else if (tp->defn == (char *) GFONT)
+ globfont();
+ else if (tp->defn == (char *) INCLUDE)
+ include();
+ else if (tp->defn == (char *) SPACE)
+ space();
+ else {
+ return((intptr_t) tp->defn);
+ }
+ goto beg;
+}
+
+/* returns: 1 if ".{WS}+EN" found, 0 else */
+int
+getstr(char *s, register int n) {
+ register int c;
+ register char *p;
+ enum { INI = 0, OTH, SP, C1, C2, PB } st = INI;
+
+ p = s;
+ while ((c = gtc()) == ' ' || c == '\n')
+ ;
+ if (c == EOF) {
+ *s = 0;
+ return 0;
+ }
+ while (((c != ' ' && c != '\t') || st == SP) && c != '\n' && c != '{'
+ && c != '}' && c != '"' && c != '~' && c != '^' && c != righteq) {
+ if (c == '\\')
+ if ((c = gtc()) != '"')
+ *p++ = '\\';
+ switch (st) {
+ case INI:
+ st = c == '.' ? SP : OTH;
+ break;
+ case SP:
+ if (c == 'E') st = C1;
+ else if (c != ' ' && c != '\t') st = PB;
+ break;
+ case C1:
+ st = c == 'N' ? C2 : PB;
+ break;
+ case C2:
+ st = PB;
+ break;
+ default: ;
+ }
+ *p++ = c;
+ if (st == PB)
+ goto TF;
+ else {
+ if (--n <= 0)
+ error(FATAL, "token %.20s... too long", s);
+ c = gtc();
+ }
+ }
+ if (c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq)
+ putbak(c);
+TF:
+ if (st == SP || st == C1 || st == PB) {
+ while (--p != s) putbak(*p);
+ p++;
+ }
+ *p = '\0';
+ yylval.str = s;
+ return st == C2;
+}
+
+int
+cstr(char *s, int quote, int maxs) {
+ int del, c, i;
+
+ s[0] = 0;
+ while((del=gtc()) == ' ' || del == '\t');
+ if (quote)
+ for (i=0; (c=gtc()) != del && c != EOF;) {
+ s[i++] = c;
+ if (i >= maxs)
+ return(1); /* disaster */
+ }
+ else {
+ if (del == '\n')
+ return (1);
+ s[0] = del;
+ for (i=1; (c=gtc())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) {
+ s[i++]=c;
+ if (i >= maxs)
+ return(1); /* disaster */
+ }
+ }
+ s[i] = '\0';
+ if (c == EOF)
+ error(FATAL, "Unexpected end of input at %.20s", s);
+ return(0);
+}
+
+void
+define(int type) {
+ char *p1, *p2;
+ extern tbl *deftbl[];
+
+ getstr(token, SSIZE); /* get name */
+ if (type != DEFINE) {
+ cstr(token, 1, SSIZE); /* skip the definition too */
+ return;
+ }
+ p1 = strsave(token);
+ if (cstr(token, 1, SSIZE))
+ error(FATAL, "Unterminated definition at %.20s", token);
+ p2 = strsave(token);
+ lookup(deftbl, p1, p2);
+ if (dbg)printf(".\tname %s defined as %s\n", p1, p2);
+}
+
+char *spaceval = NULL;
+
+void
+space(void) /* collect line of form "space amt" to replace \x in output */
+{
+ getstr(token, SSIZE);
+ spaceval = strsave(token);
+ if (dbg) printf(".\tsetting space to %s\n", token);
+}
+
+
+char *
+strsave(char *s)
+{
+ register char *q;
+ size_t l;
+
+ l = strlen(s)+1;
+ q = malloc(l);
+ if (q == NULL)
+ error(FATAL, "out of space in strsave on %s", s);
+ n_strcpy(q, s, l);
+ return(q);
+}
+
+void
+include(void) {
+ error(!FATAL, "Include not yet implemented");
+}
+
+void
+delim(void) {
+ yyval.token = eqnreg = 0;
+ if (cstr(token, 0, SSIZE) || token[0] & 0200 || token[1] & 0200)
+ error(FATAL, "Bizarre delimiters at %.20s", token);
+ lefteq = token[0];
+ righteq = token[1];
+ if (lefteq == 'o' && righteq == 'f')
+ lefteq = righteq = '\0';
+}
diff --git a/eqn/lookup.c b/eqn/lookup.c
new file mode 100644
index 0000000000000..7b303fe9e0d40
--- /dev/null
+++ b/eqn/lookup.c
@@ -0,0 +1,261 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "lookup.c 1.5 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)lookup.c 1.5 (gritter) 9/18/05
+ */
+
+#include "e.h"
+#include "y.tab.h"
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#define TBLSIZE 100
+
+tbl *keytbl[TBLSIZE]; /* key words */
+tbl *restbl[TBLSIZE]; /* reserved words */
+tbl *deftbl[TBLSIZE]; /* user-defined names */
+
+struct {
+ char *key;
+ int keyval;
+} keyword[] ={
+ { "sub", SUB },
+ { "sup", SUP },
+ { ".EN", EOF },
+ { "from", FROM },
+ { "to", TO },
+ { "sum", SUM },
+ { "hat", HAT },
+ { "vec", VEC },
+ { "dyad", DYAD },
+ { "dot", DOT },
+ { "dotdot", DOTDOT },
+ { "bar", BAR },
+ { "tilde", TILDE },
+ { "under", UNDER },
+ { "prod", PROD },
+ { "int", INT },
+ { "integral", INT },
+ { "union", UNION },
+ { "inter", INTER },
+ { "pile", PILE },
+ { "lpile", LPILE },
+ { "cpile", CPILE },
+ { "rpile", RPILE },
+ { "over", OVER },
+ { "sqrt", SQRT },
+ { "above", ABOVE },
+ { "size", SIZE },
+ { "font", FONT },
+ { "fat", FAT },
+ { "roman", ROMAN },
+ { "italic", ITALIC },
+ { "bold", BOLD },
+ { "left", LEFT },
+ { "right", RIGHT },
+ { "delim", DELIM },
+ { "define", DEFINE },
+
+#ifdef NEQN /* make ndefine synonym for define, tdefine a no-op */
+
+ { "tdefine", TDEFINE },
+ { "ndefine", DEFINE },
+
+#else /* tdefine = define, ndefine = no-op */
+
+ { "tdefine", DEFINE },
+ { "ndefine", NDEFINE },
+
+#endif
+
+ { "gsize", GSIZE },
+ { ".gsize", GSIZE },
+ { "gfont", GFONT },
+ { "include", INCLUDE },
+ { "up", UP },
+ { "down", DOWN },
+ { "fwd", FWD },
+ { "back", BACK },
+ { "mark", MARK },
+ { "lineup", LINEUP },
+ { "matrix", MATRIX },
+ { "col", COL },
+ { "lcol", LCOL },
+ { "ccol", CCOL },
+ { "rcol", RCOL },
+ { NULL, 0 }
+};
+
+struct {
+ char *res;
+ char *resval;
+} resword[] ={
+ { ">=", "\\(>=" },
+ { "<=", "\\(<=" },
+ { "==", "\\(==" },
+ { "!=", "\\(!=" },
+ { "+-", "\\(+-" },
+ { "->", "\\(->" },
+ { "<-", "\\(<-" },
+ { "inf", "\\(if" },
+ { "infinity", "\\(if" },
+ { "partial", "\\(pd" },
+ { "half", "\\f1\\(12\\fP" },
+ { "prime", "\\f1\\(fm\\fP" },
+ { "dollar", "\\f1$\\fP" },
+ { "nothing", "" },
+ { "times", "\\(mu" },
+ { "del", "\\(gr" },
+ { "grad", "\\(gr" },
+#ifdef NEQN
+ { "<<", "<<" },
+ { ">>", ">>" },
+ { "approx", "~\b\\d~\\u" },
+ { "cdot", "\\v'-.5'.\\v'.5'" },
+ { "...", "..." },
+ { ",...,", ",...," },
+#else
+ { "<<", "<\\h'-.3m'<" },
+ { ">>", ">\\h'-.3m'>" },
+ { "approx", "\\v'-.2m'\\z\\(ap\\v'.25m'\\(ap\\v'-.05m'" },
+ { "cdot", "\\v'-.3m'.\\v'.3m'" },
+ { "...", "\\v'-.3m'\\ .\\ .\\ .\\ \\v'.3m'" },
+ { ",...,", ",\\ .\\ .\\ .\\ ,\\|" },
+#endif
+
+ { "alpha", "\\(*a" },
+ { "ALPHA", "\\(*A" },
+ { "beta", "\\(*b" },
+ { "BETA", "\\(*B" },
+ { "gamma", "\\(*g" },
+ { "GAMMA", "\\(*G" },
+ { "delta", "\\(*d" },
+ { "DELTA", "\\(*D" },
+ { "epsilon", "\\(*e" },
+ { "EPSILON", "\\(*E" },
+ { "omega", "\\(*w" },
+ { "OMEGA", "\\(*W" },
+ { "lambda", "\\(*l" },
+ { "LAMBDA", "\\(*L" },
+ { "mu", "\\(*m" },
+ { "MU", "\\(*M" },
+ { "nu", "\\(*n" },
+ { "NU", "\\(*N" },
+ { "theta", "\\(*h" },
+ { "THETA", "\\(*H" },
+ { "phi", "\\(*f" },
+ { "PHI", "\\(*F" },
+ { "pi", "\\(*p" },
+ { "PI", "\\(*P" },
+ { "sigma", "\\(*s" },
+ { "SIGMA", "\\(*S" },
+ { "xi", "\\(*c" },
+ { "XI", "\\(*C" },
+ { "zeta", "\\(*z" },
+ { "ZETA", "\\(*Z" },
+ { "iota", "\\(*i" },
+ { "IOTA", "\\(*I" },
+ { "eta", "\\(*y" },
+ { "ETA", "\\(*Y" },
+ { "kappa", "\\(*k" },
+ { "KAPPA", "\\(*K" },
+ { "rho", "\\(*r" },
+ { "RHO", "\\(*R" },
+ { "tau", "\\(*t" },
+ { "TAU", "\\(*T" },
+ { "omicron", "\\(*o" },
+ { "OMICRON", "\\(*O" },
+ { "upsilon", "\\(*u" },
+ { "UPSILON", "\\(*U" },
+ { "psi", "\\(*q" },
+ { "PSI", "\\(*Q" },
+ { "chi", "\\(*x" },
+ { "CHI", "\\(*X" },
+ { "and", "\\f1and\\fP" },
+ { "for", "\\f1for\\fP" },
+ { "if", "\\f1if\\fP" },
+ { "Re", "\\f1Re\\fP" },
+ { "Im", "\\f1Im\\fP" },
+ { "sin", "\\f1sin\\fP" },
+ { "cos", "\\f1cos\\fP" },
+ { "tan", "\\f1tan\\fP" },
+ { "sec", "\\f1sec\\fP" },
+ { "csc", "\\f1csc\\fP" },
+ { "arc", "\\f1arc\\fP" },
+ { "asin", "\\f1asin\\fP" },
+ { "acos", "\\f1acos\\fP" },
+ { "atan", "\\f1atan\\fP" },
+ { "asec", "\\f1asec\\fP" },
+ { "acsc", "\\f1acsc\\fP" },
+ { "sinh", "\\f1sinh\\fP" },
+ { "coth", "\\f1coth\\fP" },
+ { "tanh", "\\f1tanh\\fP" },
+ { "cosh", "\\f1cosh\\fP" },
+ { "lim", "\\f1lim\\fP" },
+ { "log", "\\f1log\\fP" },
+ { "max", "\\f1max\\fP" },
+ { "min", "\\f1min\\fP" },
+ { "ln", "\\f1ln\\fP" },
+ { "exp", "\\f1exp\\fP" },
+ { "det", "\\f1det\\fP" },
+ { NULL, NULL }
+};
+
+tbl *
+lookup(tbl **tblp, char *name, char *defn) /* find name in tbl. if defn non-null, install */
+{
+ register tbl *p;
+ register int h;
+ register unsigned char *s = (unsigned char *)name;
+
+ for (h = 0; *s != '\0'; )
+ h += *s++;
+ h %= TBLSIZE;
+
+ for (p = tblp[h]; p != NULL; p = p->next)
+ if (strcmp(name, p->name) == 0) { /* found it */
+ if (defn != NULL)
+ p->defn = defn;
+ return(p);
+ }
+ /* didn't find it */
+ if (defn == NULL)
+ return(NULL);
+ p = (tbl *) malloc(sizeof (tbl));
+ if (p == NULL)
+ error(FATAL, "out of space in lookup");
+ p->name = name;
+ p->defn = defn;
+ p->next = tblp[h];
+ tblp[h] = p;
+ return(p);
+}
+
+void
+init_tbl(void) /* initialize all tables */
+{
+ int i;
+
+ for (i = 0; keyword[i].key != NULL; i++)
+ lookup(keytbl, keyword[i].key, (char *)(intptr_t)keyword[i].keyval);
+ for (i = 0; resword[i].res != NULL; i++)
+ lookup(restbl, resword[i].res, resword[i].resval);
+}
diff --git a/eqn/mark.c b/eqn/mark.c
new file mode 100644
index 0000000000000..31193152811d6
--- /dev/null
+++ b/eqn/mark.c
@@ -0,0 +1,49 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "mark.c 1.3 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)mark.c 1.3 (gritter) 8/12/05
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+mark(int p1) {
+ markline = 1;
+ printf(".ds %d \\k(97\\*(%d\n", p1, p1);
+ yyval.token = p1;
+ if(dbg)printf(".\tmark %d\n", p1);
+}
+
+void
+lineup(int p1) {
+ markline = 1;
+ if (p1 == 0) {
+ yyval.token = oalloc();
+ printf(".ds %d \\h'|\\n(97u'\n", yyval.token);
+ }
+ if(dbg)printf(".\tlineup %d\n", p1);
+}
diff --git a/eqn/matrix.c b/eqn/matrix.c
new file mode 100644
index 0000000000000..53b674f4b2277
--- /dev/null
+++ b/eqn/matrix.c
@@ -0,0 +1,108 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "matrix.c 1.3 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)matrix.c 1.4 (gritter) 10/29/05
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+column(int type, int p1) {
+ int i;
+
+ lp[p1] = ct - p1 - 1;
+ if( dbg ){
+ printf(".\t%d column of", type);
+ for( i=p1+1; i<ct; i++ )
+ printf(" S%d", lp[i]);
+ printf(", rows=%d\n",lp[p1]);
+ }
+ lp[ct++] = type;
+}
+
+void
+matrix(int p1) {
+#ifndef NEQN
+ float hb, b;
+#else /* NEQN */
+ int hb, b;
+#endif /* NEQN */
+ int nrow, ncol, i, j, k, val[100];
+ char *space;
+
+ space = "\\ \\ ";
+ nrow = lp[p1]; /* disaster if rows inconsistent */
+ ncol = 0;
+ for( i=p1; i<ct; i += lp[i]+2 ){
+ ncol++;
+ if(dbg)printf(".\tcolct=%d\n",lp[i]);
+ }
+ for( k=1; k<=nrow; k++ ) {
+ hb = b = 0;
+ j = p1 + k;
+ for( i=0; i<ncol; i++ ) {
+ hb = max(hb, eht[lp[j]]-ebase[lp[j]]);
+ b = max(b, ebase[lp[j]]);
+ j += nrow + 2;
+ }
+#ifndef NEQN
+ if(dbg)printf(".\trow %d: b=%g, hb=%g\n", k, b, hb);
+#else /* NEQN */
+ if(dbg)printf(".\trow %d: b=%d, hb=%d\n", k, b, hb);
+#endif /* NEQN */
+ j = p1 + k;
+ for( i=0; i<ncol; i++ ) {
+ ebase[lp[j]] = b;
+ eht[lp[j]] = b + hb;
+ j += nrow + 2;
+ }
+ }
+ j = p1;
+ for( i=0; i<ncol; i++ ) {
+ lpile(lp[j+lp[j]+1], j+1, j+lp[j]+1);
+ val[i] = yyval.token;
+ j += nrow + 2;
+ }
+ yyval.token = oalloc();
+ eht[yyval.token] = eht[val[0]];
+ ebase[yyval.token] = ebase[val[0]];
+ lfont[yyval.token] = rfont[yyval.token] = 0;
+#ifndef NEQN
+ if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%g, b=%g\n",
+ yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]);
+#else /* NEQN */
+ if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%d, b=%d\n",
+ yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]);
+#endif /* NEQN */
+ printf(".ds %d \"", yyval.token);
+ for( i=0; i<ncol; i++ ) {
+ printf("\\*(%d%s", val[i], i==ncol-1 ? "" : space);
+ ofree(val[i]);
+ }
+ printf("\n");
+ ct = p1;
+}
diff --git a/eqn/move.c b/eqn/move.c
new file mode 100644
index 0000000000000..26403ce94659d
--- /dev/null
+++ b/eqn/move.c
@@ -0,0 +1,70 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "move.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)move.c 1.4 (gritter) 10/29/05
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+move(int dir, int amt, int p) {
+#ifndef NEQN
+ float a;
+#else /* NEQN */
+ int a;
+#endif /* NEQN */
+
+ yyval.token = p;
+#ifndef NEQN
+ a = VERT(EM(amt/100.0, EFFPS(ps)));
+#else /* NEQN */
+ a = VERT( (amt+49)/50 ); /* nearest number of half-lines */
+#endif /* NEQN */
+ printf(".ds %d ", yyval.token);
+ if( dir == FWD || dir == BACK ) /* fwd, back */
+#ifndef NEQN
+ printf("\\h'%s%gp'\\*(%d\n", (dir==BACK) ? "-" : "", a, p);
+#else /* NEQN */
+ printf("\\h'%s%du'\\*(%d\n", (dir==BACK) ? "-" : "", a, p);
+#endif /* NEQN */
+ else if (dir == UP)
+#ifndef NEQN
+ printf("\\v'-%gp'\\*(%d\\v'%gp'\n", a, p, a);
+#else /* NEQN */
+ printf("\\v'-%du'\\*(%d\\v'%du'\n", a, p, a);
+#endif /* NEQN */
+ else if (dir == DOWN)
+#ifndef NEQN
+ printf("\\v'%gp'\\*(%d\\v'-%gp'\n", a, p, a);
+ if(dbg)printf(".\tmove %d dir %d amt %g; h=%g b=%g\n",
+ p, dir, a, eht[yyval.token], ebase[yyval.token]);
+#else /* NEQN */
+ printf("\\v'%du'\\*(%d\\v'-%du'\n", a, p, a);
+ if(dbg)printf(".\tmove %d dir %d amt %d; h=%d b=%d\n",
+ p, dir, a, eht[yyval.token], ebase[yyval.token]);
+#endif /* NEQN */
+}
diff --git a/eqn/neqn.d/Makefile.mk b/eqn/neqn.d/Makefile.mk
new file mode 100644
index 0000000000000..bb924fcdacf62
--- /dev/null
+++ b/eqn/neqn.d/Makefile.mk
@@ -0,0 +1,53 @@
+VPATH=..
+OBJ = diacrit.o e.o eqnbox.o font.o fromto.o funny.o glob.o integral.o \
+ io.o lex.o lookup.o mark.o matrix.o move.o over.o paren.o pile.o \
+ shift.o size.o sqrt.o text.o version.o
+
+FLAGS = -I. -I.. -I../../include -DNEQN $(DEFINES)
+
+.c.o:
+ $(CC) $(CFLAGS) $(WARN) $(CPPFLAGS) $(FLAGS) -c $<
+
+all: neqn
+
+neqn: $(OBJ)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(LIBS) -o neqn
+
+e.c: e.y
+ $(YACC) -d ../e.y
+ sed -f ../yyval.sed <y.tab.c >$@
+
+y.tab.h: e.c
+
+install:
+ $(INSTALL) -c neqn $(ROOT)$(BINDIR)/neqn
+ $(STRIP) $(ROOT)$(BINDIR)/neqn
+ rm -f $(ROOT)$(MANDIR)/man1/neqn.1
+ ln -s eqn.1 $(ROOT)$(MANDIR)/man1/neqn.1
+
+clean:
+ rm -f $(OBJ) neqn e.c y.tab.* core log *~
+
+mrproper: clean
+
+diacrit.o: ../diacrit.c ../e.h y.tab.h
+eqnbox.o: ../eqnbox.c ../e.h
+font.o: ../font.c ../e.h
+fromto.o: ../fromto.c ../e.h
+funny.o: ../funny.c ../e.h y.tab.h
+glob.o: ../glob.c ../e.h
+integral.o: ../integral.c ../e.h y.tab.h
+io.o: ../io.c ../e.h
+lex.o: ../lex.c ../e.h y.tab.h
+lookup.o: ../lookup.c ../e.h y.tab.h
+mark.o: ../mark.c ../e.h
+matrix.o: ../matrix.c ../e.h
+move.o: ../move.c ../e.h y.tab.h
+over.o: ../over.c ../e.h
+paren.o: ../paren.c ../e.h
+pile.o: ../pile.c ../e.h
+shift.o: ../shift.c ../e.h y.tab.h
+size.o: ../size.c ../e.h
+sqrt.o: ../sqrt.c ../e.h
+text.o: ../text.c ../e.h y.tab.h
+e.o: e.c ../e.h
diff --git a/eqn/over.c b/eqn/over.c
new file mode 100644
index 0000000000000..854709a69988d
--- /dev/null
+++ b/eqn/over.c
@@ -0,0 +1,84 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "over.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)over.c 1.5 (gritter) 10/19/06
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+boverb(int p1, int p2) {
+ int treg;
+#ifndef NEQN
+ float h, b, d;
+#else /* NEQN */
+ int h, b, d;
+#endif /* NEQN */
+
+ treg = oalloc();
+ yyval.token = p1;
+#ifndef NEQN
+ d = VERT(EM(0.3, ps));
+ h = eht[p1] + eht[p2] + d;
+#else /* NEQN */
+ d = VERT(1);
+ h = eht[p1] + eht[p2];
+#endif /* NEQN */
+ b = eht[p2] - d;
+#ifndef NEQN
+ if(dbg)printf(".\tb:bob: S%d <- S%d over S%d; b=%g, h=%g\n",
+ yyval.token, p1, p2, b, h);
+#else /* NEQN */
+ if(dbg)printf(".\tb:bob: S%d <- S%d over S%d; b=%d, h=%d\n",
+ yyval.token, p1, p2, b, h);
+#endif /* NEQN */
+ nrwid(p1, ps, p1);
+ nrwid(p2, ps, p2);
+ printf(".nr %d \\n(%d\n", treg, p1);
+ printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2);
+#ifndef NEQN
+ printf(".nr %d \\n(%d+\\s%s.5m\\s0\n", treg, treg, tsize(EFFPS(ps)));
+ printf(".ds %d \\v'%gp'\\h'\\n(%du-\\n(%du/2u'\\*(%d\\\n",
+ yyval.token, eht[p2]-ebase[p2]-d, treg, p2, p2);
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%gp'\\*(%d\\\n",
+ p2, p1, -(eht[p2]-ebase[p2]+d+ebase[p1]), p1);
+ printf("\\h'-\\n(%du-\\n(%du/2u+.1m'\\v'%gp'\\l'\\n(%du-.2m'\\h'.1m'\\v'%gp'\n",
+ treg, p1, ebase[p1]+d, treg, d);
+#else /* NEQN */
+ printf(".ds %d \\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d\\\n",
+ yyval.token, eht[p2]-ebase[p2]-d, treg, p2, p2);
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%du'\\*(%d\\\n",
+ p2, p1, -eht[p2]+ebase[p2]-ebase[p1], p1);
+ printf("\\h'-\\n(%du-\\n(%du-2u/2u'\\v'%du'\\l'\\n(%du'\\v'%du'\n",
+ treg, p1, ebase[p1], treg, d);
+#endif /* NEQN */
+ ebase[yyval.token] = b;
+ eht[yyval.token] = h;
+ lfont[yyval.token] = rfont[yyval.token] = 0;
+ ofree(p2);
+ ofree(treg);
+}
diff --git a/eqn/paren.c b/eqn/paren.c
new file mode 100644
index 0000000000000..a55febdb96358
--- /dev/null
+++ b/eqn/paren.c
@@ -0,0 +1,172 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "paren.c 1.5 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)paren.c 1.4 (gritter) 10/29/05
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+paren(int leftc, int p1, int rightc) {
+ int n, m, j;
+#ifndef NEQN
+ float v, h1, b1;
+#else /* NEQN */
+ int v, h1, b1;
+#endif /* NEQN */
+ h1 = eht[p1]; b1 = ebase[p1];
+ yyval.token = p1;
+#ifndef NEQN
+ lfont[yyval.token] = rfont[yyval.token] = 0;
+ n = (h1 + EM(1.0, EFFPS(ps)) - 1) / EM(1.0, EFFPS(ps));
+#else /* NEQN */
+ n = max(b1+VERT(1), h1-b1-VERT(1)) / VERT(1);
+#endif /* NEQN */
+ if( n<2 ) n = 1;
+ m = n-2;
+ if (leftc=='{' || rightc == '}') {
+ n = n%2 ? n : n+1;
+ if( n<3 ) n=3;
+ m = n-3;
+ }
+#ifndef NEQN
+ eht[yyval.token] = VERT(EM(n, ps));
+ ebase[yyval.token] = b1 + (eht[yyval.token]-h1)/2;
+ v = b1 - h1/2 + VERT(EM(0.4, ps));
+ printf(".ds %d \\|\\v'%gp'", yyval.token, v);
+#else /* NEQN */
+ eht[yyval.token] = VERT(2 * n);
+ ebase[yyval.token] = (n)/2 * VERT(2);
+ if (n%2 == 0)
+ ebase[yyval.token] -= VERT(1);
+ v = b1 - h1/2 + VERT(1);
+ printf(".ds %d \\|\\v'%du'", yyval.token, v);
+#endif /* NEQN */
+ switch( leftc ) {
+ case 'n': /* nothing */
+ case '\0':
+ break;
+ case 'f': /* floor */
+ if (n <= 1)
+ printf("\\(lf");
+ else
+ brack(m, "\\(bv", "\\(bv", "\\(lf");
+ break;
+ case 'c': /* ceiling */
+ if (n <= 1)
+ printf("\\(lc");
+ else
+ brack(m, "\\(lc", "\\(bv", "\\(bv");
+ break;
+ case '{':
+ printf("\\b'\\(lt");
+ for(j = 0; j < m; j += 2) printf("\\(bv");
+ printf("\\(lk");
+ for(j = 0; j < m; j += 2) printf("\\(bv");
+ printf("\\(lb'");
+ break;
+ case '(':
+ brack(m, "\\(lt", "\\(bv", "\\(lb");
+ break;
+ case '[':
+ brack(m, "\\(lc", "\\(bv", "\\(lf");
+ break;
+ case '|':
+ brack(m, "\\(bv", "\\(bv", "\\(bv");
+ break;
+ default:
+ brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc);
+ break;
+ }
+#ifndef NEQN
+ printf("\\v'%gp'\\*(%d", -v, p1);
+#else /* NEQN */
+ printf("\\v'%du'\\*(%d", -v, p1);
+#endif /* NEQN */
+ if( rightc ) {
+#ifndef NEQN
+ printf("\\|\\v'%gp'", v);
+#else /* NEQN */
+ printf("\\|\\v'%du'", v);
+#endif /* NEQN */
+ switch( rightc ) {
+ case 'f': /* floor */
+ if (n <= 1)
+ printf("\\(rf");
+ else
+ brack(m, "\\(bv", "\\(bv", "\\(rf");
+ break;
+ case 'c': /* ceiling */
+ if (n <= 1)
+ printf("\\(rc");
+ else
+ brack(m, "\\(rc", "\\(bv", "\\(bv");
+ break;
+ case '}':
+ printf("\\b'\\(rt");
+ for(j = 0; j< m; j += 2)printf("\\(bv");
+ printf("\\(rk");
+ for(j = 0; j< m; j += 2) printf("\\(bv");
+ printf("\\(rb'");
+ break;
+ case ']':
+ brack(m, "\\(rc", "\\(bv", "\\(rf");
+ break;
+ case ')':
+ brack(m, "\\(rt", "\\(bv", "\\(rb");
+ break;
+ case '|':
+ brack(m, "\\(bv", "\\(bv", "\\(bv");
+ break;
+ default:
+ brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc);
+ break;
+ }
+#ifndef NEQN
+ printf("\\v'%gp'", -v);
+#else /* NEQN */
+ printf("\\v'%du'", -v);
+#endif /* NEQN */
+ }
+ printf("\n");
+#ifndef NEQN
+ if(dbg)printf(".\tcurly: h=%g b=%g n=%d v=%g l=%c, r=%c\n",
+ eht[yyval.token], ebase[yyval.token], n, v, leftc, rightc);
+#else /* NEQN */
+ if(dbg)printf(".\tcurly: h=%d b=%d n=%d v=%d l=%c, r=%c\n",
+ eht[yyval.token], ebase[yyval.token], n, v, leftc, rightc);
+#endif /* NEQN */
+}
+
+void
+brack(int m, char *t, char *c, char *b) {
+ int j;
+ printf("\\b'%s", t);
+ for( j=0; j<m; j++)
+ printf("%s", c);
+ printf("%s'", b);
+}
diff --git a/eqn/pile.c b/eqn/pile.c
new file mode 100644
index 0000000000000..44f0379f8be72
--- /dev/null
+++ b/eqn/pile.c
@@ -0,0 +1,137 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "pile.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)pile.c 1.4 (gritter) 10/29/05
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+lpile(int type, int p1, int p2) {
+ int i, nlist, nlist2, mid;
+#ifndef NEQN
+ float h, b, bi, hi, gap;
+#else /* NEQN */
+ int h, b, bi, hi, gap;
+#endif /* NEQN */
+ yyval.token = oalloc();
+#ifndef NEQN
+ gap = VERT(EM(0.4, ps)); /* 4/10 m between blocks */
+#else /* NEQN */
+ gap = VERT(1);
+#endif /* NEQN */
+ if( type=='-' ) gap = 0;
+ nlist = p2 - p1;
+ nlist2 = (nlist+1)/2;
+ mid = p1 + nlist2 -1;
+ h = 0;
+ for( i=p1; i<p2; i++ )
+ h += eht[lp[i]];
+ eht[yyval.token] = h + (nlist-1)*gap;
+ b = 0;
+ for( i=p2-1; i>mid; i-- )
+ b += eht[lp[i]] + gap;
+ ebase[yyval.token] = (nlist%2) ? b + ebase[lp[mid]]
+#ifndef NEQN
+ : b - VERT(EM(0.5, ps)) - gap;
+#else /* NEQN */
+ : b - VERT(1) - gap;
+#endif /* NEQN */
+ if(dbg) {
+ printf(".\tS%d <- %c pile of:", yyval.token, type);
+ for( i=p1; i<p2; i++)
+ printf(" S%d", lp[i]);
+#ifndef NEQN
+ printf(";h=%g b=%g\n", eht[yyval.token], ebase[yyval.token]);
+#else /* NEQN */
+ printf(";h=%d b=%d\n", eht[yyval.token], ebase[yyval.token]);
+#endif /* NEQN */
+ }
+ nrwid(lp[p1], ps, lp[p1]);
+ printf(".nr %d \\n(%d\n", yyval.token, lp[p1]);
+ for( i = p1+1; i<p2; i++ ) {
+ nrwid(lp[i], ps, lp[i]);
+ printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n",
+ lp[i], yyval.token, yyval.token, lp[i]);
+ }
+#ifndef NEQN
+ printf(".ds %d \\v'%gp'\\h'%du*\\n(%du'\\\n", yyval.token, ebase[yyval.token],
+ type=='R' ? 1 : 0, yyval.token);
+#else /* NEQN */
+ printf(".ds %d \\v'%du'\\h'%du*\\n(%du'\\\n", yyval.token, ebase[yyval.token],
+ type=='R' ? 1 : 0, yyval.token);
+#endif /* NEQN */
+ for(i = p2-1; i >=p1; i--) {
+ hi = eht[lp[i]];
+ bi = ebase[lp[i]];
+ switch(type) {
+
+ case 'L':
+#ifndef NEQN
+ printf("\\v'%gp'\\*(%d\\h'-\\n(%du'\\v'0-%gp'\\\n",
+ -bi, lp[i], lp[i], hi-bi+gap);
+#else /* NEQN */
+ printf("\\v'%du'\\*(%d\\h'-\\n(%du'\\v'0-%du'\\\n",
+ -bi, lp[i], lp[i], hi-bi+gap);
+#endif /* NEQN */
+ continue;
+ case 'R':
+#ifndef NEQN
+ printf("\\v'%gp'\\h'-\\n(%du'\\*(%d\\v'0-%gp'\\\n",
+ -bi, lp[i], lp[i], hi-bi+gap);
+#else /* NEQN */
+ printf("\\v'%du'\\h'-\\n(%du'\\*(%d\\v'0-%du'\\\n",
+ -bi, lp[i], lp[i], hi-bi+gap);
+#endif /* NEQN */
+ continue;
+ case 'C':
+ case '-':
+#ifndef NEQN
+ printf("\\v'%gp'\\h'\\n(%du-\\n(%du/2u'\\*(%d",
+ -bi, yyval.token, lp[i], lp[i]);
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'0-%gp'\\\n",
+ yyval.token, lp[i], hi-bi+gap);
+#else /* NEQN */
+ printf("\\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d",
+ -bi, yyval.token, lp[i], lp[i]);
+ printf("\\h'-\\n(%du-\\n(%du/2u'\\v'0-%du'\\\n",
+ yyval.token, lp[i], hi-bi+gap);
+#endif /* NEQN */
+ continue;
+ }
+ }
+#ifndef NEQN
+ printf("\\v'%gp'\\h'%du*\\n(%du'\n", eht[yyval.token]-ebase[yyval.token]+gap,
+ type!='R' ? 1 : 0, yyval.token);
+#else /* NEQN */
+ printf("\\v'%du'\\h'%du*\\n(%du'\n", eht[yyval.token]-ebase[yyval.token]+gap,
+ type!='R' ? 1 : 0, yyval.token);
+#endif /* NEQN */
+ for( i=p1; i<p2; i++ )
+ ofree(lp[i]);
+ lfont[yyval.token] = rfont[yyval.token] = 0;
+}
diff --git a/eqn/shift.c b/eqn/shift.c
new file mode 100644
index 0000000000000..666a9c07a21cd
--- /dev/null
+++ b/eqn/shift.c
@@ -0,0 +1,204 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "shift.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)shift.c 1.6 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+bshiftb(int p1, int dir, int p2) {
+#ifndef NEQN
+ float shval, d1, h1, b1, h2, b2;
+ float diffps, effps, effps2;
+ char *sh1, *sh2;
+#else /* NEQN */
+ int shval, d1, h1, b1, h2, b2;
+#endif /* NEQN */
+
+ yyval.token = p1;
+ h1 = eht[p1];
+ b1 = ebase[p1];
+ h2 = eht[p2];
+ b2 = ebase[p2];
+#ifndef NEQN
+ effps = EFFPS(ps);
+ effps2 = EFFPS(ps+deltaps);
+ diffps = deltaps;
+ sh1 = sh2 = "";
+#endif /* NEQN */
+ if( dir == SUB ) { /* subscript */
+#ifndef NEQN
+ /* top 1/2m above bottom of main box */
+ d1 = VERT(EM(0.5, effps2));
+#else /* NEQN */
+ d1 = VERT(1);
+#endif /* NEQN */
+ shval = - d1 + h2 - b2;
+ if( d1+b1 > h2 ) /* move little sub down */
+ shval = b1-b2;
+ ebase[yyval.token] = b1 + max(0, h2-b1-d1);
+ eht[yyval.token] = h1 + max(0, h2-b1-d1);
+#ifndef NEQN
+ if (ital(rfont[p1]) && rom(lfont[p2]))
+ sh1 = "\\|";
+ if (ital(rfont[p2]))
+ sh2 = "\\|";
+#endif /* NEQN */
+ } else { /* superscript */
+#ifndef NEQN
+ /* 4/10 up main box */
+ d1 = VERT(EM(0.2, effps));
+#else /* NEQN */
+ d1 = VERT(1);
+#endif /* NEQN */
+ ebase[yyval.token] = b1;
+#ifndef NEQN
+ shval = -VERT( (4 * (h1-b1)) / 10 ) - b2;
+ if( VERT(4*(h1-b1)/10) + h2 < h1-b1 ) /* raise little super */
+#else /* NEQN */
+ shval = -VERT(1) - b2;
+ if( VERT(1) + h2 < h1-b1 ) /* raise little super */
+#endif /* NEQN */
+ shval = -(h1-b1) + h2-b2 - d1;
+#ifndef NEQN
+ eht[yyval.token] = h1 + max(0, h2-VERT((6*(h1-b1))/10));
+ if (ital(rfont[p1]))
+ sh1 = "\\|";
+ if (ital(rfont[p2]))
+ sh2 = "\\|";
+#else /* NEQN */
+ eht[yyval.token] = h1 + max(0, h2 - VERT(1));
+#endif /* NEQN */
+ }
+#ifndef NEQN
+ if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %g S%d vert %g; b=%g, h=%g\n",
+ yyval.token, p1, shval, p2, -shval, ebase[yyval.token], eht[yyval.token]);
+ printf(".as %d \\v'%gp'\\s-%s%s\\*(%d\\s+%s%s\\v'%gp'\n",
+ yyval.token, shval, tsize(diffps), sh1, p2, tsize(diffps), sh2, -shval);
+ ps += deltaps;
+ if (ital(rfont[p2]))
+ rfont[p1] = 0;
+ else
+ rfont[p1] = rfont[p2];
+#else /* NEQN */
+ if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; b=%d, h=%d\n",
+ yyval.token, p1, shval, p2, -shval, ebase[yyval.token], eht[yyval.token]);
+ printf(".as %d \\v'%du'\\*(%d\\v'%du'\n",
+ yyval.token, shval, p2, -shval);
+#endif /* NEQN */
+ ofree(p2);
+}
+
+void
+shift(int p1) {
+ ps -= deltaps;
+ yyval.token = p1;
+ if(dbg)printf(".\tshift: %d;ps=%g\n", yyval.token, ps);
+}
+
+void
+shift2(int p1, int p2, int p3) {
+ int effps, treg;
+#ifndef NEQN
+ float h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh;
+ int effps2;
+#else /* NEQN */
+ int h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh;
+#endif /* NEQN */
+
+ treg = oalloc();
+ yyval.token = p1;
+ if(dbg)printf(".\tshift2 s%d <- %d %d %d\n", yyval.token, p1, p2, p3);
+ effps = EFFPS(ps+deltaps);
+#ifndef NEQN
+ eht[p3] = h3 = VERT( (eht[p3] * effps) / EFFPS(ps) );
+ ps += deltaps;
+ effps2 = EFFPS(ps+deltaps);
+#endif /* NEQN */
+ h1 = eht[p1]; b1 = ebase[p1];
+ h2 = eht[p2]; b2 = ebase[p2];
+#ifndef NEQN
+ b3 = ebase[p3];
+ d1 = VERT(EM(0.5, effps2));
+#else /* NEQN */
+ h3 = eht[p3]; b3 = ebase[p3];
+ d1 = VERT(1);
+#endif /* NEQN */
+ subsh = -d1+h2-b2;
+ if( d1+b1 > h2 ) /* move little sub down */
+ subsh = b1-b2;
+#ifndef NEQN
+ supsh = -VERT( (4*(h1-b1))/10 ) - b3;
+ d2 = VERT(EM(0.2, effps));
+ if( VERT(4*(h1-b1)/10)+h3 < h1-b1 )
+#else /* NEQN */
+ supsh = - VERT(1) - b3;
+ d2 = VERT(1);
+ if( VERT(1)+h3 < h1-b1 )
+#endif /* NEQN */
+ supsh = -(h1-b1) + (h3-b3) - d2;
+#ifndef NEQN
+ eht[yyval.token] = h1 + max(0, h3-VERT( (6*(h1-b1))/10 )) + max(0, h2-b1-d1);
+#else /* NEQN */
+ eht[yyval.token] = h1 + max(0, h3-VERT(1)) + max(0, h2-b1-d1);
+#endif /* NEQN */
+ ebase[yyval.token] = b1+max(0, h2-b1-d1);
+#ifndef NEQN
+ if (ital(rfont[p1]) && rom(lfont[p2]))
+ printf(".ds %d \\|\\*(%d\n", p2, p2);
+ if (ital(rfont[p2]))
+ printf(".as %d \\|\n", p2);
+#endif /* NEQN */
+ nrwid(p2, effps, p2);
+#ifndef NEQN
+ if (ital(rfont[p1]) && rom(lfont[p3]))
+ printf(".ds %d \\|\\|\\*(%d\n", p3, p3);
+ else
+ printf(".ds %d \\|\\*(%d\n", p3, p3);
+#endif /* NEQN */
+ nrwid(p3, effps, p3);
+ printf(".nr %d \\n(%d\n", treg, p3);
+ printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2);
+#ifndef NEQN
+ printf(".as %d \\v'%gp'\\s%s\\*(%d\\h'-\\n(%du'\\v'%gp'\\\n",
+ p1, subsh, tsize(effps), p2, p2, -subsh+supsh);
+ printf("\\s%s\\*(%d\\h'-\\n(%du+\\n(%du'\\s%s\\v'%gp'\n",
+ tsize(effps), p3, p3, treg, tsize(effps2), -supsh);
+#else /* NEQN */
+ printf(".as %d \\v'%du'\\*(%d\\h'-\\n(%du'\\v'%du'\\\n",
+ p1, subsh, p2, p2, -subsh+supsh);
+ printf("\\*(%d\\h'-\\n(%du+\\n(%du'\\v'%du'\n",
+ p3, p3, treg, -supsh);
+#endif /* NEQN */
+ ps += deltaps;
+#ifndef NEQN
+ if (ital(rfont[p2]))
+ rfont[yyval.token] = 0; /* lie */
+#endif /* NEQN */
+ ofree(p2); ofree(p3); ofree(treg);
+}
diff --git a/eqn/size.c b/eqn/size.c
new file mode 100644
index 0000000000000..c8fe71b2da968
--- /dev/null
+++ b/eqn/size.c
@@ -0,0 +1,107 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "size.c 1.3 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)size.c 1.5 (gritter) 10/19/06
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+# include <stdlib.h>
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+setsize(char *p) /* set size as found in p */
+{
+ if (*p == '+')
+ ps += atof(p+1);
+ else if (*p == '-')
+ ps -= atof(p+1);
+ else
+ ps = atof(p);
+ if(dbg)printf(".\tsetsize %s; ps = %g\n", p, ps);
+}
+
+void
+size(float p1, int p2) {
+ /* old size in p1, new in ps */
+ float effps, effp1;
+
+ yyval.token = p2;
+#ifndef NEQN
+ if(dbg)printf(".\tb:sb: S%d <- \\s%s S%d \\s%s; b=%g, h=%g\n",
+ yyval.token, tsize(ps), p2, tsize(p1), ebase[yyval.token], eht[yyval.token]);
+#else /* NEQN */
+ if(dbg)printf(".\tb:sb: S%d <- \\s%s S%d \\s%s; b=%d, h=%d\n",
+ yyval.token, tsize(ps), p2, tsize(p1), ebase[yyval.token], eht[yyval.token]);
+#endif /* NEQN */
+ effps = EFFPS(ps);
+ effp1 = EFFPS(p1);
+ printf(".ds %d \\s%s\\*(%d\\s%s\n",
+ yyval.token, tsize(effps), p2, tsize(effp1));
+ ps = p1;
+}
+
+void
+globsize(void) {
+ char temp[20];
+
+ getstr(temp, 20);
+ if (temp[0] == '+')
+ gsize += atof(temp+1);
+ else if (temp[0] == '-')
+ gsize -= atof(temp+1);
+ else
+ gsize = atof(temp);
+ yyval.token = eqnreg = 0;
+ setps(gsize);
+ ps = gsize;
+ if (gsize >= 12) /* sub and sup size change */
+ deltaps = gsize / 4;
+ else
+ deltaps = gsize / 3;
+ if (gsize == (int)gsize)
+ deltaps = (int)deltaps;
+}
+
+char *
+tsize(float s)
+{
+ static char b[5][20];
+ static int t;
+ int i;
+
+ t = (t + 1) % 5;
+ if ((i = s) == s) {
+ if (i < 40)
+ snprintf(b[t], sizeof(b[t]), "%d", i);
+ else if (i < 100)
+ snprintf(b[t], sizeof(b[t]), "(%d", i);
+ else
+ snprintf(b[t], sizeof(b[t]), "[%d]", i);
+ } else {
+ snprintf(b[t], sizeof(b[t]), "[%g]", s);
+ }
+ return b[t];
+}
diff --git a/eqn/sqrt.c b/eqn/sqrt.c
new file mode 100644
index 0000000000000..d93bdbdfff7aa
--- /dev/null
+++ b/eqn/sqrt.c
@@ -0,0 +1,62 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "sqrt.c 1.4 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)sqrt.c 1.6 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+# include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+void
+sqrt(int p2) {
+#ifndef NEQN
+ float nps;
+
+ nps = (int)(EFFPS(((eht[p2]*9)/10+(resolution/POINT-1))/(resolution/POINT)));
+#endif /* NEQN */
+ yyval.token = p2;
+#ifndef NEQN
+ eht[yyval.token] = VERT(EM(1.2, nps));
+ if(dbg)printf(".\tsqrt: S%d <- S%d;b=%g, h=%g\n",
+ yyval.token, p2, ebase[yyval.token], eht[yyval.token]);
+ if (ital(rfont[yyval.token]))
+ printf(".as %d \\|\n", yyval.token);
+#endif /* NEQN */
+ nrwid(p2, ps, p2);
+#ifndef NEQN
+ printf(".ds %d \\v'%gp'\\s%s\\v'-.2m'\\(sr\\l'\\n(%du\\(rn'\\v'.2m'\\s%s",
+ yyval.token, ebase[p2], tsize(nps), p2, tsize(ps));
+ printf("\\v'%gp'\\h'-\\n(%du'\\*(%d\n", -ebase[p2], p2, p2);
+ lfont[yyval.token] = ROM;
+#else /* NEQN */
+ printf(".ds %d \\v'%du'\\e\\L'%du'\\l'\\n(%du'",
+ p2, ebase[p2], -eht[p2], p2);
+ printf("\\v'%du'\\h'-\\n(%du'\\*(%d\n", eht[p2]-ebase[p2], p2, p2);
+ eht[p2] += VERT(1);
+ if(dbg)printf(".\tsqrt: S%d <- S%d;b=%d, h=%d\n",
+ p2, p2, ebase[p2], eht[p2]);
+#endif /* NEQN */
+}
diff --git a/eqn/text.c b/eqn/text.c
new file mode 100644
index 0000000000000..7b7b58ff7f9fa
--- /dev/null
+++ b/eqn/text.c
@@ -0,0 +1,234 @@
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+/*
+ * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+/* from OpenSolaris "text.c 1.6 05/06/02 SMI" SVr4.0 1.1 */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)text.c 1.8 (gritter) 1/13/08
+ */
+
+/*
+ * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
+ */
+
+#include "e.h"
+#include "y.tab.h"
+
+extern YYSTYPE yyval;
+
+int csp;
+int psp;
+#define CSSIZE 400
+char cs[420];
+
+int lf, rf; /* temporary spots for left and right fonts */
+
+void
+text(int t,char *p1) {
+ int c;
+ char *p;
+ tbl *tp;
+ extern tbl *restbl;
+
+ yyval.token = oalloc();
+ ebase[yyval.token] = 0;
+#ifndef NEQN
+ eht[yyval.token] = VERT(EM(1.0, EFFPS(ps))); /* ht in machine units */
+#else /* NEQN */
+ eht[yyval.token] = VERT(2); /* 2 half-spaces */
+#endif /* NEQN */
+ lfont[yyval.token] = rfont[yyval.token] = ROM;
+ if (t == QTEXT)
+ p = p1;
+ else if ( t == SPACE )
+ p = "\\ ";
+ else if ( t == THIN )
+ p = "\\|";
+ else if ( t == TAB )
+ p = "\\t";
+ else if ((tp = lookup(&restbl, p1, NULL)) != NULL)
+ p = tp->defn;
+ else {
+ lf = rf = 0;
+ for (csp=psp=0; (c=p1[psp++])!='\0';) {
+ rf = trans(c, p1);
+ if (lf == 0)
+ lf = rf; /* save first */
+ if (csp>CSSIZE)
+ error(FATAL, "converted token %.25s... too long" ,p1);
+ }
+ cs[csp] = '\0';
+ p = cs;
+ lfont[yyval.token] = lf;
+ rfont[yyval.token] = rf;
+ }
+#ifndef NEQN
+ if(dbg)printf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c\n",
+ t, yyval.token, p, ebase[yyval.token], eht[yyval.token], lfont[yyval.token], rfont[yyval.token]);
+#else /* NEQN */
+ if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
+ t, yyval.token, p, ebase[yyval.token], eht[yyval.token], lfont[yyval.token], rfont[yyval.token]);
+#endif /* NEQN */
+ printf(".ds %d \"%s\n", yyval.token, p);
+}
+
+int
+trans(int c,char *p1) {
+ int f;
+ int half = 0;
+ f = ROM;
+ switch( c) {
+ case ')':
+ half = 1;
+ /*FALLTHRU*/
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '!': case '%':
+ case '(': case '[': case ']':
+ if (rf == ITAL)
+ shim(half);
+ roman(c); break;
+ case ',':
+ roman(c);
+ shim(0);
+ break;
+ case '.':
+ if (rf == ROM)
+ roman(c);
+ else
+ cs[csp++] = c;
+ f = rf;
+ break;
+ case '|':
+ if (rf == ITAL)
+ shim(0);
+ shim(0); roman(c); shim(0); break;
+ case '=':
+ if (rf == ITAL)
+ shim(0);
+ name4('e','q');
+ f |= OP;
+ break;
+ case '+':
+ if (rf == ITAL)
+ shim(0);
+ name4('p', 'l');
+ f |= OP;
+ break;
+ case '>': case '<':
+ if (rf == ITAL)
+ shim(0);
+ if (p1[psp]=='=') { /* look ahead for == <= >= */
+ name4(c,'=');
+ psp++;
+ } else {
+ cs[csp++] = c;
+ }
+ f |= OP;
+ break;
+ case '-':
+ if (rf == ITAL)
+ shim(0);
+ if (p1[psp]=='>') {
+ name4('-','>'); psp++;
+ } else {
+ name4('m','i');
+ }
+ f |= OP;
+ break;
+ case '/':
+ if (rf == ITAL)
+ shim(0);
+ name4('s','l');
+ f |= OP;
+ break;
+ case '~': case ' ':
+ shim(0); shim(0); break;
+ case '^':
+ shim(0); break;
+ case '\\': /* troff - pass 2 or 3 more chars */
+ if (rf == ITAL)
+ shim(0);
+ cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
+ if (c=='(') cs[csp++] = p1[psp++];
+ if (c=='*' && cs[csp-1] == '(') {
+ cs[csp++] = p1[psp++];
+ cs[csp++] = p1[psp++];
+ } else if (c == '[' || (c == '*' && cs[csp-1] == '[')) {
+ do
+ cs[csp++] = p1[psp++];
+ while (p1[psp-1] != ' ' && p1[psp-1] != '\t' &&
+ p1[psp-1] != '\n' && p1[psp-1] != ']');
+ if (cs[csp-1] != ']') {
+ csp--;
+ psp--;
+ }
+ }
+ break;
+ case '\'':
+ cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
+ name4('f','m');
+ cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
+ f = rf==ITAL ? ITAL : ROM;
+ break;
+
+ case 'f':
+ if (ft == ITAL) {
+ cs[csp++] = '\\'; cs[csp++] = '^';
+ cs[csp++] = 'f';
+ cs[csp++] = '\\'; cs[csp++] = '|'; /* trying | instead of ^ */
+ f = ITAL;
+ }
+ else
+ cs[csp++] = 'f';
+ break;
+ case 'j':
+ if (ft == ITAL) {
+ cs[csp++] = '\\'; cs[csp++] = '^';
+ cs[csp++] = 'j';
+ f = ITAL;
+ }
+ else
+ cs[csp++] = 'j';
+ break;
+ default:
+ cs[csp++] = c;
+ f = ft==ITAL ? ITAL : ROM;
+ break;
+ }
+ return(f);
+}
+
+void
+shim(int small) {
+ cs[csp++] = '\\'; cs[csp++] = small ? '^' : '|';
+}
+
+void
+roman(int c) {
+ cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM;
+ cs[csp++] = c;
+ cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
+}
+
+void
+name4(int c1,int c2) {
+ cs[csp++] = '\\';
+ cs[csp++] = '(';
+ cs[csp++] = c1;
+ cs[csp++] = c2;
+}
diff --git a/eqn/version.c b/eqn/version.c
new file mode 100644
index 0000000000000..5961b90f614b8
--- /dev/null
+++ b/eqn/version.c
@@ -0,0 +1,37 @@
+#if __GNUC__ >= 3 && __GNUC_MINOR__ >= 4 || __GNUC__ >= 4
+#define USED __attribute__ ((used))
+#elif defined __GNUC__
+#define USED __attribute__ ((unused))
+#else
+#define USED
+#endif
+#ifdef NEQN
+static const char sccsid[] USED = "@(#)/usr/ucb/neqn.sl 5.12 (gritter) 1/13/08";
+#else
+static const char sccsid[] USED = "@(#)/usr/ucb/eqn.sl 5.12 (gritter) 1/13/08";
+#endif
+/* SLIST */
+/*
+diacrit.c: * Sccsid @(#)diacrit.c 1.7 (gritter) 1/13/08
+e.h: * Sccsid @(#)e.h 1.13 (gritter) 1/13/08
+e.y: * Sccsid @(#)e.y 1.7 (gritter) 10/2/07
+eqnbox.c: * Sccsid @(#)eqnbox.c 1.7 (gritter) 1/13/08
+font.c: * Sccsid @(#)font.c 1.5 (gritter) 1/13/08
+fromto.c: * Sccsid @(#)fromto.c 1.5 (gritter) 10/19/06
+funny.c: * Sccsid @(#)funny.c 1.6 (gritter) 10/19/06
+glob.c: * Sccsid @(#)glob.c 1.8 (gritter) 10/19/06
+integral.c: * Sccsid @(#)integral.c 1.5 (gritter) 10/19/06
+io.c: * Sccsid @(#)io.c 1.13 (gritter) 1/13/08
+lex.c: * Sccsid @(#)lex.c 1.7 (gritter) 11/21/07
+lookup.c: * Sccsid @(#)lookup.c 1.5 (gritter) 9/18/05
+mark.c: * Sccsid @(#)mark.c 1.3 (gritter) 8/12/05
+matrix.c: * Sccsid @(#)matrix.c 1.4 (gritter) 10/29/05
+move.c: * Sccsid @(#)move.c 1.4 (gritter) 10/29/05
+over.c: * Sccsid @(#)over.c 1.5 (gritter) 10/19/06
+paren.c: * Sccsid @(#)paren.c 1.4 (gritter) 10/29/05
+pile.c: * Sccsid @(#)pile.c 1.4 (gritter) 10/29/05
+shift.c: * Sccsid @(#)shift.c 1.6 (gritter) 1/13/08
+size.c: * Sccsid @(#)size.c 1.5 (gritter) 10/19/06
+sqrt.c: * Sccsid @(#)sqrt.c 1.6 (gritter) 1/13/08
+text.c: * Sccsid @(#)text.c 1.8 (gritter) 1/13/08
+*/
diff --git a/eqn/yyval.sed b/eqn/yyval.sed
new file mode 100644
index 0000000000000..fbbc5e88770f5
--- /dev/null
+++ b/eqn/yyval.sed
@@ -0,0 +1,22 @@
+#
+# Sccsid @(#)yyval.sed 1.2 (gritter) 10/2/07
+#
+# bison has a yacc-compatible yyval, but it is a local variable inside
+# yyparse(). Making the variable global is necessary to make bc work
+# with a bison-generated parser.
+1,2 {
+ /Bison/ {
+ :look
+ /second part of user declarations/ {
+ i\
+ YYSTYPE yyval;
+ :repl
+ s/^[ ]*YYSTYPE[ ]*yyval;//
+ n
+ t
+ b repl
+ }
+ n
+ b look
+ }
+}