diff options
Diffstat (limited to 'eqn')
-rw-r--r-- | eqn/checkeq.d/Makefile.mk | 23 | ||||
-rw-r--r-- | eqn/checkeq.d/checkeq.c | 148 | ||||
-rw-r--r-- | eqn/diacrit.c | 128 | ||||
-rw-r--r-- | eqn/e.h | 184 | ||||
-rw-r--r-- | eqn/e.y | 215 | ||||
-rw-r--r-- | eqn/eqn.d/Makefile.mk | 56 | ||||
-rw-r--r-- | eqn/eqn.d/eqn.1 | 332 | ||||
-rw-r--r-- | eqn/eqn.d/eqnchar.7 | 212 | ||||
-rw-r--r-- | eqn/eqnbox.c | 68 | ||||
-rw-r--r-- | eqn/eqnchar.d/Makefile.mk | 28 | ||||
-rw-r--r-- | eqn/eqnchar.d/ascii | 34 | ||||
-rw-r--r-- | eqn/eqnchar.d/eqnchar | 90 | ||||
-rw-r--r-- | eqn/eqnchar.d/genutf8.c | 89 | ||||
-rw-r--r-- | eqn/eqnchar.d/greek | 11 | ||||
-rw-r--r-- | eqn/eqnchar.d/iso | 29 | ||||
-rw-r--r-- | eqn/font.c | 99 | ||||
-rw-r--r-- | eqn/fromto.c | 103 | ||||
-rw-r--r-- | eqn/funny.c | 64 | ||||
-rw-r--r-- | eqn/glob.c | 57 | ||||
-rw-r--r-- | eqn/integral.c | 74 | ||||
-rw-r--r-- | eqn/io.c | 322 | ||||
-rw-r--r-- | eqn/lex.c | 308 | ||||
-rw-r--r-- | eqn/lookup.c | 261 | ||||
-rw-r--r-- | eqn/mark.c | 49 | ||||
-rw-r--r-- | eqn/matrix.c | 108 | ||||
-rw-r--r-- | eqn/move.c | 70 | ||||
-rw-r--r-- | eqn/neqn.d/Makefile.mk | 53 | ||||
-rw-r--r-- | eqn/over.c | 84 | ||||
-rw-r--r-- | eqn/paren.c | 172 | ||||
-rw-r--r-- | eqn/pile.c | 137 | ||||
-rw-r--r-- | eqn/shift.c | 204 | ||||
-rw-r--r-- | eqn/size.c | 107 | ||||
-rw-r--r-- | eqn/sqrt.c | 62 | ||||
-rw-r--r-- | eqn/text.c | 234 | ||||
-rw-r--r-- | eqn/version.c | 37 | ||||
-rw-r--r-- | eqn/yyval.sed | 22 |
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 + } +} |