tbl: use \s(NN instead of \sNN
[troff.git] / tbl / tv.c
blobaf8ff9f5ec1ebb3cc384ae39a826e2072e8de0f2
1 /* tv.c: draw vertical lines */
2 # include "t.h"
4 void
5 drawvert(int start, int end, int c, int lwid)
7 char *exb = 0, *ext = 0;
8 int tp = 0, sl, ln, pos, epb, ept, vm;
10 end++;
11 vm = 'v';
12 /* note: nr 35 has value of 1m outside of linesize */
13 while (instead[end])
14 end++;
15 for (ln = 0; ln < lwid; ln++) {
16 epb = ept = 0;
17 pos = -ln - lwid + 1;
18 if (pos != tp)
19 fprintf(tabout, "\\h'%dp'", pos - tp);
20 tp = pos;
21 if (end < nlin) {
22 if (fullbot[end] || (!instead[end] && allh(end)))
23 epb = 2;
24 else
25 switch (midbar(end, c)) {
26 case '-':
27 exb = "1v-.5m";
28 break;
29 case '=':
30 exb = "1v-.5m";
31 epb = 1;
32 break;
35 if (lwid > 1)
36 switch (interh(end, c)) {
37 case THRU:
38 epb -= 1;
39 break;
40 case RIGHT:
41 epb += (ln == 0 ? 1 : -1);
42 break;
43 case LEFT:
44 epb += (ln == 1 ? 1 : -1);
45 break;
47 if (lwid == 1)
48 switch (interh(end, c)) {
49 case THRU:
50 epb -= 1;
51 break;
52 case RIGHT:
53 case LEFT:
54 epb += 1;
55 break;
57 if (start > 0) {
58 sl = start - 1;
59 while (sl >= 0 && instead[sl])
60 sl--;
61 if (sl >= 0 && (fullbot[sl] || allh(sl)))
62 ept = 0;
63 else if (sl >= 0)
64 switch (midbar(sl, c)) {
65 case '-':
66 ext = ".5m";
67 break;
68 case '=':
69 ext = ".5m";
70 ept = -1;
71 break;
72 default:
73 vm = 'm';
74 break;
76 else
77 ept = -4;
78 } else if (start == 0 && allh(0)) {
79 ept = 0;
80 vm = 'm';
82 if (lwid > 1)
83 switch (interh(start, c)) {
84 case THRU:
85 ept += 1;
86 break;
87 case LEFT:
88 ept += (ln == 0 ? 1 : -1);
89 break;
90 case RIGHT:
91 ept += (ln == 1 ? 1 : -1);
92 break;
94 else if (lwid == 1)
95 switch (interh(start, c)) {
96 case THRU:
97 ept += 1;
98 break;
99 case LEFT:
100 case RIGHT:
101 ept -= 1;
102 break;
104 if (exb)
105 fprintf(tabout, "\\v'%s'", exb);
106 if (epb)
107 fprintf(tabout, "\\v'%dp'", epb);
108 fprintf(tabout, "\\s(\\n(%d", LSIZE);
109 if (linsize)
110 fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
111 fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
112 /* adjustment to make vertical and horizontal lines meet properly */
113 fprintf(tabout, "\\h'-\\n(%dp*7u/100u'", LSIZE);
114 fprintf(tabout, "\\v'\\n(%dp*2u/100u'", LSIZE);
116 fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start] + 'a' - 1,
117 vm == 'v' ? "1v" : "\\n(35u");
118 if (ext)
119 fprintf(tabout, "-(%s)", ext);
120 if (exb)
121 fprintf(tabout, "-(%s)", exb);
122 pos = ept - epb;
123 if (pos)
124 fprintf(tabout, "%s%dp", pos >= 0 ? "+" : "", pos);
125 /* the string #d is either "nl" or ".d" depending
126 on diversions; on GCOS not the same */
127 fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
128 linestop[start] + 'a' - 1, vm == 'v' ? "1v" : "\\n(35u");
129 if (ext)
130 fprintf(tabout, "+%s", ext);
131 if (ept)
132 fprintf(tabout, "%s%dp", (-ept) > 0 ? "+" : "", (-ept));
133 fprintf(tabout, "'");
134 if (linsize)
135 fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
141 midbar(int i, int c)
143 int k;
145 k = midbcol(i, c);
146 if (k == 0 && c > 0)
147 k = midbcol(i, c - 1);
148 return(k);
153 midbcol(int i, int c)
155 int ct;
157 while ( (ct = ctype(i, c)) == 's')
158 c--;
159 if (ct == '-' || ct == '=')
160 return(ct);
161 if (ct = barent(table[i][c].col))
162 return(ct);
163 return(0);
168 barent(char *s)
170 if (s == 0)
171 return (1);
172 if (!point(s))
173 return(0);
174 if (s[0] == '\\')
175 s++;
176 if (s[1] != 0)
177 return(0);
178 switch (s[0]) {
179 case '_':
180 return('-');
181 case '=':
182 return('=');
184 return(0);