1 #ifndef lint
2 static char sccsid[] = "@(#)vertlines.c	1.2 (CWI) 85/10/02";
3 #endif lint
4 
5 /*
6  * draw vertical lines
7  */
8 
9 #include "defs.h"
10 #include "ext.h"
11 
12 drawvert(start, end, c, lwid){
13 	char *exb = 0, *ext = 0;
14 	int tp = 0, sl, ln, pos, epb, ept, vm;
15 
16 	end++;
17 	vm = 'v';
18 	/*
19 	 * note: nr 35 has value of 1m outside of linesize
20 	 */
21 	while(instead[end])
22 		end++;
23 	for(ln = 0; ln < lwid; ln++){
24 		epb = ept = 0;
25 		pos = 2 * ln - lwid + 1;
26 		if(pos != tp)
27 			printf("\\h'%dp'", pos - tp);
28 		tp = pos;
29 		if(end < nlin){
30 			if(fullbot[end] || (!instead[end] && allh(end)))
31 				epb = 2;
32 			else {
33 				switch(midbar(end, c)){
34 
35 				case '-':
36 					exb = "1v-.5m";
37 					break;
38 				case '=':
39 					exb = "1v-.5m";
40 					epb = 1;
41 					break;
42 				}
43 			}
44 		}
45 		if(lwid > 1){
46 			switch(interh(end, c)){
47 
48 			case THRU:
49 				epb -= 1;
50 				break;
51 			case RIGHT:
52 				epb += (ln == 0 ? 1 : -1);
53 				break;
54 			case LEFT:
55 				epb += (ln == 1 ? 1 : -1);
56 				break;
57 			}
58 		}
59 		if(lwid == 1){
60 			switch(interh(end, c)){
61 
62 			case THRU:
63 				epb -= 1;
64 				break;
65 			case RIGHT:
66 			case LEFT:
67 				epb += 1;
68 				break;
69 			}
70 		}
71 		if(start > 0){
72 			sl = start - 1;
73 			while(sl >= 0 && instead[sl])
74 				sl--;
75 			if(sl >= 0 && (fullbot[sl] || allh(sl)))
76 				ept = 0;
77 			else {
78 				if(sl >= 0){
79 					switch(midbar(sl, c)){
80 
81 					case '-':
82 						ext = ".5m";
83 						break;
84 					case '=':
85 						ext = ".5m";
86 						ept = -1;
87 						break;
88 					default:
89 						vm = 'm';
90 						break;
91 					}
92 				} else
93 					ept = -4;
94 			}
95 		} else {
96 			if(start == 0 && allh(0)){
97 				ept = 0;
98 				vm = 'm';
99 			}
100 		}
101 		if(lwid > 1){
102 			switch(interh(start, c)){
103 
104 			case THRU:
105 				ept += 1;
106 				break;
107 			case LEFT:
108 				ept += (ln == 0 ? 1 : -1);
109 				break;
110 			case RIGHT:
111 				ept += (ln == 1 ? 1 : -1);
112 				break;
113 			}
114 		} else {
115 			if(lwid == 1){
116 				switch(interh(start, c)){
117 
118 				case THRU:
119 					ept += 1;
120 					break;
121 				case LEFT:
122 				case RIGHT:
123 					ept -= 1;
124 					break;
125 				}
126 			}
127 		}
128 		if(exb)
129 			printf("\\v'%s'", exb);
130 		if(epb)
131 			printf("\\v'%dp'", epb);
132 		printf("\\s\\n(%d", LSIZE);
133 		if(linsize)
134 			printf("\\v'-\\n(%dp/6u'", LSIZE);
135  		/*
136 		 * adjustment for T450 nroff boxes
137 		 *
138 		 * Changed by JNA, the register #~ will contain in general
139 		 * the device dependency adjustment for vertical lines
140 		 */
141 		printf("\\h'-\\n(#~u'");
142 		/*
143 		 * Extra corrections for double lines
144 		 * Works OK on the HARRIS, probably needed for all devices
145 		 */
146 		if(device == HARRIS && ln == 1)
147 			printf("\\h'-\\n(#~u'");
148 
149 		printf("\\L'|\\n(#%cu-%s",
150 			linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u");
151 		if(ext)
152 			printf("-(%s)", ext);
153 		if(exb)
154 			printf("-(%s)", exb);
155 		pos = ept - epb;
156 		if(pos)
157 			printf("%s%dp", pos >= 0 ? "+" : "", pos);
158 		/*
159 		 * the string #d is either "nl" or ".d" depending on diversions;
160 	   	 * on GCOS not the same
161 		 */
162 		printf("'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
163 			linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u");
164 		if(ext)
165 			printf("+%s", ext);
166 		if(ept)
167 			printf("%s%dp", (-ept) > 0 ? "+" : "", (-ept));
168 		printf("'");
169 		if(linsize)
170 			printf("\\v'\\n(%dp/6u'", LSIZE);
171 	}
172 }
173 
174 midbar(i, c){
175 	int k;
176 
177 	k = midbcol(i, c);
178 	if(k == 0 && c > 0)
179 		k = midbcol(i, c - 1);
180 	return(k);
181 }
182 
183 midbcol(i, c){
184 	int ct;
185 
186 	while((ct = ctype(i, c)) == 's')
187 		c--;
188 	if(ct == '-' || ct == '=')
189 		return(ct);
190 	if(ct = barent(table[i][c].col))
191 		return(ct);
192 	return(0);
193 }
194 
195 barent(s)
196 char *s;
197 {
198 	if(s == 0)
199 		return(1);
200 	if(!point(s))
201 		return(1);
202 	if(s[0] == '\\')
203 		s++;
204 	if(s[1] != 0)
205 		return(0);
206 	switch(s[0]){
207 
208 	case '_':
209 		return('-');
210 	case '=':
211 		return('=');
212 	}
213 	return(0);
214 }
215