xref: /illumos-gate/usr/src/cmd/tbl/tv.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
2 /*	  All Rights Reserved  	*/
3 
4 
5 /*
6  * Copyright (c) 1980 Regents of the University of California.
7  * All rights reserved. The Berkeley software License Agreement
8  * specifies the terms and conditions for redistribution.
9  */
10 
11 /*
12  * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
13  * All Rights Reserved.
14  */
15 
16 #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.1	*/
17 
18  /* tv.c: draw vertical lines */
19 # include "t..c"
20 drawvert(start,end, c, lwid)
21 {
22 char *exb=0, *ext=0;
23 int tp=0, sl, ln, pos, epb, ept, vm;
24 end++;
25 vm='v';
26 /* note: nr 35 has value of 1m outside of linesize */
27 while (instead[end]) end++;
28 for(ln=0; ln<lwid; ln++)
29 	{
30 	epb=ept=0;
31 	pos = 2*ln-lwid+1;
32 	if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp);
33 	tp = pos;
34 	if (end<nlin)
35 		{
36 		if (fullbot[end]|| (!instead[end] && allh(end)))
37 			epb=2;
38 		else
39 		switch (midbar(end,c))
40 			{
41 			case '-':
42 			exb = "1v-.5m"; break;
43 			case '=':
44 			exb = "1v-.5m";
45 			epb = 1; break;
46 			}
47 		}
48 	if (lwid>1)
49 	switch(interh(end, c))
50 		{
51 		case THRU: epb -= 1; break;
52 		case RIGHT: epb += (ln==0 ? 1 : -1); break;
53 		case LEFT: epb += (ln==1 ? 1 : -1); break;
54 		}
55 	if (lwid==1)
56 	switch(interh(end,c))
57 		{
58 		case THRU: epb -= 1; break;
59 		case RIGHT: case LEFT: epb += 1; break;
60 		}
61 	if (start>0)
62 		{
63 		sl = start-1;
64 		while (sl>=0 && instead[sl]) sl--;
65 		if (sl>=0 && (fullbot[sl] || allh(sl)))
66 			ept=0;
67 		else
68 		if (sl>=0)
69 		switch(midbar(sl,c))
70 			{
71 			case '-':
72 			ext = ".5m"; break;
73 			case '=':
74 			ext= ".5m"; ept = -1; break;
75 			default:
76 				vm = 'm'; break;
77 			}
78 		else
79 			ept = -4;
80 		}
81 	else if (start==0 && allh(0))
82 		{
83 		ept=0;
84 		vm = 'm';
85 		}
86 	if (lwid>1)
87 		switch(interh(start,c))
88 			{
89 			case THRU: ept += 1; break;
90 			case LEFT: ept += (ln==0 ? 1 : -1); break;
91 			case RIGHT: ept += (ln==1 ? 1 : -1); break;
92 			}
93 	else if (lwid==1)
94 		switch(interh(start,c))
95 			{
96 			case THRU: ept += 1; break;
97 			case LEFT: case RIGHT: ept -= 1; break;
98 			}
99 	if (exb)
100 		fprintf(tabout, "\\v'%s'", exb);
101 	if (epb)
102 		fprintf(tabout, "\\v'%dp'", epb);
103 	fprintf(tabout, "\\s\\n(%d",LSIZE);
104 	if (linsize)
105 		fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
106 	fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
107 	fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u");
108 	if (ext)
109 		fprintf(tabout, "-(%s)",ext);
110 	if (exb)
111 		fprintf(tabout, "-(%s)", exb);
112 	pos = ept-epb;
113 	if (pos)
114 		fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos);
115 	/* the string #d is either "nl" or ".d" depending
116 	   on diversions; on GCOS not the same */
117 	fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u");
118 	if (ext)
119 		fprintf(tabout, "+%s",ext);
120 	if (ept)
121 		fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept));
122 	fprintf(tabout, "'");
123 	if (linsize)
124 		fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
125 	}
126 }
127 
128 
129 midbar(i,c)
130 {
131 int k;
132 k = midbcol(i,c);
133 if (k==0 && c>0)
134 	k = midbcol(i, c-1);
135 return(k);
136 }
137 midbcol(i,c)
138 {
139 int ct;
140 while ( (ct=ctype(i,c)) == 's')
141 	c--;
142 if (ct=='-' || ct == '=')
143 	return(ct);
144 if (ct=barent(table[i][c].col))
145 	return(ct);
146 return(0);
147 }
148 
149 barent(s)
150 	char *s;
151 {
152 if (s==0) return (1);
153 if (!point(s)) return(1);
154 if (s[0]== '\\') s++;
155 if (s[1]!= 0)
156 	return(0);
157 switch(s[0])
158 	{
159 	case '_':
160 		return('-');
161 	case '=':
162 		return('=');
163 	}
164 return(0);
165 }
166