|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)tu.c 4.3 7/22/88";
3: #endif
4:
5: /* tu.c: draws horizontal lines */
6: # include "t..c"
7: makeline(i,c,lintype)
8: {
9: int cr, type, shortl;
10: type = thish(i,c);
11: if (type==0) return;
12: cr=c;
13: shortl = (table[i][c].col[0]=='\\');
14: if (c>0 && !shortl && thish(i,c-1) == type)return;
15: if (shortl==0)
16: for(cr=c; cr < ncol && (ctype(i,cr)=='s'||type==thish(i,cr)); cr++);
17: else
18: for(cr=c+1; cr<ncol && ctype(i,cr)=='s'; cr++);
19: drawline(i, c, cr-1, lintype, 0, shortl);
20: }
21: fullwide(i, lintype)
22: {
23: int cr, cl;
24: if (!pr1403)
25: fprintf(tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
26: cr= 0;
27: while (cr<ncol)
28: {
29: cl=cr;
30: while (i>0 && vspand(prev(i),cl,1))
31: cl++;
32: for(cr=cl; cr<ncol; cr++)
33: if (i>0 && vspand(prev(i),cr,1))
34: break;
35: if (cl<ncol)
36: drawline(i,cl,(cr<ncol?cr-1:cr),lintype,1,0);
37: }
38: fprintf(tabout, "\n");
39: if (!pr1403)
40: fprintf(tabout, ".vs \\n(%du\n", SVS);
41: }
42:
43: drawline(i, cl, cr, lintype, noheight, shortl)
44: {
45: char *exhr, *exhl, *lnch;
46: int lcount, ln, linpos, oldpos, nodata;
47: lcount=0;
48: exhr=exhl= "";
49: switch(lintype)
50: {
51: case '-': lcount=1;break;
52: case '=': lcount = pr1403? 1 : 2; break;
53: case SHORTLINE: lcount=1; break;
54: }
55: if (lcount<=0) return;
56: nodata = cr-cl>=ncol || noheight || allh(i);
57: if (!nodata)
58: fprintf(tabout, "\\v'-.5m'");
59: for(ln=oldpos=0; ln<lcount; ln++)
60: {
61: linpos = 2*ln - lcount +1;
62: if (linpos != oldpos)
63: fprintf(tabout, "\\v'%dp'", linpos-oldpos);
64: oldpos=linpos;
65: if (shortl==0)
66: {
67: tohcol(cl);
68: if (lcount>1)
69: {
70: switch(interv(i,cl))
71: {
72: case TOP: exhl = ln==0 ? "1p" : "-1p"; break;
73: case BOT: exhl = ln==1 ? "1p" : "-1p"; break;
74: case THRU: exhl = "1p"; break;
75: }
76: if (exhl[0])
77: fprintf(tabout, "\\h'%s'", exhl);
78: }
79: else if (lcount==1)
80: {
81: switch(interv(i,cl))
82: {
83: case TOP: case BOT: exhl = "-1p"; break;
84: case THRU: exhl = "1p"; break;
85: }
86: if (exhl[0])
87: fprintf(tabout, "\\h'%s'", exhl);
88: }
89: if (lcount>1)
90: {
91: switch(interv(i,cr+1))
92: {
93: case TOP: exhr = ln==0 ? "-1p" : "+1p"; break;
94: case BOT: exhr = ln==1 ? "-1p" : "+1p"; break;
95: case THRU: exhr = "-1p"; break;
96: }
97: }
98: else if (lcount==1)
99: {
100: switch(interv(i,cr+1))
101: {
102: case TOP: case BOT: exhr = "+1p"; break;
103: case THRU: exhr = "-1p"; break;
104: }
105: }
106: }
107: else
108: fprintf(tabout, "\\h'|\\n(%du'", cl+CLEFT);
109: fprintf(tabout, "\\s\\n(%d",LSIZE);
110: if (linsize)
111: fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
112: if (shortl)
113: fprintf(tabout, "\\l'|\\n(%du'", cr+CRIGHT);
114: else
115: {
116: lnch = "\\(ul";
117: if (pr1403)
118: lnch = lintype==2 ? "=" : "\\(ru";
119: if (cr+1>=ncol)
120: fprintf(tabout, "\\l'|\\n(TWu%s%s'", exhr,lnch);
121: else
122: fprintf(tabout, "\\l'(|\\n(%du+|\\n(%du)/2u%s%s'", cr+CRIGHT,
123: cr+1+CLEFT, exhr, lnch);
124: }
125: if (linsize)
126: fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
127: fprintf(tabout, "\\s0");
128: }
129: if (oldpos!=0)
130: fprintf(tabout, "\\v'%dp'", -oldpos);
131: if (!nodata)
132: fprintf(tabout, "\\v'+.5m'");
133: }
134: getstop()
135: {
136: int i,c,k,junk, stopp;
137: stopp=1;
138: for(i=0; i<MAXLIN; i++)
139: linestop[i]=0;
140: for(i=0; i<nlin; i++)
141: for(c=0; c<ncol; c++)
142: {
143: k = left(i,c,&junk);
144: if (k>=0 && linestop[k]==0)
145: linestop[k]= ++stopp;
146: }
147: if (boxflg || allflg || dboxflg)
148: linestop[0]=1;
149: }
150: left(i,c, lwidp)
151: int *lwidp;
152: {
153: int kind, li, lj;
154: /* returns -1 if no line to left */
155: /* returns number of line where it starts */
156: /* stores into lwid the kind of line */
157: *lwidp=0;
158: kind = lefdata(i,c);
159: if (kind==0) return(-1);
160: if (i+1<nlin)
161: if (lefdata(next(i),c)== kind) return(-1);
162: while (i>=0 && lefdata(i,c)==kind)
163: i=prev(li=i);
164: if (prev(li)== -1) li=0;
165: *lwidp=kind;
166: for(lj= i+1; lj<li; lj++)
167: if (instead[lj] && strcmp(instead[lj], ".TH")==0)
168: return(li);
169: for(i= i+1; i<li; i++)
170: if (fullbot[i])
171: li=i;
172: return(li);
173: }
174: lefdata(i,c)
175: {
176: int ck;
177: if (i>=nlin) i=nlin-1;
178: if (ctype(i,c) == 's')
179: {
180: for(ck=c; ctype(i,ck)=='s'; ck--);
181: if (thish(i,ck)==0)
182: return(0);
183: }
184: i =stynum[i];
185: i = lefline[i][c];
186: if (i>0) return(i);
187: if (dboxflg && c==0) return(2);
188: if (allflg)return(1);
189: if (boxflg && c==0) return(1);
190: return(0);
191: }
192: next(i)
193: {
194: while (i+1 <nlin)
195: {
196: i++;
197: if (!fullbot[i] && !instead[i]) break;
198: }
199: return(i);
200: }
201: prev(i)
202: {
203: while (--i >=0 && (fullbot[i] || instead[i]))
204: ;
205: return(i);
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.