summaryrefslogtreecommitdiff
path: root/usr/src/cmd/tbl
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/tbl
downloadillumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/tbl')
-rw-r--r--usr/src/cmd/tbl/Makefile65
-rw-r--r--usr/src/cmd/tbl/t..c94
-rw-r--r--usr/src/cmd/tbl/t0.c65
-rw-r--r--usr/src/cmd/tbl/t1.c146
-rw-r--r--usr/src/cmd/tbl/t2.c38
-rw-r--r--usr/src/cmd/tbl/t3.c111
-rw-r--r--usr/src/cmd/tbl/t4.c285
-rw-r--r--usr/src/cmd/tbl/t5.c187
-rw-r--r--usr/src/cmd/tbl/t6.c219
-rw-r--r--usr/src/cmd/tbl/t7.c154
-rw-r--r--usr/src/cmd/tbl/t8.c345
-rw-r--r--usr/src/cmd/tbl/t9.c80
-rw-r--r--usr/src/cmd/tbl/tb.c103
-rw-r--r--usr/src/cmd/tbl/tc.c87
-rw-r--r--usr/src/cmd/tbl/te.c119
-rw-r--r--usr/src/cmd/tbl/tf.c68
-rw-r--r--usr/src/cmd/tbl/tg.c87
-rw-r--r--usr/src/cmd/tbl/ti.c73
-rw-r--r--usr/src/cmd/tbl/tm.c85
-rw-r--r--usr/src/cmd/tbl/ts.c66
-rw-r--r--usr/src/cmd/tbl/tt.c102
-rw-r--r--usr/src/cmd/tbl/tu.c219
-rw-r--r--usr/src/cmd/tbl/tv.c165
23 files changed, 2963 insertions, 0 deletions
diff --git a/usr/src/cmd/tbl/Makefile b/usr/src/cmd/tbl/Makefile
new file mode 100644
index 0000000000..309ccfdc92
--- /dev/null
+++ b/usr/src/cmd/tbl/Makefile
@@ -0,0 +1,65 @@
+#
+# 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
+#
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1989 by Sun Microsystems, Inc.
+#
+# cmd/tbl/Makefile
+#
+
+include ../Makefile.cmd
+
+PROG = tbl
+
+SRCS = t0.c t1.c t2.c t3.c t4.c t5.c t6.c t7.c \
+ t8.c t9.c tb.c tc.c te.c tf.c tg.c ti.c \
+ tm.c ts.c tt.c tu.c tv.c
+
+OBJS = $(SRCS:%.c=%.o)
+
+POFILES= $(OBJS:%.o=%.po)
+POFILE= tbl.po
+
+.KEEP_STATE :
+
+all : $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) -o $@ $(OBJS) $(LDLIBS)
+ $(POST_PROCESS)
+
+$(POFILE): $(POFILES)
+ $(RM) $@
+ cat $(POFILES) > $@
+
+install : all $(ROOTPROG)
+
+clean :
+ $(RM) $(OBJS)
+
+lint: lint_SRCS
+
+strip :
+ $(STRIP) $(PROG)
+
+include ../Makefile.targ
diff --git a/usr/src/cmd/tbl/t..c b/usr/src/cmd/tbl/t..c
new file mode 100644
index 0000000000..e52183b506
--- /dev/null
+++ b/usr/src/cmd/tbl/t..c
@@ -0,0 +1,94 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+/* t..c : external declarations */
+
+# include "stdio.h"
+# include "ctype.h"
+
+# define MAXLIN 200
+# define MAXHEAD 100
+# define MAXCOL 20
+# define MAXCHS 2000
+# define MAXSTR 1024
+# define MAXRPT 100
+# define CLLEN 10
+# define SHORTLINE 4
+# define BIGBUF 8192
+extern char *gets1();
+extern int nlin, ncol, iline, nclin, nslin;
+extern int style[MAXHEAD][MAXCOL];
+extern int ctop[MAXHEAD][MAXCOL];
+extern char font[MAXHEAD][MAXCOL][2];
+extern char csize[MAXHEAD][MAXCOL][4];
+extern char vsize[MAXHEAD][MAXCOL][4];
+extern char cll[MAXCOL][CLLEN];
+extern int stynum[];
+extern int F1, F2;
+extern int lefline[MAXHEAD][MAXCOL];
+extern int fullbot[];
+extern char *instead[];
+extern int expflg;
+extern int ctrflg;
+extern int evenflg;
+extern int evenup[];
+extern int boxflg;
+extern int dboxflg;
+extern int linsize;
+extern int tab;
+extern int pr1403;
+extern int linsize, delim1, delim2;
+extern int allflg;
+extern int textflg;
+extern int left1flg;
+extern int rightl;
+struct colstr {char *col, *rcol;};
+extern struct colstr *table[];
+extern int *alocv();
+extern char *cspace, *cstore;
+extern char *chspace();
+extern char *maknew();
+extern char *exstore, *exlim;
+extern int sep[];
+extern int used[], lused[], rused[];
+extern int linestop[];
+extern char *leftover;
+extern char *last, *ifile;
+extern int texname;
+extern int texct;
+extern char texstr[];
+extern int linstart;
+
+
+extern FILE *tabin, *tabout;
+# define CRIGHT 80
+# define CLEFT 40
+# define CMID 60
+# define S1 31
+# define S2 32
+# define TMP 38
+# define SF 35
+# define SL 34
+# define LSIZE 33
+# define SIND 37
+# define SVS 36
+/* this refers to the relative position of lines */
+# define LEFT 1
+# define RIGHT 2
+# define THRU 3
+# define TOP 1
+# define BOT 2
diff --git a/usr/src/cmd/tbl/t0.c b/usr/src/cmd/tbl/t0.c
new file mode 100644
index 0000000000..7bbf44b2ba
--- /dev/null
+++ b/usr/src/cmd/tbl/t0.c
@@ -0,0 +1,65 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t0.c: storage allocation */
+#
+# include "t..c"
+int expflg = 0;
+int ctrflg = 0;
+int boxflg = 0;
+int dboxflg = 0;
+int tab = '\t';
+int linsize;
+int pr1403;
+int delim1, delim2;
+int evenup[MAXCOL], evenflg;
+int F1 = 0;
+int F2 = 0;
+int allflg = 0;
+char *leftover = 0;
+int textflg = 0;
+int left1flg = 0;
+int rightl = 0;
+char *cstore, *cspace;
+char *last;
+struct colstr *table[MAXLIN];
+int style[MAXHEAD][MAXCOL];
+int ctop[MAXHEAD][MAXCOL];
+char font[MAXHEAD][MAXCOL][2];
+char csize[MAXHEAD][MAXCOL][4];
+char vsize[MAXHEAD][MAXCOL][4];
+int lefline[MAXHEAD][MAXCOL];
+char cll[MAXCOL][CLLEN];
+/*char *rpt[MAXHEAD][MAXCOL];*/
+/*char rpttx[MAXRPT];*/
+int stynum[MAXLIN+1];
+int nslin, nclin;
+int sep[MAXCOL];
+int fullbot[MAXLIN];
+char *instead[MAXLIN];
+int used[MAXCOL], lused[MAXCOL], rused[MAXCOL];
+int linestop[MAXLIN];
+int nlin, ncol;
+int iline = 1;
+char *ifile = "Input";
+int texname = 'a';
+int texct = 0;
+char texstr[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ0123456789";
+int linstart;
+char *exstore, *exlim;
+FILE *tabin /*= stdin */;
+FILE *tabout /* = stdout */;
diff --git a/usr/src/cmd/tbl/t1.c b/usr/src/cmd/tbl/t1.c
new file mode 100644
index 0000000000..9983649579
--- /dev/null
+++ b/usr/src/cmd/tbl/t1.c
@@ -0,0 +1,146 @@
+/* Co/pyright (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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t1.c: main control and input switching */
+#
+#include <locale.h>
+# include "t..c"
+#include <signal.h>
+# ifdef gcos
+/* required by GCOS because file is passed to "tbl" by troff preprocessor */
+# define _f1 _f
+extern FILE *_f[];
+# endif
+
+# ifdef unix
+# define MACROS "/usr/doctools/tmac/tmac.s"
+# define MACROSS "/usr/share/lib/tmac/s"
+# define PYMACS "/usr/doctools/tmac/tmac.m"
+# define PYMACSS "/usr/share/lib/tmac/m"
+# define MEMACSS "/usr/share/lib/tmac/e"
+# endif
+
+# ifdef gcos
+# define MACROS "cc/troff/smac"
+# define PYMACS "cc/troff/mmac"
+# endif
+
+# define ever (;;)
+
+main(argc,argv)
+ char *argv[];
+{
+# ifdef unix
+void badsig();
+# endif
+ (void) setlocale(LC_ALL, "");
+#if !defined(TEXT_DOMAIN)
+#define TEXT_DOMAIN "SYS_TEST"
+#endif
+ (void) textdomain(TEXT_DOMAIN);
+# ifdef unix
+signal(SIGPIPE, badsig);
+# endif
+# ifdef gcos
+if(!intss()) tabout = fopen("qq", "w"); /* default media code is type 5 */
+# endif
+exit(tbl(argc,argv));
+}
+
+
+tbl(argc,argv)
+ char *argv[];
+{
+char line[BIGBUF];
+/* required by GCOS because "stdout" is set by troff preprocessor */
+tabin=stdin; tabout=stdout;
+setinp(argc,argv);
+while (gets1(line, sizeof line))
+ {
+ fprintf(tabout, "%s\n",line);
+ if (prefix(".TS", line))
+ tableput();
+ }
+fclose(tabin);
+return(0);
+}
+int sargc;
+char **sargv;
+setinp(argc,argv)
+ char **argv;
+{
+ sargc = argc;
+ sargv = argv;
+ sargc--; sargv++;
+ if (sargc>0)
+ swapin();
+}
+swapin()
+{
+ while (sargc>0 && **sargv=='-') /* Mem fault if no test on sargc */
+ {
+ if (sargc<=0) return(0);
+ if (match("-me", *sargv))
+ {
+ *sargv = MEMACSS;
+ break;
+ }
+ if (match("-ms", *sargv))
+ {
+ *sargv = MACROSS;
+ break;
+ }
+ if (match("-mm", *sargv))
+ {
+ *sargv = PYMACSS;
+ break;
+ }
+ if (match("-TX", *sargv))
+ pr1403=1;
+ else {
+ (void) fprintf(stderr, gettext("tbl: Invalid option "
+ "(%s).\n"), *sargv);
+ (void) fprintf(stderr, gettext("Usage: tbl [ -me ] "
+ "[ -mm ] [ -ms ] [ filename ] ...\n"));
+ exit(1);
+ }
+ sargc--; sargv++;
+ }
+ if (sargc<=0) return(0);
+# ifdef unix
+/* file closing is done by GCOS troff preprocessor */
+ if (tabin!=stdin) fclose(tabin);
+# endif
+ tabin = fopen(ifile= *sargv, "r");
+ iline=1;
+# ifdef unix
+/* file names are all put into f. by the GCOS troff preprocessor */
+ fprintf(tabout, ".ds f. %s\n",ifile);
+# endif
+ if (tabin==NULL)
+ error(gettext("Can't open file"));
+ sargc--;
+ sargv++;
+ return(1);
+}
+# ifdef unix
+void badsig()
+{
+signal(SIGPIPE, SIG_IGN);
+ exit(0);
+}
+# endif
diff --git a/usr/src/cmd/tbl/t2.c b/usr/src/cmd/tbl/t2.c
new file mode 100644
index 0000000000..a4bbe844f6
--- /dev/null
+++ b/usr/src/cmd/tbl/t2.c
@@ -0,0 +1,38 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t2.c: subroutine sequencing for one table */
+# include "t..c"
+tableput()
+{
+saveline();
+savefill();
+ifdivert();
+cleanfc();
+getcomm();
+getspec();
+gettbl();
+getstop();
+checkuse();
+choochar();
+maktab();
+runout();
+release();
+rstofill();
+endoff();
+restline();
+}
diff --git a/usr/src/cmd/tbl/t3.c b/usr/src/cmd/tbl/t3.c
new file mode 100644
index 0000000000..48880f7e92
--- /dev/null
+++ b/usr/src/cmd/tbl/t3.c
@@ -0,0 +1,111 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t3.c: interpret commands affecting whole table */
+# include "t..c"
+struct optstr {char *optnam; int *optadd;} options [] = {
+ "expand", &expflg,
+ "EXPAND", &expflg,
+ "center", &ctrflg,
+ "CENTER", &ctrflg,
+ "box", &boxflg,
+ "BOX", &boxflg,
+ "allbox", &allflg,
+ "ALLBOX", &allflg,
+ "doublebox", &dboxflg,
+ "DOUBLEBOX", &dboxflg,
+ "frame", &boxflg,
+ "FRAME", &boxflg,
+ "doubleframe", &dboxflg,
+ "DOUBLEFRAME", &dboxflg,
+ "tab", &tab,
+ "TAB", &tab,
+ "linesize", &linsize,
+ "LINESIZE", &linsize,
+ "delim", &delim1,
+ "DELIM", &delim1,
+ 0,0};
+extern char *strchr();
+getcomm()
+{
+char line[200], *cp, nb[25], *t;
+struct optstr *lp;
+int c, ci, found;
+for(lp= options; lp->optnam; lp++)
+ *(lp->optadd) = 0;
+texname = texstr[texct=0];
+tab = '\t';
+printf(".nr %d \\n(.s\n", LSIZE);
+gets1(line, sizeof line);
+/* see if this is a command line */
+if (strchr(line,';') == NULL)
+ {
+ backrest(line);
+ return;
+ }
+for(cp=line; (c = *cp) != ';'; cp++)
+ {
+ if (!letter(c)) continue;
+ found=0;
+ for(lp= options; lp->optadd; lp++)
+ {
+ if (prefix(lp->optnam, cp))
+ {
+ *(lp->optadd) = 1;
+ cp += strlen(lp->optnam);
+ if (letter(*cp))
+ error(gettext("Misspelled global option"));
+ while (*cp==' ')cp++;
+ t=nb;
+ if ( *cp == '(')
+ while ((ci= *++cp) != ')')
+ *t++ = ci;
+ else cp--;
+ *t++ = 0; *t=0;
+ if (lp->optadd == &tab)
+ {
+ if (nb[0])
+ *(lp->optadd) = nb[0];
+ }
+ if (lp->optadd == &linsize)
+ printf(".nr %d %s\n", LSIZE, nb);
+ if (lp->optadd == &delim1)
+ {
+ delim1 = nb[0];
+ delim2 = nb[1];
+ }
+ found=1;
+ break;
+ }
+ }
+ if (!found)
+ error(gettext("Illegal option"));
+ }
+cp++;
+backrest(cp);
+return;
+}
+backrest(cp)
+ char *cp;
+{
+char *s;
+for(s=cp; *s; s++);
+un1getc('\n');
+while (s>cp)
+ un1getc(*--s);
+return;
+}
diff --git a/usr/src/cmd/tbl/t4.c b/usr/src/cmd/tbl/t4.c
new file mode 100644
index 0000000000..610c0042f4
--- /dev/null
+++ b/usr/src/cmd/tbl/t4.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+ /* t4.c: read table specification */
+# include "t..c"
+int oncol;
+getspec()
+{
+int icol, i;
+for(icol=0; icol<MAXCOL; icol++)
+ {
+ sep[icol]= -1;
+ evenup[icol]=0;
+ cll[icol][0]=0;
+ for(i=0; i<MAXHEAD; i++)
+ {
+ csize[i][icol][0]=0;
+ vsize[i][icol][0]=0;
+ font[i][icol][0] = lefline[i][icol] = 0;
+ ctop[i][icol]=0;
+ style[i][icol]= 'l';
+ }
+ }
+nclin=ncol=0;
+oncol =0;
+left1flg=rightl=0;
+readspec();
+fprintf(tabout, ".rm");
+for(i=0; i<ncol; i++)
+ fprintf(tabout, " %02d", 80+i);
+fprintf(tabout, "\n");
+}
+readspec()
+{
+int icol, c, sawchar, stopc, i;
+char sn[10], *snp, *temp;
+sawchar=icol=0;
+while (c=get1char())
+ {
+ switch(c)
+ {
+ default:
+ if (c != tab)
+ error(gettext("bad table specification character"));
+ case ' ': /* note this is also case tab */
+ continue;
+ case '\n':
+ if(sawchar==0) continue;
+ case ',':
+ case '.': /* end of table specification */
+ ncol = max(ncol, icol);
+ if (lefline[nclin][ncol]>0) {ncol++; rightl++;};
+ if(sawchar)
+ nclin++;
+ if (nclin>=MAXHEAD)
+ error(gettext("too many lines in specification"));
+ icol=0;
+ if (ncol==0 || nclin==0)
+ error(gettext("no specification"));
+ if (c== '.')
+ {
+ while ((c=get1char()) && c != '\n')
+ if (c != ' ' && c != '\t')
+ error(gettext("dot not last character on format line"));
+ /* fix up sep - default is 3 except at edge */
+ for(icol=0; icol<ncol; icol++)
+ if (sep[icol]<0)
+ sep[icol] = icol+1<ncol ? 3 : 1;
+ if (oncol == 0)
+ oncol = ncol;
+ else if (oncol +2 <ncol)
+ error(gettext("tried to widen table in T&, not allowed"));
+ return;
+ }
+ sawchar=0;
+ continue;
+ case 'C': case 'S': case 'R': case 'N': case 'L': case 'A':
+ c += ('a'-'A');
+ case '_': if (c=='_') c= '-';
+ case '=': case '-':
+ case '^':
+ case 'c': case 's': case 'n': case 'r': case 'l': case 'a':
+ style[nclin][icol]=c;
+ if (c== 's' && icol<=0)
+ error(gettext("first column can not be S-type"));
+ if (c=='s' && style[nclin][icol-1] == 'a')
+ {
+ fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
+ style[nclin][icol-1] = 'l';
+ }
+ if (c=='s' && style[nclin][icol-1] == 'n')
+ {
+ fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
+ style[nclin][icol-1] = 'c';
+ }
+ icol++;
+ if (c=='^' && nclin<=0)
+ error(gettext("first row can not contain vertical span"));
+ if (icol>=MAXCOL)
+ error(gettext("too many columns in table"));
+ sawchar=1;
+ continue;
+ case 'b': case 'i':
+ c += 'A'-'a';
+ /* FALLTHRU */
+ case 'B': case 'I':
+ if (sawchar == 0)
+ continue;
+ if (icol==0) continue;
+ snp=font[nclin][icol-1];
+ snp[0]= (c=='I' ? '2' : '3');
+ snp[1]=0;
+ continue;
+ case 't': case 'T':
+ if (sawchar == 0) {
+ continue;
+ }
+ if (icol>0)
+ ctop[nclin][icol-1] = 1;
+ continue;
+ case 'd': case 'D':
+ if (sawchar == 0)
+ continue;
+ if (icol>0)
+ ctop[nclin][icol-1] = -1;
+ continue;
+ case 'f': case 'F':
+ if (sawchar == 0)
+ continue;
+ if (icol==0) continue;
+ snp=font[nclin][icol-1];
+ snp[0]=snp[1]=stopc=0;
+ for(i=0; i<2; i++)
+ {
+ c = get1char();
+ if (i==0 && c=='(')
+ {
+ stopc=')';
+ c = get1char();
+ }
+ if (c==0) break;
+ if (c==stopc) {stopc=0; break;}
+ if (stopc==0) if (c==' ' || c== tab ) break;
+ if (c=='\n'){un1getc(c); break;}
+ snp[i] = c;
+ if (c>= '0' && c<= '9') break;
+ }
+ if (stopc) if (get1char()!=stopc)
+ error(gettext("Nonterminated font name"));
+ continue;
+ case 'P': case 'p':
+ if (sawchar == 0)
+ continue;
+ if (icol<=0) continue;
+ temp = snp = csize[nclin][icol-1];
+ while (c = get1char())
+ {
+ if (c== ' ' || c== tab || c=='\n') break;
+ if (c=='-' || c == '+')
+ if (snp>temp)
+ break;
+ else
+ *snp++=c;
+ else
+ if (digit(c))
+ *snp++ = c;
+ else break;
+ if (snp-temp>4)
+ error(gettext("point size too large"));
+ }
+ *snp = 0;
+ if (atoi(temp)>36)
+ error(gettext("point size unreasonable"));
+ un1getc (c);
+ continue;
+ case 'V': case 'v':
+ if (sawchar == 0)
+ continue;
+ if (icol<=0) continue;
+ temp = snp = vsize[nclin][icol-1];
+ while (c = get1char())
+ {
+ if (c== ' ' || c== tab || c=='\n') break;
+ if (c=='-' || c == '+')
+ if (snp>temp)
+ break;
+ else
+ *snp++=c;
+ else
+ if (digit(c))
+ *snp++ = c;
+ else break;
+ if (snp-temp>4)
+ error(
+ gettext("vertical spacing value too large")
+ );
+ }
+ *snp=0;
+ un1getc(c);
+ continue;
+ case 'w': case 'W':
+ if (sawchar == 0) {
+ /*
+ * This should be an error case.
+ * However, for the backward-compatibility,
+ * treat as if 'c' was specified.
+ */
+ style[nclin][icol] = 'c';
+ icol++;
+ if (icol >= MAXCOL) {
+ error(gettext(
+ "too many columns in table"));
+ }
+ sawchar = 1;
+ }
+
+ snp = cll [icol-1];
+ /* Dale Smith didn't like this check
+ * possible to have two text blocks
+ * of different widths now ....
+ if (*snp)
+ {
+ fprintf(tabout,
+ gettext("Ignored second width specification"));
+ continue;
+ }
+ * end commented out code ... */
+ stopc=0;
+ while (c = get1char())
+ {
+ if (snp==cll[icol-1] && c=='(')
+ {
+ stopc = ')';
+ continue;
+ }
+ if ( !stopc && (c>'9' || c< '0'))
+ break;
+ if (stopc && c== stopc)
+ break;
+ *snp++ =c;
+ }
+ *snp=0;
+ if (snp-cll[icol-1]>CLLEN)
+ error (gettext("column width too long"));
+ if (!stopc)
+ un1getc(c);
+ continue;
+ case 'e': case 'E':
+ if (sawchar == 0)
+ continue;
+ if (icol<1) continue;
+ evenup[icol-1]=1;
+ evenflg=1;
+ continue;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ sn[0] = c;
+ snp=sn+1;
+ while (digit(*snp++ = c = get1char()))
+ ;
+ un1getc(c);
+ sep[icol-1] = max(sep[icol-1], numb(sn));
+ continue;
+ case '|':
+ lefline[nclin][icol]++;
+ if (icol==0) left1flg=1;
+ continue;
+ }
+ }
+error(gettext("EOF reading table specification"));
+}
diff --git a/usr/src/cmd/tbl/t5.c b/usr/src/cmd/tbl/t5.c
new file mode 100644
index 0000000000..08a1700d66
--- /dev/null
+++ b/usr/src/cmd/tbl/t5.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+ /* t5.c: read data for table */
+# include "t..c"
+gettbl()
+{
+int icol, ch;
+cstore=cspace= chspace();
+textflg=0;
+for (nlin=nslin=0; gets1(cstore, MAXSTR); nlin++)
+ {
+ stynum[nlin]=nslin;
+ if (prefix(".TE", cstore))
+ {
+ leftover=0;
+ break;
+ }
+ if (prefix(".TC", cstore) || prefix(".T&", cstore))
+ {
+ readspec();
+ nslin++;
+ }
+ if (nlin>=MAXLIN)
+ {
+ leftover=cstore;
+ break;
+ }
+ fullbot[nlin]=0;
+ if (cstore[0] == '.' && !isdigit((unsigned char)cstore[1]))
+ {
+ instead[nlin] = cstore;
+ while (*cstore++);
+ continue;
+ }
+ else instead[nlin] = 0;
+ if (nodata(nlin))
+ {
+ if (ch = oneh(nlin))
+ fullbot[nlin]= ch;
+ nlin++;
+ nslin++;
+ instead[nlin]=(char *)0;
+ fullbot[nlin]=0;
+ }
+ table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
+ if (cstore[1]==0)
+ switch(cstore[0])
+ {
+ case '_': fullbot[nlin]= '-'; continue;
+ case '=': fullbot[nlin]= '='; continue;
+ }
+ stynum[nlin] = nslin;
+ nslin = min(nslin+1, nclin-1);
+ for (icol = 0; icol <ncol; icol++)
+ {
+ table[nlin][icol].col = cstore;
+ table[nlin][icol].rcol=0;
+ ch=1;
+ if (match(cstore, "T{")) /* text follows */
+ /* get_text was originally gettext and was renamed */
+ table[nlin][icol].col =
+ (char *)get_text(cstore, nlin, icol,
+ font[stynum[nlin]][icol],
+ csize[stynum[nlin]][icol]);
+ else
+ {
+ for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
+ ;
+ *cstore++ = '\0';
+ switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
+ {
+ case 'n':
+ table[nlin][icol].rcol =
+ (char *)maknew(table[nlin][icol].col);
+ break;
+ case 'a':
+ table[nlin][icol].rcol = table[nlin][icol].col;
+ table[nlin][icol].col = "";
+ break;
+ }
+ }
+ while (ctype(nlin,icol+1)== 's') /* spanning */
+ table[nlin][++icol].col = "";
+ if (ch == '\0') break;
+ }
+ while (++icol <ncol+2)
+ {
+ table[nlin][icol].col = "";
+ table [nlin][icol].rcol=0;
+ }
+ while (*cstore != '\0')
+ cstore++;
+ if (cstore-cspace > MAXCHS)
+ cstore = cspace = chspace();
+ }
+last = cstore;
+permute();
+if (textflg) untext();
+return;
+}
+nodata(il)
+{
+int c;
+for (c=0; c<ncol;c++)
+ {
+ switch(ctype(il,c))
+ {
+ case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
+ return(0);
+ }
+ }
+return(1);
+}
+oneh(lin)
+{
+int k, icol;
+k = ctype(lin,0);
+for(icol=1; icol<ncol; icol++)
+ {
+ if (k != ctype(lin,icol))
+ return(0);
+ }
+return(k);
+}
+# define SPAN "\\^"
+permute()
+{
+int irow, jcol, is;
+char *start, *strig;
+for(jcol=0; jcol<ncol; jcol++)
+ {
+ for(irow=1; irow<nlin; irow++)
+ {
+ if (vspand(irow,jcol,0))
+ {
+ is = prev(irow);
+ if (is<0)
+ error(gettext("Vertical spanning in first row not allowed"));
+ start = table[is][jcol].col;
+ strig = table[is][jcol].rcol;
+ while (irow<nlin &&vspand(irow,jcol,0))
+ irow++;
+ table[--irow][jcol].col = start;
+ table[irow][jcol].rcol = strig;
+ while (is<irow)
+ {
+ table[is][jcol].rcol =0;
+ table[is][jcol].col= SPAN;
+ is = next(is);
+ }
+ }
+ }
+ }
+}
+vspand(ir,ij,ifform)
+{
+if (ir<0) return(0);
+if (ir>=nlin)return(0);
+if (instead[ir]) return(0);
+if (ifform==0 && ctype(ir,ij)=='^') return(1);
+if (table[ir]==0) return(0);
+if (table[ir][ij].rcol!=0) return(0);
+if (fullbot[ir]) return(0);
+return(vspen(table[ir][ij].col));
+}
+vspen(s)
+ char *s;
+{
+if (s==0) return(0);
+if (!point(s)) return(0);
+return(match(s, SPAN));
+}
diff --git a/usr/src/cmd/tbl/t6.c b/usr/src/cmd/tbl/t6.c
new file mode 100644
index 0000000000..92ea2537a6
--- /dev/null
+++ b/usr/src/cmd/tbl/t6.c
@@ -0,0 +1,219 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t6.c: compute tab stops */
+# define tx(a) (a>(char *)0 && a<(char *)128)
+# include "t..c"
+maktab()
+{
+# define FN(i,c) font[stynum[i]][c]
+# define SZ(i,c) csize[stynum[i]][c]
+/* define the tab stops of the table */
+int icol, ilin, tsep, k, ik, vforml, il, text;
+int doubled[MAXCOL], acase[MAXCOL];
+char *s;
+for(icol=0; icol <ncol; icol++)
+ {
+ doubled[icol] = acase[icol] = 0;
+ fprintf(tabout, ".nr %d 0\n", icol+CRIGHT);
+ for(text=0; text<2; text++)
+ {
+ if (text)
+ fprintf(tabout, ".%02d\n.rm %02d\n", icol+80, icol+80);
+ for(ilin=0; ilin<nlin; ilin++)
+ {
+ if (instead[ilin]|| fullbot[ilin]) continue;
+ vforml=ilin;
+ for(il=prev(ilin); il>=0 && vspen(table[il][icol].col); il=prev(il))
+ vforml=il;
+ if (fspan(vforml,icol)) continue;
+ if (filler(table[ilin][icol].col)) continue;
+ switch(ctype(vforml,icol))
+ {
+ case 'a':
+ acase[icol]=1;
+ s = table[ilin][icol].col;
+ if (s>(char *)0 && s<(char *)128 && text)
+ {
+ if (doubled[icol]==0)
+ fprintf(tabout, ".nr %d 0\n.nr %d 0\n",S1,S2);
+ doubled[icol]=1;
+ fprintf(tabout, ".if \\n(%c->\\n(%d .nr %d \\n(%c-\n",s,S2,S2,s);
+ }
+ case 'n':
+ if (table[ilin][icol].rcol!=0)
+ {
+ if (doubled[icol]==0 && text==0)
+ fprintf(tabout, ".nr %d 0\n.nr %d 0\n", S1, S2);
+ doubled[icol]=1;
+ if (real(s=table[ilin][icol].col) && !vspen(s))
+ {
+ if (tx(s) != text) continue;
+ fprintf(tabout, ".nr %d ", TMP);
+ wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
+ fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", S1, TMP, S1, TMP);
+ }
+ if (text==0 && real(s=table[ilin][icol].rcol) && !vspen(s) && !barent(s))
+ {
+ fprintf(tabout, ".nr %d \\w%c%s%c\n",TMP, F1, s, F1);
+ fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n",S2,TMP,S2,TMP);
+ }
+ continue;
+ }
+ case 'r':
+ case 'c':
+ case 'l':
+ if (real(s=table[ilin][icol].col) && !vspen(s))
+ {
+ if (tx(s) != text) continue;
+ fprintf(tabout, ".nr %d ", TMP);
+ wide(s, FN(vforml,icol), SZ(vforml,icol)); fprintf(tabout, "\n");
+ fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", icol+CRIGHT, TMP, icol+CRIGHT, TMP);
+ }
+ }
+ }
+ }
+ if (acase[icol])
+ {
+ fprintf(tabout, ".if \\n(%d>=\\n(%d .nr %d \\n(%du+2n\n",S2,icol+CRIGHT,icol+CRIGHT,S2);
+ }
+ if (doubled[icol])
+ {
+ fprintf(tabout, ".nr %d \\n(%d\n", icol+CMID, S1);
+ fprintf(tabout, ".nr %d \\n(%d+\\n(%d\n",TMP,icol+CMID,S2);
+ fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n",TMP,icol+CRIGHT,icol+CRIGHT,TMP);
+ fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d +(\\n(%d-\\n(%d)/2\n",TMP,icol+CRIGHT,icol+CMID,icol+CRIGHT,TMP);
+ }
+ if (cll[icol][0])
+ {
+ fprintf(tabout, ".nr %d %sn\n", TMP, cll[icol]);
+ fprintf(tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n",icol+CRIGHT, TMP, icol+CRIGHT, TMP);
+ }
+ for(ilin=0; ilin<nlin; ilin++)
+ if (k=lspan(ilin, icol))
+ {
+ s=table[ilin][icol-k].col;
+ if (!real(s) || barent(s) || vspen(s) ) continue;
+ fprintf(tabout, ".nr %d ", TMP);
+ wide(table[ilin][icol-k].col, FN(ilin,icol-k), SZ(ilin,icol-k));
+ for(ik=k; ik>=0; ik--)
+ {
+ fprintf(tabout, "-\\n(%d",CRIGHT+icol-ik);
+ if (!expflg && ik>0) fprintf(tabout, "-%dn", sep[icol-ik]);
+ }
+ fprintf(tabout, "\n");
+ fprintf(tabout, ".if \\n(%d>0 .nr %d \\n(%d/%d\n", TMP, TMP, TMP, k);
+ fprintf(tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP);
+ for(ik=0; ik<k; ik++)
+ {
+ if (doubled[icol-k+ik])
+ fprintf(tabout, ".nr %d +\\n(%d/2\n", icol-k+ik+CMID, TMP);
+ fprintf(tabout, ".nr %d +\\n(%d\n", icol-k+ik+CRIGHT, TMP);
+ }
+ }
+ }
+if (textflg) untext();
+/* if even requested, make all columns widest width */
+# define TMP1 S1
+# define TMP2 S2
+if (evenflg)
+ {
+ fprintf(tabout, ".nr %d 0\n", TMP);
+ for(icol=0; icol<ncol; icol++)
+ {
+ if (evenup[icol]==0) continue;
+ fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n",
+ icol+CRIGHT, TMP, TMP, icol+CRIGHT);
+ }
+ for(icol=0; icol<ncol; icol++)
+ {
+ if (evenup[icol]==0)
+ /* if column not evened just retain old interval */
+ continue;
+ if (doubled[icol])
+ fprintf(tabout, ".nr %d (100*\\n(%d/\\n(%d)*\\n(%d/100\n",
+ icol+CMID, icol+CMID, icol+CRIGHT, TMP);
+ /* that nonsense with the 100's and parens tries
+ to avoid overflow while proportionally shifting
+ the middle of the number */
+ fprintf(tabout, ".nr %d \\n(%d\n", icol+CRIGHT, TMP);
+ }
+ }
+/* now adjust for total table width */
+for(tsep=icol=0; icol<ncol; icol++)
+ tsep+= sep[icol];
+if (expflg)
+ {
+ fprintf(tabout, ".nr %d 0", TMP);
+ for(icol=0; icol<ncol; icol++)
+ fprintf(tabout, "+\\n(%d", icol+CRIGHT);
+ fprintf(tabout, "\n");
+ fprintf(tabout, ".nr %d \\n(.l-\\n(.i-\\n(%d\n", TMP, TMP);
+ if (boxflg || dboxflg || allflg)
+ tsep += 1;
+ else
+ tsep -= sep[ncol-1];
+ fprintf(tabout, ".nr %d \\n(%d/%d\n", TMP, TMP, tsep);
+ fprintf(tabout, ".if \\n(%d<1n .nr %d 1n\n", TMP, TMP);
+ }
+else
+ fprintf(tabout, ".nr %d 1n\n", TMP);
+fprintf(tabout, ".nr %d 0\n",CRIGHT-1);
+tsep= (boxflg || allflg || dboxflg || left1flg) ? 1 : 0;
+for(icol=0; icol<ncol; icol++)
+ {
+ fprintf(tabout, ".nr %d \\n(%d+(%d*\\n(%d)\n",icol+CLEFT, icol+CRIGHT-1, tsep, TMP);
+ fprintf(tabout, ".nr %d +\\n(%d\n",icol+CRIGHT, icol+CLEFT);
+ if (doubled[icol])
+ {
+ /* the next line is last-ditch effort to avoid zero field width */
+ /*fprintf(tabout, ".if \\n(%d=0 .nr %d 1\n",icol+CMID, icol+CMID);*/
+ fprintf(tabout, ".nr %d +\\n(%d\n", icol+CMID, icol+CLEFT);
+ /* fprintf(tabout, ".if n .if \\n(%d%%24>0 .nr %d +12u\n",icol+CMID, icol+CMID); */
+ }
+ tsep=sep[icol];
+ }
+if (rightl)
+ fprintf(tabout, ".nr %d (\\n(%d+\\n(%d)/2\n",ncol+CRIGHT-1, ncol+CLEFT-1, ncol+CRIGHT-2);
+fprintf(tabout, ".nr TW \\n(%d\n", ncol+CRIGHT-1);
+if (boxflg || allflg || dboxflg)
+ fprintf(tabout, ".nr TW +%d*\\n(%d\n", sep[ncol-1], TMP);
+fprintf(tabout,
+ ".if t .if \\n(TW>\\n(.li .tm Table at line %d file %s is too wide - \\n(TW units\n", iline-1, ifile);
+return;
+}
+wide(s, fn, size)
+ char *s, *size, *fn;
+{
+if (point(s))
+ {
+ fprintf(tabout, "\\w%c", F1);
+ if (*fn>0) putfont(fn);
+ if (*size) putsize(size);
+ fprintf(tabout, "%s", s);
+ if (*fn>0) putfont("P");
+ if (*size) putsize("0");
+ fprintf(tabout, "%c",F1);
+ }
+else
+ fprintf(tabout, "\\n(%c-", s);
+}
+filler(s)
+ char *s;
+{
+return (point(s) && s[0]=='\\' && s[1] == 'R');
+}
diff --git a/usr/src/cmd/tbl/t7.c b/usr/src/cmd/tbl/t7.c
new file mode 100644
index 0000000000..15f5e1f893
--- /dev/null
+++ b/usr/src/cmd/tbl/t7.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1983-1998 by Sun Microsystems, Inc.
+ * All Rights Reserved.
+ */
+
+#ident "%Z%%M% %I% %E% SMI"
+
+/* 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.
+ */
+
+ /* t7.c: control to write table entries */
+# include "t..c"
+# define realsplit ((ct=='a'||ct=='n') && table[ldata][c].rcol)
+runout()
+{
+int i;
+if (boxflg || allflg || dboxflg) need();
+if (ctrflg)
+ {
+ fprintf(tabout, ".nr #I \\n(.i\n");
+ fprintf(tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n");
+ }
+fprintf(tabout, ".fc %c %c\n", F1, F2);
+fprintf(tabout, ".nr #T 0-1\n");
+deftail();
+for(i=0; i<nlin; i++)
+ putline(i,i);
+if (leftover)
+ yetmore();
+fprintf(tabout, ".fc\n");
+fprintf(tabout, ".nr T. 1\n");
+fprintf(tabout, ".T# 1\n");
+if (ctrflg)
+ fprintf(tabout, ".in \\n(#Iu\n");
+}
+runtabs(lform, ldata)
+{
+int c, ct, vforml, lf;
+fprintf(tabout, ".ta ");
+for(c=0; c<ncol; c++)
+ {
+ vforml=lform;
+ for(lf=prev(lform); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
+ vforml=lf;
+ if (fspan(vforml,c))
+ continue;
+ switch(ct=ctype(vforml,c))
+ {
+ case 'n':
+ case 'a':
+ if (table[ldata][c].rcol)
+ if (lused[c]) /*Zero field width*/
+ fprintf(tabout, "\\n(%du ",c+CMID);
+ case 'c':
+ case 'l':
+ case 'r':
+ if (realsplit? rused[c]: (used[c]+lused[c]))
+ fprintf(tabout, "\\n(%du ",c+CRIGHT);
+ continue;
+ case 's':
+ if (lspan(lform, c))
+ fprintf(tabout, "\\n(%du ", c+CRIGHT);
+ continue;
+ }
+ }
+fprintf(tabout, "\n");
+}
+ifline(s)
+ char *s;
+{
+if (!point(s)) return(0);
+if (s[0] == '\\') s++;
+if (s[1] ) return(0);
+if (s[0] == '_') return('-');
+if (s[0] == '=') return('=');
+return(0);
+}
+
+need()
+{
+ int texlin, horlin, i;
+
+ for(texlin = horlin = i = 0; i < nlin; i++) {
+ if (allh(i))
+ horlin++;
+ else if (instead[i] != 0)
+ continue;
+ else
+ texlin++;
+ }
+ (void) fprintf(tabout, ".ne %dv+%dp\n", texlin, 2 * horlin);
+ /*
+ * For nroff runs, we need to reserve space for the full height of the
+ * horizontal rules. If we don't reserve sufficient height, we'll have
+ * problems trying to draw the vertical lines across the page boundary.
+ */
+ (void) fprintf(tabout, ".if n .ne %dv\n", 2 * texlin + 2 * horlin + 2);
+}
+
+deftail()
+{
+int i, c, lf, lwid;
+for(i=0; i<MAXHEAD; i++)
+ if (linestop[i])
+ fprintf(tabout, ".nr #%c 0-1\n", linestop[i]+'a'-1);
+fprintf(tabout, ".nr #a 0-1\n");
+fprintf(tabout, ".eo\n");
+fprintf(tabout, ".de T#\n");
+fprintf(tabout, ".ds #d .d\n");
+fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
+ fprintf(tabout, ".mk ##\n");
+ fprintf(tabout, ".nr ## -1v\n");
+ fprintf(tabout, ".ls 1\n");
+ for(i=0; i<MAXHEAD; i++)
+ if (linestop[i])
+ fprintf(tabout, ".if \\n(#T>=0 .nr #%c \\n(#T\n",linestop[i]+'a'-1);
+if (boxflg || allflg || dboxflg) { /* bottom of table line */
+ if (!pr1403)
+ fprintf(tabout, ".if \\n(T. .vs \\n(.vu-\\n(.sp\n");
+ fprintf(tabout, ".if \\n(T. ");
+ drawline(nlin,0,ncol, dboxflg ? '=' : '-',1,0);
+ fprintf(tabout, "\n.if \\n(T. .vs\n");
+ /* T. is really an argument to a macro but because of
+ eqn we don't dare pass it as an argument and reference by $1 */
+}
+ for(c=0; c<ncol; c++)
+ {
+ if ((lf=left(nlin-1,c, &lwid))>=0)
+ {
+ fprintf(tabout, ".if \\n(#%c>=0 .sp -1\n",linestop[lf]+'a'-1);
+ fprintf(tabout, ".if \\n(#%c>=0 ", linestop[lf]+'a'-1);
+ tohcol(c);
+ drawvert(lf, nlin-1, c, lwid);
+ fprintf(tabout, "\\h'|\\n(TWu'\n");
+ }
+ }
+ if (boxflg || allflg || dboxflg) /* right hand line */
+ {
+ fprintf(tabout, ".if \\n(#a>=0 .sp -1\n");
+ fprintf(tabout, ".if \\n(#a>=0 \\h'|\\n(TWu'");
+ drawvert (0, nlin-1, ncol, dboxflg? 2 : 1);
+ fprintf(tabout, "\n");
+ }
+fprintf(tabout, ".ls\n");
+fprintf(tabout, "..\n");
+fprintf(tabout, ".ec\n");
+}
diff --git a/usr/src/cmd/tbl/t8.c b/usr/src/cmd/tbl/t8.c
new file mode 100644
index 0000000000..55cd482def
--- /dev/null
+++ b/usr/src/cmd/tbl/t8.c
@@ -0,0 +1,345 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* t8.c: write out one line of output table */
+# include "t..c"
+# include <locale.h>
+# define realsplit ((ct=='a'||ct=='n') && table[nl][c].rcol)
+int watchout;
+int once;
+int topat[MAXCOL];
+putline(i, nl)
+ /* i is line number for deciding format */
+ /* nl is line number for finding data usually identical */
+{
+int c, lf, ct, form, lwid, vspf, ip = -1, cmidx, exvspen, vforml;
+int vct, chfont;
+char *s, *size, *fn;
+watchout=vspf=exvspen=0;
+if (i==0) once=0;
+if (i==0 && ( allflg || boxflg || dboxflg))
+ fullwide(0, dboxflg? '=' : '-');
+if (instead[nl]==0 && fullbot[nl] ==0)
+for(c=0; c<ncol; c++)
+ {
+ s = table[nl][c].col;
+ if (s==0) continue;
+ if (vspen(s))
+ {
+ for(ip=nl; ip<nlin; ip=next(ip))
+ if (!vspen(s=table[ip][c].col)) break;
+ if (s>(char *)0 && s<(char *)128)
+ fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
+ continue;
+ }
+ if (point(s)) continue;
+ fprintf(tabout, ".ne \\n(%c|u+\\n(.Vu\n",s);
+ watchout=1;
+ }
+if (linestop[nl])
+ fprintf(tabout, ".mk #%c\n", linestop[nl]+'a'-1);
+lf = prev(nl);
+if (instead[nl])
+ {
+ puts(instead[nl]);
+ return;
+ }
+if (fullbot[nl])
+ {
+ switch (ct=fullbot[nl])
+ {
+ case '=':
+ case '-':
+ fullwide(nl,ct);
+ }
+ return;
+ }
+for(c=0; c<ncol; c++)
+ {
+ if (instead[nl]==0 && fullbot[nl]==0)
+ if (vspen(table[nl][c].col)) vspf=1;
+ if (lf>=0)
+ if (vspen(table[lf][c].col)) vspf=1;
+ }
+if (vspf)
+ {
+ fprintf(tabout, ".nr #^ \\n(\\*(#du\n");
+ fprintf(tabout, ".nr #- \\n(#^\n"); /* current line position relative to bottom */
+ }
+vspf=0;
+chfont=0;
+for(c=0; c<ncol; c++)
+ {
+ s = table[nl][c].col;
+ if (s==0) continue;
+ chfont |= (int)(font[stynum[nl]][c]);
+ if (point(s) ) continue;
+ lf=prev(nl);
+ if (lf>=0 && vspen(table[lf][c].col))
+ fprintf(tabout, ".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",s,'a'+c,s,'a'+c);
+ else
+ fprintf(tabout, ".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",s,s);
+ }
+if (allflg && once>0 )
+ fullwide(i,'-');
+once=1;
+runtabs(i, nl);
+if (allh(nl) && !pr1403)
+ {
+ fprintf(tabout, ".nr %d \\n(.v\n", SVS);
+ fprintf(tabout, ".vs \\n(.vu-\\n(.sp\n");
+ }
+if (chfont)
+ fprintf(tabout, ".nr %2d \\n(.f\n", S1);
+fprintf(tabout, ".nr 35 1m\n");
+fprintf(tabout, "\\&");
+vct = 0;
+for(c=0; c<ncol; c++)
+ {
+ if (watchout==0 && i+1<nlin && (lf=left(i,c, &lwid))>=0)
+ {
+ tohcol(c);
+ drawvert(lf, i, c, lwid);
+ vct += 2;
+ }
+ if (rightl && c+1==ncol) continue;
+ vforml=i;
+ for(lf=prev(nl); lf>=0 && vspen(table[lf][c].col); lf=prev(lf))
+ vforml= lf;
+ form= ctype(vforml,c);
+ if (form != 's')
+ {
+ ct = c+CLEFT;
+ if (form=='a') ct = c+CMID;
+ if (form=='n' && table[nl][c].rcol && lused[c]==0) ct= c+CMID;
+ fprintf(tabout, "\\h'|\\n(%du'", ct);
+ }
+ s= table[nl][c].col;
+ fn = font[stynum[vforml]][c];
+ size = csize[stynum[vforml]][c];
+ if (*size==0)size=0;
+ switch(ct=ctype(vforml, c))
+ {
+ case 'n':
+ case 'a':
+ if (table[nl][c].rcol)
+ {
+ if (lused[c]) /*Zero field width*/
+ {
+ ip = prev(nl);
+ if (ip>=0)
+ if (vspen(table[ip][c].col))
+ {
+ if (exvspen==0)
+ {
+ fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
+ if (cmidx)
+ fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
+ vct++;
+ fprintf(tabout, "'");
+ exvspen=1;
+ }
+ }
+ fprintf(tabout, "%c%c",F1,F2);
+ puttext(s,fn,size);
+ fprintf(tabout, "%c",F1);
+ }
+ s= table[nl][c].rcol;
+ form=1;
+ break;
+ }
+ case 'c':
+ form=3; break;
+ case 'r':
+ form=2; break;
+ case 'l':
+ form=1; break;
+ case '-':
+ case '=':
+ if (real(table[nl][c].col))
+ fprintf(stderr,gettext("%s: line %d: Data ignored on table line %d\n"), ifile, iline-1, i+1);
+ makeline(i,c,ct);
+ continue;
+ default:
+ continue;
+ }
+ if (realsplit ? rused[c]: used[c]) /*Zero field width*/
+ {
+ /* form: 1 left, 2 right, 3 center adjust */
+ if (ifline(s))
+ {
+ makeline(i,c,ifline(s));
+ continue;
+ }
+ if (filler(s))
+ {
+ printf("\\l'|\\n(%du\\&%s'", c+CRIGHT, s+2);
+ continue;
+ }
+ ip = prev(nl);
+ cmidx = ctop[stynum[nl]][c]==0;
+ if (ip>=0)
+ if (vspen(table[ip][c].col))
+ {
+ if (exvspen==0)
+ {
+ fprintf(tabout, "\\v'-(\\n(\\*(#du-\\n(^%cu", c+'a');
+ if (cmidx)
+ fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
+ vct++;
+ fprintf(tabout, "'");
+ }
+ }
+ fprintf(tabout, "%c", F1);
+ if (form!= 1)
+ fprintf(tabout, "%c", F2);
+ if (vspen(s))
+ vspf=1;
+ else
+ puttext(s, fn, size);
+ if (form !=2)
+ fprintf(tabout, "%c", F2);
+ fprintf(tabout, "%c", F1);
+ }
+ if (ip>=0)
+ if (vspen(table[ip][c].col))
+ {
+ exvspen = (c+1 < ncol) && vspen(table[ip][c+1].col) &&
+ (topat[c] == topat[c+1]) &&
+ (cmidx == (ctop [stynum[nl]][c+1]==0)) && (left(i,c+1,&lwid)<0);
+ if (exvspen==0)
+ {
+ fprintf(tabout, "\\v'(\\n(\\*(#du-\\n(^%cu", c+'a');
+ if (cmidx)
+ fprintf(tabout, "-((\\n(#-u-\\n(^%cu)/2u)", c+'a');
+ vct++;
+ fprintf(tabout, "'");
+ }
+ }
+ else
+ exvspen=0;
+ /* if lines need to be split for gcos here is the place for a backslash */
+ if (vct > 7 && c < ncol)
+ {
+ fprintf(tabout, "\n.sp-1\n\\&");
+ vct=0;
+ }
+ }
+fprintf(tabout, "\n");
+if (allh(nl) && !pr1403) fprintf(tabout, ".vs \\n(%du\n", SVS);
+if (watchout)
+ funnies(i,nl);
+if (vspf)
+ {
+ for(c=0; c<ncol; c++)
+ if (vspen(table[nl][c].col) && (nl==0 || (lf=prev(nl))<0 || !vspen(table[lf][c].col)))
+ {
+ fprintf(tabout, ".nr ^%c \\n(#^u\n", 'a'+c);
+ topat[c]=nl;
+ }
+ }
+}
+puttext(s,fn, size)
+ char *s, *size, *fn;
+{
+if (point(s))
+ {
+ putfont(fn);
+ putsize(size);
+ fprintf(tabout, "%s",s);
+ if (*fn>0) fprintf(tabout, "\\f\\n(%2d", S1);
+ if (size!=0) putsize("0");
+ }
+}
+funnies( stl, lin)
+{
+/* write out funny diverted things */
+int c, s, pl, lwid, dv, lf, ct;
+char *fn;
+fprintf(tabout, ".mk ##\n"); /* rmember current vertical position */
+fprintf(tabout, ".nr %d \\n(##\n", S1); /* bottom position */
+for(c=0; c<ncol; c++)
+ {
+ s = (int)table[lin][c].col;
+ if (point(s)) continue;
+ if (s==0) continue;
+ fprintf(tabout, ".sp |\\n(##u-1v\n");
+ fprintf(tabout, ".nr %d ", SIND);
+ for(pl=stl; pl>=0 && !isalpha(ct=ctype(pl,c)); pl=prev(pl))
+ ;
+ switch (ct)
+ {
+ case 'n':
+ case 'c':
+ fprintf(tabout, "(\\n(%du+\\n(%du-\\n(%c-u)/2u\n",c+CLEFT,c-1+ctspan(lin,c)+CRIGHT, s);
+ break;
+ case 'l':
+ fprintf(tabout, "\\n(%du\n",c+CLEFT);
+ break;
+ case 'a':
+ fprintf(tabout, "\\n(%du\n",c+CMID);
+ break;
+ case 'r':
+ fprintf(tabout, "\\n(%du-\\n(%c-u\n", c+CRIGHT, s);
+ break;
+ }
+ fprintf(tabout, ".in +\\n(%du\n", SIND);
+ fn=font[stynum[stl]][c];
+ putfont(fn);
+ pl = prev(stl);
+ if (stl>0 && pl>=0 && vspen(table[pl][c].col))
+ {
+ fprintf(tabout, ".sp |\\n(^%cu\n", 'a'+c);
+ if (ctop[stynum[stl]][c]==0)
+ {
+ fprintf(tabout, ".nr %d \\n(#-u-\\n(^%c-\\n(%c|+1v\n",TMP, 'a'+c, s);
+ fprintf(tabout, ".if \\n(%d>0 .sp \\n(%du/2u\n", TMP, TMP);
+ }
+ }
+ fprintf(tabout, ".%c+\n",s);
+ fprintf(tabout, ".in -\\n(%du\n", SIND);
+ if (*fn>0) putfont("P");
+ fprintf(tabout, ".mk %d\n", S2);
+ fprintf(tabout, ".if \\n(%d>\\n(%d .nr %d \\n(%d\n", S2, S1, S1, S2);
+ }
+fprintf(tabout, ".sp |\\n(%du\n", S1);
+for(c=dv=0; c<ncol; c++)
+ {
+ if (stl+1< nlin && (lf=left(stl,c,&lwid))>=0)
+ {
+ if (dv++ == 0)
+ fprintf(tabout, ".sp -1\n");
+ tohcol(c);
+ dv++;
+ drawvert(lf, stl, c, lwid);
+ }
+ }
+if (dv)
+ fprintf(tabout,"\n");
+}
+putfont(fn)
+ char *fn;
+{
+if (fn && *fn)
+ fprintf(tabout, fn[1] ? "\\f(%.2s" : "\\f%.2s", fn);
+}
+putsize(s)
+ char *s;
+{
+if (s && *s)
+ fprintf(tabout, "\\s%s",s);
+}
diff --git a/usr/src/cmd/tbl/t9.c b/usr/src/cmd/tbl/t9.c
new file mode 100644
index 0000000000..d18d0a33e9
--- /dev/null
+++ b/usr/src/cmd/tbl/t9.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+ /* t9.c: write lines for tables over 200 lines */
+# include "t..c"
+static useln;
+yetmore()
+{
+for(useln=0; useln<MAXLIN && table[useln]==0; useln++);
+if (useln>=MAXLIN)
+ error(gettext("Weird. No data in table."));
+table[0]=table[useln];
+for(useln=nlin-1; useln>=0 && (fullbot[useln] || instead[useln]); useln--);
+if (useln<0)
+ error(gettext("Weird. No real lines in table."));
+domore(leftover);
+while (gets1(cstore=cspace, MAXSTR) && domore(cstore))
+ ;
+last =cstore;
+return;
+}
+domore(dataln)
+ char *dataln;
+{
+ int icol, ch;
+if (prefix(".TE", dataln))
+ return(0);
+if (dataln[0] == '.' && !isdigit((unsigned char)dataln[1]))
+ {
+ puts(dataln);
+ return(1);
+ }
+instead[0]=0;
+fullbot[0]=0;
+if (dataln[1]==0)
+switch(dataln[0])
+ {
+ case '_': fullbot[0]= '-'; putline(useln,0); return(1);
+ case '=': fullbot[0]= '='; putline(useln, 0); return(1);
+ }
+for (icol = 0; icol <ncol; icol++)
+ {
+ table[0][icol].col = dataln;
+ table[0][icol].rcol=0;
+ for(; (ch= *dataln) != '\0' && ch != tab; dataln++)
+ ;
+ *dataln++ = '\0';
+ switch(ctype(useln,icol))
+ {
+ case 'n':
+ table[0][icol].rcol = maknew(table[0][icol].col);
+ break;
+ case 'a':
+ table[0][icol].rcol = table[0][icol].col;
+ table[0][icol].col= "";
+ break;
+ }
+ while (ctype(useln,icol+1)== 's') /* spanning */
+ table[0][++icol].col = "";
+ if (ch == '\0') break;
+ }
+while (++icol <ncol)
+ table[0][icol].col = "";
+putline(useln,0);
+return(1);
+}
diff --git a/usr/src/cmd/tbl/tb.c b/usr/src/cmd/tbl/tb.c
new file mode 100644
index 0000000000..c6d06963e1
--- /dev/null
+++ b/usr/src/cmd/tbl/tb.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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tb.c: check which entries exist, also storage allocation */
+# include "t..c"
+checkuse()
+{
+int i,c, k;
+for(c=0; c<ncol; c++)
+ {
+ used[c]=lused[c]=rused[c]=0;
+ for(i=0; i<nlin; i++)
+ {
+ if (instead[i] || fullbot[i]) continue;
+ k = ctype(i,c);
+ if (k== '-' || k == '=') continue;
+ if ((k=='n'||k=='a'))
+ {
+ rused[c]|= real(table[i][c].rcol);
+ if( !real(table[i][c].rcol))
+ used[c] |= real(table[i][c].col);
+ if (table[i][c].rcol)
+ lused[c] |= real(table[i][c].col);
+ }
+ else
+ used[c] |= real(table[i][c].col);
+ }
+ }
+}
+real(s)
+ char *s;
+{
+if (s==0) return(0);
+if (!point(s)) return(1);
+if (*s==0) return(0);
+return(1);
+}
+int spcount = 0;
+extern char * calloc();
+# define MAXVEC 20
+char *spvecs[MAXVEC];
+
+char *
+chspace()
+{
+char *pp;
+if (spvecs[spcount])
+ return(spvecs[spcount++]);
+if (spcount>=MAXVEC)
+ error(gettext("Too many characters in table"));
+spvecs[spcount++]= pp = calloc(MAXCHS+MAXSTR,1);
+if (pp == 0)
+ error(gettext("no space for characters"));
+return(pp);
+}
+# define MAXPC 50
+char *thisvec;
+int tpcount = -1;
+char *tpvecs[MAXPC];
+
+int *
+alocv(n)
+{
+int *tp, *q;
+if (tpcount<0 || thisvec+n > tpvecs[tpcount]+MAXCHS)
+ {
+ tpcount++;
+ if (tpvecs[tpcount]==0)
+ {
+ tpvecs[tpcount] = calloc(MAXCHS,1);
+ }
+ thisvec = tpvecs[tpcount];
+ if (thisvec == 0)
+ error(gettext("no space for vectors"));
+ }
+tp=(int *)thisvec;
+thisvec+=n;
+for(q=tp; q<(int *)thisvec; q++)
+ *q=0;
+return(tp);
+}
+release()
+{
+extern char *exstore;
+/* give back unwanted space in some vectors */
+spcount=0;
+tpcount= -1;
+exstore=0;
+}
diff --git a/usr/src/cmd/tbl/tc.c b/usr/src/cmd/tbl/tc.c
new file mode 100644
index 0000000000..113c271943
--- /dev/null
+++ b/usr/src/cmd/tbl/tc.c
@@ -0,0 +1,87 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tc.c: find character not in table to delimit fields */
+# include "t..c"
+choochar()
+{
+/* choose funny characters to delimit fields */
+int had[128], ilin,icol, k;
+char *s;
+for(icol=0; icol<128; icol++)
+ had[icol]=0;
+F1 = F2 = 0;
+for(ilin=0;ilin<nlin;ilin++)
+ {
+ if (instead[ilin]) continue;
+ if (fullbot[ilin]) continue;
+ for(icol=0; icol<ncol; icol++)
+ {
+ k = ctype(ilin, icol);
+ if (k==0 || k == '-' || k == '=')
+ continue;
+ s = table[ilin][icol].col;
+ if (point(s))
+ while (*s)
+ {
+ if (*s > 0 && *s <= 127)
+ had[*s++]=1;
+ else
+ s++;
+ }
+ s=table[ilin][icol].rcol;
+ if (point(s))
+ while (*s)
+ {
+ if (*s > 0 && *s <= 127)
+ had[*s++]=1;
+ else
+ s++;
+ }
+ }
+ }
+/* choose first funny character */
+for(
+ s="\002\003\005\006\007!%&#/?,:;<=>@`^~_{}+-*ABCDEFGHIJKMNOPQRSTUVWXYZabcdefgjkoqrstwxyz";
+ *s; s++)
+ {
+ if (had[*s]==0)
+ {
+ F1= *s;
+ had[F1]=1;
+ break;
+ }
+ }
+/* choose second funny character */
+for(
+ s="\002\003\005\006\007:_~^`@;,<=>#%&!/?{}+-*ABCDEFGHIJKMNOPQRSTUVWXZabcdefgjkoqrstuwxyz";
+ *s; s++)
+ {
+ if (had[*s]==0)
+ {
+ F2= *s;
+ break;
+ }
+ }
+if (F1==0 || F2==0)
+ error(gettext("couldn't find characters to use for delimiters"));
+return;
+}
+point(s)
+{
+return(s>= 128 || s<0);
+}
diff --git a/usr/src/cmd/tbl/te.c b/usr/src/cmd/tbl/te.c
new file mode 100644
index 0000000000..8f85f731fc
--- /dev/null
+++ b/usr/src/cmd/tbl/te.c
@@ -0,0 +1,119 @@
+/* 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 1983-1988,2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+ /* te.c: error message control, input line count */
+# include "t..c"
+# include <locale.h>
+# include <errno.h>
+error(s)
+ char *s;
+{
+fprintf(stderr, gettext("\n%s: line %d: %s\n"), ifile, iline, s);
+# ifdef unix
+fprintf(stderr, gettext("tbl quits\n"));
+exit(1);
+# endif
+# ifdef gcos
+fprintf(stderr, "run terminated due to error condition detected by tbl preprocessor\n");
+exit(0);
+# endif
+}
+char *
+errmsg(errnum)
+ int errnum;
+{
+extern int sys_nerr;
+extern char *sys_errlist[];
+static char errmsgbuf[18];
+if (errnum > sys_nerr)
+ {
+ sprintf(errmsgbuf, "Error %d", errnum);
+ return (errmsgbuf);
+ }
+else
+ return (sys_errlist[errnum]);
+}
+char *
+gets1(s, len)
+ char *s;
+ int len;
+{
+char *p;
+int nbl;
+while(len > 0)
+ {
+ iline++;
+ while ((p = fgets(s,len,tabin))==0)
+ {
+ if (swapin()==0)
+ return(0);
+ }
+
+ while (*s) s++;
+ s--;
+ if (*s == '\n') *s-- =0;
+ else
+ {
+ if (!feof(tabin))
+ {
+ if (ferror(tabin))
+ error(errmsg(errno));
+ else
+ error(gettext("Line too long"));
+ }
+ }
+ for(nbl=0; *s == '\\' && s>p; s--)
+ nbl++;
+ if (linstart && nbl % 2) /* fold escaped nl if in table */
+ {
+ s++;
+ len -= s - p;
+ continue;
+ }
+ break;
+ }
+
+return(p);
+}
+# define BACKMAX 500
+char backup[BACKMAX];
+char *backp = backup;
+un1getc(c)
+{
+if (c=='\n')
+ iline--;
+*backp++ = c;
+if (backp >= backup+BACKMAX)
+ error(gettext("too much backup"));
+}
+get1char()
+{
+int c;
+if (backp>backup)
+ c = *--backp;
+else
+ c=getc(tabin);
+if (c== EOF) /* EOF */
+ {
+ if (swapin() ==0)
+ error(gettext("unexpected EOF"));
+ c = getc(tabin);
+ }
+if (c== '\n')
+ iline++;
+return(c);
+}
diff --git a/usr/src/cmd/tbl/tf.c b/usr/src/cmd/tbl/tf.c
new file mode 100644
index 0000000000..9ad09a9073
--- /dev/null
+++ b/usr/src/cmd/tbl/tf.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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tf.c: save and restore fill mode around table */
+# include "t..c"
+savefill()
+{
+/* remembers various things: fill mode, vs, ps in mac 35 (SF) */
+fprintf(tabout, ".de %d\n",SF);
+fprintf(tabout, ".ps \\n(.s\n");
+fprintf(tabout, ".vs \\n(.vu\n");
+fprintf(tabout, ".in \\n(.iu\n");
+fprintf(tabout, ".if \\n(.u .fi\n");
+fprintf(tabout, ".if \\n(.j .ad\n");
+fprintf(tabout, ".if \\n(.j=0 .na\n");
+fprintf(tabout, "..\n");
+fprintf(tabout, ".nf\n");
+/* set obx offset if useful */
+fprintf(tabout, ".nr #~ 0\n");
+fprintf(tabout, ".if n .nr #~ 0.6n\n");
+}
+rstofill()
+{
+fprintf(tabout, ".%d\n",SF);
+}
+endoff()
+{
+int i;
+ for(i=0; i<MAXHEAD; i++)
+ if (linestop[i])
+ fprintf(tabout, ".nr #%c 0\n", 'a'+i);
+ for(i=0; i<texct; i++)
+ fprintf(tabout, ".rm %c+\n",texstr[i]);
+fprintf(tabout, "%s\n", last);
+}
+ifdivert()
+{
+fprintf(tabout, ".ds #d .d\n");
+fprintf(tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
+}
+saveline()
+{
+fprintf(tabout, ".if \\n+(b.=1 .nr d. \\n(.c-\\n(c.-1\n");
+linstart=iline;
+}
+restline()
+{
+fprintf(tabout,".if \\n-(b.=0 .nr c. \\n(.c-\\n(d.-%d\n", iline-linstart);
+linstart = 0;
+}
+cleanfc()
+{
+fprintf(tabout, ".fc\n");
+}
diff --git a/usr/src/cmd/tbl/tg.c b/usr/src/cmd/tbl/tg.c
new file mode 100644
index 0000000000..ccd1f87334
--- /dev/null
+++ b/usr/src/cmd/tbl/tg.c
@@ -0,0 +1,87 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tg.c: process included text blocks */
+# include "t..c"
+/* get_text was originally gettext and was renamed */
+get_text(sp, ilin,icol, fn, sz)
+ char *sp, *fn, *sz;
+{
+/* get a section of text */
+char line[BIGBUF];
+int oname;
+char *vs;
+if (texname==0) error(gettext("Too many text block diversions"));
+if (textflg==0)
+ {
+ fprintf(tabout, ".nr %d \\n(.lu\n", SL); /* remember old line length */
+ textflg=1;
+ }
+fprintf(tabout, ".eo\n");
+fprintf(tabout, ".am %02d\n", icol+80);
+fprintf(tabout, ".br\n");
+fprintf(tabout, ".di %c+\n", texname);
+rstofill();
+if (fn && *fn) fprintf(tabout, ".nr %d \\n(.f\n.ft %s\n", S1, fn);
+fprintf(tabout, ".ft \\n(.f\n"); /* protect font */
+vs = vsize[stynum[ilin]][icol];
+if ((sz && *sz) || (vs && *vs))
+ {
+ fprintf(tabout, ".nr %d \\n(.v\n", S2);
+ if (vs==0 || *vs==0) vs= "\\n(.s+2";
+ if (sz && *sz)
+ fprintf(tabout, ".ps %s\n",sz);
+ fprintf(tabout, ".vs %s\n",vs);
+ fprintf(tabout, ".if \\n(%du>\\n(.vu .sp \\n(%du-\\n(.vu\n", S2,S2);
+ }
+if (cll[icol][0])
+ fprintf(tabout, ".ll %sn\n", cll[icol]);
+else
+ fprintf(tabout, ".ll \\n(%du*%du/%du\n",SL,ctspan(ilin,icol),ncol+1);
+fprintf(tabout,".if \\n(.l<\\n(%d .ll \\n(%du\n", icol+CRIGHT, icol+CRIGHT);
+if (ctype(ilin,icol)=='a')
+ fprintf(tabout, ".ll -2n\n");
+fprintf(tabout, ".in 0\n");
+while (gets1(line, sizeof line))
+ {
+ if (line[0]=='T' && line[1]=='}' && line[2]== tab) break;
+ if (match("T}", line)) break;
+ fprintf(tabout, "%s\n", line);
+ }
+if (fn && *fn) fprintf(tabout, ".ft \\n(%d\n", S1);
+if (sz && *sz) fprintf(tabout, ".br\n.ps\n.vs\n");
+fprintf(tabout, ".br\n");
+fprintf(tabout, ".di\n");
+fprintf(tabout, ".nr %c| \\n(dn\n", texname);
+fprintf(tabout, ".nr %c- \\n(dl\n", texname);
+fprintf(tabout, "..\n");
+fprintf(tabout, ".ec \\\n");
+/* copy remainder of line */
+if (line[2])
+ tcopy (sp, line+3);
+else
+ *sp=0;
+oname=texname;
+texname = texstr[++texct];
+return(oname);
+}
+untext()
+{
+rstofill();
+fprintf(tabout, ".nf\n");
+fprintf(tabout, ".ll \\n(%du\n", SL);
+}
diff --git a/usr/src/cmd/tbl/ti.c b/usr/src/cmd/tbl/ti.c
new file mode 100644
index 0000000000..2d980827d0
--- /dev/null
+++ b/usr/src/cmd/tbl/ti.c
@@ -0,0 +1,73 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* ti.c: classify line intersections */
+# include "t..c"
+/* determine local environment for intersections */
+interv(i,c)
+{
+int ku, kl;
+if (c>=ncol || c == 0)
+ {
+ if (dboxflg)
+ {
+ if (i==0) return(BOT);
+ if (i>=nlin) return(TOP);
+ return(THRU);
+ }
+ if (c>=ncol)
+ return(0);
+ }
+ku = i>0 ? lefdata(i-1,c) : 0;
+if (i+1 >= nlin)
+ kl=0;
+else
+kl = lefdata(allh(i) ? i+1 : i, c);
+if (ku==2 && kl==2) return(THRU);
+if (ku ==2) return(TOP);
+if (kl==BOT) return(2);
+return(0);
+}
+interh(i,c)
+{
+int kl, kr;
+if (fullbot[i]== '=' || (dboxflg && (i==0 || i>= nlin-1)))
+ {
+ if (c==ncol)
+ return(LEFT);
+ if (c==0)
+ return(RIGHT);
+ return(THRU);
+ }
+if (i>=nlin) return(0);
+kl = c>0 ? thish (i,c-1) : 0;
+if (kl<=1 && i>0 && allh(up1(i)))
+ kl = c>0 ? thish(up1(i),c-1) : 0;
+kr = thish(i,c);
+if (kr<=1 && i>0 && allh(up1(i)))
+ kr = c>0 ? thish(up1(i), c) : 0;
+if (kl== '=' && kr == '=') return(THRU);
+if (kl== '=') return(LEFT);
+if (kr== '=') return(RIGHT);
+return(0);
+}
+up1(i)
+{
+i--;
+while (instead[i] && i>0) i--;
+return(i);
+}
diff --git a/usr/src/cmd/tbl/tm.c b/usr/src/cmd/tbl/tm.c
new file mode 100644
index 0000000000..b3cf5249d0
--- /dev/null
+++ b/usr/src/cmd/tbl/tm.c
@@ -0,0 +1,85 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tm.c: split numerical fields */
+# include "t..c"
+char *
+maknew(str)
+ char *str;
+{
+ /* make two numerical fields */
+ int c;
+ char *dpoint, *p, *q, *ba;
+ p = str;
+ for (ba= 0; c = *str; str++)
+ if (c == '\\' && *(str+1)== '&')
+ ba=str;
+ str=p;
+ if (ba==0)
+ {
+ for (dpoint=0; *str; str++)
+ {
+ if (*str=='.' && !ineqn(str,p) &&
+ (str>p && digit(*(str-1)) ||
+ digit(*(str+1))))
+ dpoint=str;
+ }
+ if (dpoint==0)
+ for(; str>p; str--)
+ {
+ if (digit( * (str-1) ) && !ineqn(str, p))
+ break;
+ }
+ if (!dpoint && p==str) /* not numerical, don't split */
+ return(0);
+ if (dpoint) str=dpoint;
+ }
+ else
+ str = ba;
+ p =str;
+ if (exstore ==0 || exstore >exlim)
+ {
+ exstore = chspace();
+ exlim= exstore+MAXCHS;
+ }
+ q = exstore;
+ ba = exstore + MAXSTR;
+ do {
+ if (exstore > ba)
+ error(gettext("numeric field too big"));
+ } while (*exstore++ = *str++);
+ *p = 0;
+ return(q);
+ }
+ineqn (s, p)
+ char *s, *p;
+{
+/* true if s is in a eqn within p */
+int ineq = 0, c;
+while (c = *p)
+ {
+ if (s == p)
+ return(ineq);
+ p++;
+ if ((ineq == 0) && (c == delim1))
+ ineq = 1;
+ else
+ if ((ineq == 1) && (c == delim2))
+ ineq = 0;
+ }
+return(0);
+}
diff --git a/usr/src/cmd/tbl/ts.c b/usr/src/cmd/tbl/ts.c
new file mode 100644
index 0000000000..393b88ce7d
--- /dev/null
+++ b/usr/src/cmd/tbl/ts.c
@@ -0,0 +1,66 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* ts.c: minor string processing subroutines */
+match (s1, s2)
+ char *s1, *s2;
+{
+ while (*s1 == *s2)
+ if (*s1++ == '\0')
+ return(1);
+ else
+ s2++;
+ return(0);
+}
+prefix(small, big)
+ char *small, *big;
+{
+int c;
+while ((c= *small++) == *big++)
+ if (c==0) return(1);
+return(c==0);
+}
+letter (ch)
+ {
+ if (ch >= 'a' && ch <= 'z')
+ return(1);
+ if (ch >= 'A' && ch <= 'Z')
+ return(1);
+ return(0);
+ }
+numb(str)
+ char *str;
+ {
+ /* convert to integer */
+ int k;
+ for (k=0; *str >= '0' && *str <= '9'; str++)
+ k = k*10 + *str - '0';
+ return(k);
+ }
+digit(x)
+ {
+ return(x>= '0' && x<= '9');
+ }
+max(a,b)
+{
+return( a>b ? a : b);
+}
+tcopy (s,t)
+ char *s, *t;
+{
+ while (*s++ = *t++);
+}
diff --git a/usr/src/cmd/tbl/tt.c b/usr/src/cmd/tbl/tt.c
new file mode 100644
index 0000000000..817f7f6a30
--- /dev/null
+++ b/usr/src/cmd/tbl/tt.c
@@ -0,0 +1,102 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tt.c: subroutines for drawing horizontal lines */
+# include "t..c"
+ctype(il, ic)
+{
+if (instead[il])
+ return(0);
+if (fullbot[il])
+ return(0);
+il = stynum[il];
+return(style[il][ic]);
+}
+min(a,b)
+{
+return(a<b ? a : b);
+}
+fspan(i,c)
+{
+c++;
+return(c<ncol && ctype(i,c)=='s');
+}
+lspan(i,c)
+{
+int k;
+if (ctype(i,c) != 's') return(0);
+c++;
+if (c < ncol && ctype(i,c)== 's')
+ return(0);
+for(k=0; ctype(i,--c) == 's'; k++);
+return(k);
+}
+ctspan(i,c)
+{
+int k;
+c++;
+for(k=1; c<ncol && ctype(i,c)=='s'; k++)
+ c++;
+return(k);
+}
+tohcol(ic)
+{
+ if (ic==0)
+ fprintf(tabout, "\\h'|0'");
+ else
+ fprintf(tabout, "\\h'(|\\n(%du+|\\n(%du)/2u'", ic+CLEFT, ic+CRIGHT-1);
+}
+allh(i)
+{
+/* return true if every element in line i is horizontal */
+/* also at least one must be horizontl */
+int c, one, k;
+if (fullbot[i]) return(1);
+for(one=c=0; c<ncol; c++)
+ {
+ k = thish(i,c);
+ if (k==0) return(0);
+ if (k==1) continue;
+ one=1;
+ }
+return(one);
+}
+thish(i,c)
+{
+ int t;
+ char *s;
+ struct colstr *pc;
+ if (c<0)return(0);
+ if (i<0) return(0);
+ t = ctype(i,c);
+ if (t=='_' || t == '-')
+ return('-');
+ if (t=='=')return('=');
+ if (t=='^') return(1);
+ if (fullbot[i] )
+ return(fullbot[i]);
+ if (t=='s') return(thish(i,c-1));
+ if (t==0) return(1);
+ pc = &table[i][c];
+ s = (t=='a' ? pc->rcol : pc->col);
+ if (s==0 || (point(s) && *s==0))
+ return(1);
+ if (vspen(s)) return(1);
+ if (t=barent( s))
+ return(t);
+ return(0);
+}
diff --git a/usr/src/cmd/tbl/tu.c b/usr/src/cmd/tbl/tu.c
new file mode 100644
index 0000000000..8771729f40
--- /dev/null
+++ b/usr/src/cmd/tbl/tu.c
@@ -0,0 +1,219 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tu.c: draws horizontal lines */
+# include "t..c"
+makeline(i,c,lintype)
+{
+int cr, type, shortl;
+type = thish(i,c);
+if (type==0) return;
+cr=c;
+shortl = (table[i][c].col[0]=='\\');
+if (c>0 && !shortl && thish(i,c-1) == type)return;
+if (shortl==0)
+ for(cr=c; cr < ncol && (ctype(i,cr)=='s'||type==thish(i,cr)); cr++);
+else
+ for(cr=c+1; cr<ncol && ctype(i,cr)=='s'; cr++);
+drawline(i, c, cr-1, lintype, 0, shortl);
+}
+fullwide(i, lintype)
+{
+int cr, cl;
+if (!pr1403)
+ fprintf(tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
+cr= 0;
+while (cr<ncol)
+ {
+ cl=cr;
+ while (i>0 && vspand(prev(i),cl,1))
+ cl++;
+ for(cr=cl; cr<ncol; cr++)
+ if (i>0 && vspand(prev(i),cr,1))
+ break;
+ if (cl<ncol)
+ drawline(i,cl,(cr<ncol?cr-1:cr),lintype,1,0);
+ }
+fprintf(tabout, "\n");
+if (!pr1403)
+ fprintf(tabout, ".vs \\n(%du\n", SVS);
+}
+
+drawline(i, cl, cr, lintype, noheight, shortl)
+{
+ char *exhr, *exhl, *lnch;
+ int lcount, ln, linpos, oldpos, nodata;
+lcount=0;
+exhr=exhl= "";
+switch(lintype)
+ {
+ case '-': lcount=1;break;
+ case '=': lcount = pr1403? 1 : 2; break;
+ case SHORTLINE: lcount=1; break;
+ }
+if (lcount<=0) return;
+nodata = cr-cl>=ncol || noheight || allh(i);
+ if (!nodata)
+ fprintf(tabout, "\\v'-.5m'");
+for(ln=oldpos=0; ln<lcount; ln++)
+ {
+ linpos = 2*ln - lcount +1;
+ if (linpos != oldpos)
+ fprintf(tabout, "\\v'%dp'", linpos-oldpos);
+ oldpos=linpos;
+ if (shortl==0)
+ {
+ tohcol(cl);
+ if (lcount>1)
+ {
+ switch(interv(i,cl))
+ {
+ case TOP: exhl = ln==0 ? "1p" : "-1p"; break;
+ case BOT: exhl = ln==1 ? "1p" : "-1p"; break;
+ case THRU: exhl = "1p"; break;
+ }
+ if (exhl[0])
+ fprintf(tabout, "\\h'%s'", exhl);
+ }
+ else if (lcount==1)
+ {
+ switch(interv(i,cl))
+ {
+ case TOP: case BOT: exhl = "-1p"; break;
+ case THRU: exhl = "1p"; break;
+ }
+ if (exhl[0])
+ fprintf(tabout, "\\h'%s'", exhl);
+ }
+ if (lcount>1)
+ {
+ switch(interv(i,cr+1))
+ {
+ case TOP: exhr = ln==0 ? "-1p" : "+1p"; break;
+ case BOT: exhr = ln==1 ? "-1p" : "+1p"; break;
+ case THRU: exhr = "-1p"; break;
+ }
+ }
+ else if (lcount==1)
+ {
+ switch(interv(i,cr+1))
+ {
+ case TOP: case BOT: exhr = "+1p"; break;
+ case THRU: exhr = "-1p"; break;
+ }
+ }
+ }
+ else
+ fprintf(tabout, "\\h'|\\n(%du'", cl+CLEFT);
+ fprintf(tabout, "\\s\\n(%d",LSIZE);
+ if (linsize)
+ fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
+ if (shortl)
+ fprintf(tabout, "\\l'|\\n(%du'", cr+CRIGHT);
+ else
+ {
+ lnch = "\\(ul";
+ if (pr1403)
+ lnch = lintype==2 ? "=" : "\\(ru";
+ if (cr+1>=ncol)
+ fprintf(tabout, "\\l'|\\n(TWu%s%s'", exhr,lnch);
+ else
+ fprintf(tabout, "\\l'(|\\n(%du+|\\n(%du)/2u%s%s'", cr+CRIGHT,
+ cr+1+CLEFT, exhr, lnch);
+ }
+ if (linsize)
+ fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
+ fprintf(tabout, "\\s0");
+ }
+if (oldpos!=0)
+ fprintf(tabout, "\\v'%dp'", -oldpos);
+if (!nodata)
+ fprintf(tabout, "\\v'+.5m'");
+}
+getstop()
+{
+int i,c,k,junk, stopp;
+stopp=1;
+for(i=0; i<MAXLIN; i++)
+ linestop[i]=0;
+for(i=0; i<nlin; i++)
+ for(c=0; c<ncol; c++)
+ {
+ k = left(i,c,&junk);
+ if (k>=0 && linestop[k]==0)
+ linestop[k]= ++stopp;
+ }
+if (boxflg || allflg || dboxflg)
+ linestop[0]=1;
+}
+left(i,c, lwidp)
+ int *lwidp;
+{
+int kind, li, lj;
+ /* returns -1 if no line to left */
+ /* returns number of line where it starts */
+ /* stores into lwid the kind of line */
+*lwidp=0;
+kind = lefdata(i,c);
+if (kind==0) return(-1);
+if (i+1<nlin)
+if (lefdata(next(i),c)== kind) return(-1);
+while (i>=0 && lefdata(i,c)==kind)
+ i=prev(li=i);
+if (prev(li)== -1) li=0;
+*lwidp=kind;
+for(lj= i+1; lj<li; lj++)
+ if (instead[lj] && strcmp(instead[lj], ".TH")==0)
+ return(li);
+for(i= i+1; i<li; i++)
+ if (fullbot[i])
+ li=i;
+return(li);
+}
+lefdata(i,c)
+{
+int ck;
+if (i>=nlin) i=nlin-1;
+if (ctype(i,c) == 's')
+ {
+ for(ck=c; ctype(i,ck)=='s'; ck--);
+ if (thish(i,ck)==0)
+ return(0);
+ }
+i =stynum[i];
+i = lefline[i][c];
+if (i>0) return(i);
+if (dboxflg && c==0) return(2);
+if (allflg)return(1);
+if (boxflg && c==0) return(1);
+return(0);
+}
+next(i)
+{
+while (i+1 <nlin)
+ {
+ i++;
+ if (!fullbot[i] && !instead[i]) break;
+ }
+return(i);
+}
+prev(i)
+{
+while (--i >=0 && (fullbot[i] || instead[i]))
+ ;
+return(i);
+}
diff --git a/usr/src/cmd/tbl/tv.c b/usr/src/cmd/tbl/tv.c
new file mode 100644
index 0000000000..37afe3f2de
--- /dev/null
+++ b/usr/src/cmd/tbl/tv.c
@@ -0,0 +1,165 @@
+/* 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.
+ */
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+ /* tv.c: draw vertical lines */
+# include "t..c"
+drawvert(start,end, c, lwid)
+{
+char *exb=0, *ext=0;
+int tp=0, sl, ln, pos, epb, ept, vm;
+end++;
+vm='v';
+/* note: nr 35 has value of 1m outside of linesize */
+while (instead[end]) end++;
+for(ln=0; ln<lwid; ln++)
+ {
+ epb=ept=0;
+ pos = 2*ln-lwid+1;
+ if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp);
+ tp = pos;
+ if (end<nlin)
+ {
+ if (fullbot[end]|| (!instead[end] && allh(end)))
+ epb=2;
+ else
+ switch (midbar(end,c))
+ {
+ case '-':
+ exb = "1v-.5m"; break;
+ case '=':
+ exb = "1v-.5m";
+ epb = 1; break;
+ }
+ }
+ if (lwid>1)
+ switch(interh(end, c))
+ {
+ case THRU: epb -= 1; break;
+ case RIGHT: epb += (ln==0 ? 1 : -1); break;
+ case LEFT: epb += (ln==1 ? 1 : -1); break;
+ }
+ if (lwid==1)
+ switch(interh(end,c))
+ {
+ case THRU: epb -= 1; break;
+ case RIGHT: case LEFT: epb += 1; break;
+ }
+ if (start>0)
+ {
+ sl = start-1;
+ while (sl>=0 && instead[sl]) sl--;
+ if (sl>=0 && (fullbot[sl] || allh(sl)))
+ ept=0;
+ else
+ if (sl>=0)
+ switch(midbar(sl,c))
+ {
+ case '-':
+ ext = ".5m"; break;
+ case '=':
+ ext= ".5m"; ept = -1; break;
+ default:
+ vm = 'm'; break;
+ }
+ else
+ ept = -4;
+ }
+ else if (start==0 && allh(0))
+ {
+ ept=0;
+ vm = 'm';
+ }
+ if (lwid>1)
+ switch(interh(start,c))
+ {
+ case THRU: ept += 1; break;
+ case LEFT: ept += (ln==0 ? 1 : -1); break;
+ case RIGHT: ept += (ln==1 ? 1 : -1); break;
+ }
+ else if (lwid==1)
+ switch(interh(start,c))
+ {
+ case THRU: ept += 1; break;
+ case LEFT: case RIGHT: ept -= 1; break;
+ }
+ if (exb)
+ fprintf(tabout, "\\v'%s'", exb);
+ if (epb)
+ fprintf(tabout, "\\v'%dp'", epb);
+ fprintf(tabout, "\\s\\n(%d",LSIZE);
+ if (linsize)
+ fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
+ fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
+ fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u");
+ if (ext)
+ fprintf(tabout, "-(%s)",ext);
+ if (exb)
+ fprintf(tabout, "-(%s)", exb);
+ pos = ept-epb;
+ if (pos)
+ fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos);
+ /* the string #d is either "nl" or ".d" depending
+ on diversions; on GCOS not the same */
+ fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u");
+ if (ext)
+ fprintf(tabout, "+%s",ext);
+ if (ept)
+ fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept));
+ fprintf(tabout, "'");
+ if (linsize)
+ fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
+ }
+}
+
+
+midbar(i,c)
+{
+int k;
+k = midbcol(i,c);
+if (k==0 && c>0)
+ k = midbcol(i, c-1);
+return(k);
+}
+midbcol(i,c)
+{
+int ct;
+while ( (ct=ctype(i,c)) == 's')
+ c--;
+if (ct=='-' || ct == '=')
+ return(ct);
+if (ct=barent(table[i][c].col))
+ return(ct);
+return(0);
+}
+
+barent(s)
+ char *s;
+{
+if (s==0) return (1);
+if (!point(s)) return(1);
+if (s[0]== '\\') s++;
+if (s[1]!= 0)
+ return(0);
+switch(s[0])
+ {
+ case '_':
+ return('-');
+ case '=':
+ return('=');
+ }
+return(0);
+}