date and time created 88/07/21 17:35:19 by marc
[unix-history] / usr / src / local / ditroff / ditroff.okeeffe / tbl / vertlines.c
CommitLineData
ed8f60d3 1#ifndef lint
3ab4bab3 2static char sccsid[] = "@(#)vertlines.c 1.2 (CWI) 85/10/02";
ed8f60d3
JA
3#endif lint
4
3ab4bab3
JA
5/*
6 * draw vertical lines
7 */
ed8f60d3
JA
8
9#include "defs.h"
10#include "ext.h"
11
12drawvert(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);
bad19660
JA
133 printf("\\v'-\\n(%dp/6u'", LSIZE);
134 printf("\\h'-\\n(#~n/100u'");
ed8f60d3
JA
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);
bad19660 145 printf("'");
ed8f60d3
JA
146 /*
147 * the string #d is either "nl" or ".d" depending on diversions;
148 * on GCOS not the same
149 */
bad19660
JA
150 printf("\\h'-\\n(#~n/100u'");
151 printf("\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
ed8f60d3
JA
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("'");
bad19660 158 printf("\\v'\\n(%dp/6u'", LSIZE);
ed8f60d3
JA
159 }
160}
161
162midbar(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
171midbcol(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
183barent(s)
184char *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}