1 #ifndef lint 2 static char sccsid[] = "@(#)tu.c 4.3 07/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 } 207