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