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