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 		printf("\\v'-\\n(%dp/6u'", LSIZE);
134 		printf("\\h'-\\n(#~n/100u'");
135 
136 		printf("\\L'|\\n(#%cu-%s",
137 			linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u");
138 		if(ext)
139 			printf("-(%s)", ext);
140 		if(exb)
141 			printf("-(%s)", exb);
142 		pos = ept - epb;
143 		if(pos)
144 			printf("%s%dp", pos >= 0 ? "+" : "", pos);
145 		printf("'");
146 		/*
147 		 * the string #d is either "nl" or ".d" depending on diversions;
148 	   	 * on GCOS not the same
149 		 */
150 		printf("\\h'-\\n(#~n/100u'");
151 		printf("\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
152 			linestop[start] + 'a' -1, vm == 'v' ? "1v" : "\\n(35u");
153 		if(ext)
154 			printf("+%s", ext);
155 		if(ept)
156 			printf("%s%dp", (-ept) > 0 ? "+" : "", (-ept));
157 		printf("'");
158 		printf("\\v'\\n(%dp/6u'", LSIZE);
159 	}
160 }
161 
162 midbar(i, c){
163 	int k;
164 
165 	k = midbcol(i, c);
166 	if(k == 0 && c > 0)
167 		k = midbcol(i, c - 1);
168 	return(k);
169 }
170 
171 midbcol(i, c){
172 	int ct;
173 
174 	while((ct = ctype(i, c)) == 's')
175 		c--;
176 	if(ct == '-' || ct == '=')
177 		return(ct);
178 	if(ct = barent(table[i][c].col))
179 		return(ct);
180 	return(0);
181 }
182 
183 barent(s)
184 char *s;
185 {
186 	if(s == 0)
187 		return(1);
188 	if(!point(s))
189 		return(1);
190 	if(s[0] == '\\')
191 		s++;
192 	if(s[1] != 0)
193 		return(0);
194 	switch(s[0]){
195 
196 	case '_':
197 		return('-');
198 	case '=':
199 		return('=');
200 	}
201 	return(0);
202 }
203