1*14514Ssam #ifndef lint 2*14514Ssam static char sccsid[] = "@(#)tu.c 4.2 08/11/83"; 3*14514Ssam #endif 411046Sshannon 511046Sshannon /* tu.c: draws horizontal lines */ 611046Sshannon # include "t..c" 711046Sshannon makeline(i,c,lintype) 811046Sshannon { 911046Sshannon int cr, type, shortl; 1011046Sshannon type = thish(i,c); 1111046Sshannon if (type==0) return; 1211046Sshannon cr=c; 1311046Sshannon shortl = (table[i][c].col[0]=='\\'); 1411046Sshannon if (c>0 && !shortl && thish(i,c-1) == type)return; 1511046Sshannon if (shortl==0) 1611046Sshannon for(cr=c; cr < ncol && (ctype(i,cr)=='s'||type==thish(i,cr)); cr++); 1711046Sshannon else 1811046Sshannon for(cr=c+1; cr<ncol && ctype(i,cr)=='s'; cr++); 1911046Sshannon drawline(i, c, cr-1, lintype, 0, shortl); 2011046Sshannon } 2111046Sshannon fullwide(i, lintype) 2211046Sshannon { 2311046Sshannon int cr, cl; 2411046Sshannon if (!pr1403) 2511046Sshannon fprintf(tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS); 2611046Sshannon cr= 0; 2711046Sshannon while (cr<ncol) 2811046Sshannon { 2911046Sshannon cl=cr; 3011046Sshannon while (i>0 && vspand(prev(i),cl,1)) 3111046Sshannon cl++; 3211046Sshannon for(cr=cl; cr<ncol; cr++) 3311046Sshannon if (i>0 && vspand(prev(i),cr,1)) 3411046Sshannon break; 3511046Sshannon if (cl<ncol) 3611046Sshannon drawline(i,cl,(cr<ncol?cr-1:cr),lintype,1,0); 3711046Sshannon } 3811046Sshannon fprintf(tabout, "\n"); 3911046Sshannon if (!pr1403) 4011046Sshannon fprintf(tabout, ".vs \\n(%du\n", SVS); 4111046Sshannon } 4211046Sshannon 4311046Sshannon drawline(i, cl, cr, lintype, noheight, shortl) 4411046Sshannon { 4511046Sshannon char *exhr, *exhl; 4611046Sshannon int lcount, ln, linpos, oldpos, nodata, lnch; 4711046Sshannon lcount=0; 4811046Sshannon exhr=exhl= ""; 4911046Sshannon switch(lintype) 5011046Sshannon { 5111046Sshannon case '-': lcount=1;break; 5211046Sshannon case '=': lcount = pr1403? 1 : 2; break; 5311046Sshannon case SHORTLINE: lcount=1; break; 5411046Sshannon } 5511046Sshannon if (lcount<=0) return; 5611046Sshannon nodata = cr-cl>=ncol || noheight || allh(i); 5711046Sshannon if (!nodata) 5811046Sshannon fprintf(tabout, "\\v'-.5m'"); 5911046Sshannon for(ln=oldpos=0; ln<lcount; ln++) 6011046Sshannon { 6111046Sshannon linpos = 2*ln - lcount +1; 6211046Sshannon if (linpos != oldpos) 6311046Sshannon fprintf(tabout, "\\v'%dp'", linpos-oldpos); 6411046Sshannon oldpos=linpos; 6511046Sshannon if (shortl==0) 6611046Sshannon { 6711046Sshannon tohcol(cl); 6811046Sshannon if (lcount>1) 6911046Sshannon { 7011046Sshannon switch(interv(i,cl)) 7111046Sshannon { 7211046Sshannon case TOP: exhl = ln==0 ? "1p" : "-1p"; break; 7311046Sshannon case BOT: exhl = ln==1 ? "1p" : "-1p"; break; 7411046Sshannon case THRU: exhl = "1p"; break; 7511046Sshannon } 7611046Sshannon if (exhl[0]) 7711046Sshannon fprintf(tabout, "\\h'%s'", exhl); 7811046Sshannon } 7911046Sshannon else if (lcount==1) 8011046Sshannon { 8111046Sshannon switch(interv(i,cl)) 8211046Sshannon { 8311046Sshannon case TOP: case BOT: exhl = "-1p"; break; 8411046Sshannon case THRU: exhl = "1p"; break; 8511046Sshannon } 8611046Sshannon if (exhl[0]) 8711046Sshannon fprintf(tabout, "\\h'%s'", exhl); 8811046Sshannon } 8911046Sshannon if (lcount>1) 9011046Sshannon { 9111046Sshannon switch(interv(i,cr+1)) 9211046Sshannon { 9311046Sshannon case TOP: exhr = ln==0 ? "-1p" : "+1p"; break; 9411046Sshannon case BOT: exhr = ln==1 ? "-1p" : "+1p"; break; 9511046Sshannon case THRU: exhr = "-1p"; break; 9611046Sshannon } 9711046Sshannon } 9811046Sshannon else if (lcount==1) 9911046Sshannon { 10011046Sshannon switch(interv(i,cr+1)) 10111046Sshannon { 10211046Sshannon case TOP: case BOT: exhr = "+1p"; break; 10311046Sshannon case THRU: exhr = "-1p"; break; 10411046Sshannon } 10511046Sshannon } 10611046Sshannon } 10711046Sshannon else 10811046Sshannon fprintf(tabout, "\\h'|\\n(%du'", cl+CLEFT); 10911046Sshannon fprintf(tabout, "\\s\\n(%d",LSIZE); 11011046Sshannon if (linsize) 11111046Sshannon fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE); 11211046Sshannon if (shortl) 11311046Sshannon fprintf(tabout, "\\l'|\\n(%du'", cr+CRIGHT); 11411046Sshannon else 11511046Sshannon { 11611046Sshannon lnch = "\\(ul"; 11711046Sshannon if (pr1403) 11811046Sshannon lnch = lintype==2 ? "=" : "\\(ru"; 11911046Sshannon if (cr+1>=ncol) 12011046Sshannon fprintf(tabout, "\\l'|\\n(TWu%s%s'", exhr,lnch); 12111046Sshannon else 12211046Sshannon fprintf(tabout, "\\l'(|\\n(%du+|\\n(%du)/2u%s%s'", cr+CRIGHT, 12311046Sshannon cr+1+CLEFT, exhr, lnch); 12411046Sshannon } 12511046Sshannon if (linsize) 12611046Sshannon fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE); 12711046Sshannon fprintf(tabout, "\\s0"); 12811046Sshannon } 12911046Sshannon if (oldpos!=0) 13011046Sshannon fprintf(tabout, "\\v'%dp'", -oldpos); 13111046Sshannon if (!nodata) 13211046Sshannon fprintf(tabout, "\\v'+.5m'"); 13311046Sshannon } 13411046Sshannon getstop() 13511046Sshannon { 13611046Sshannon int i,c,k,junk, stopp; 13711046Sshannon stopp=1; 13811046Sshannon for(i=0; i<MAXLIN; i++) 13911046Sshannon linestop[i]=0; 14011046Sshannon for(i=0; i<nlin; i++) 14111046Sshannon for(c=0; c<ncol; c++) 14211046Sshannon { 14311046Sshannon k = left(i,c,&junk); 14411046Sshannon if (k>=0 && linestop[k]==0) 14511046Sshannon linestop[k]= ++stopp; 14611046Sshannon } 14711046Sshannon if (boxflg || allflg || dboxflg) 14811046Sshannon linestop[0]=1; 14911046Sshannon } 15011046Sshannon left(i,c, lwidp) 15111046Sshannon int *lwidp; 15211046Sshannon { 15311046Sshannon int kind, li, lj; 15411046Sshannon /* returns -1 if no line to left */ 15511046Sshannon /* returns number of line where it starts */ 15611046Sshannon /* stores into lwid the kind of line */ 15711046Sshannon *lwidp=0; 15811046Sshannon kind = lefdata(i,c); 15911046Sshannon if (kind==0) return(-1); 16011046Sshannon if (i+1<nlin) 16111046Sshannon if (lefdata(next(i),c)== kind) return(-1); 16211046Sshannon while (i>=0 && lefdata(i,c)==kind) 16311046Sshannon i=prev(li=i); 16411046Sshannon if (prev(li)== -1) li=0; 16511046Sshannon *lwidp=kind; 16611046Sshannon for(lj= i+1; lj<li; lj++) 16711046Sshannon if (instead[lj] && strcmp(instead[lj], ".TH")==0) 16811046Sshannon return(li); 16911046Sshannon for(i= i+1; i<li; i++) 17011046Sshannon if (fullbot[i]) 17111046Sshannon li=i; 17211046Sshannon return(li); 17311046Sshannon } 17411046Sshannon lefdata(i,c) 17511046Sshannon { 17611046Sshannon int ck; 17711046Sshannon if (i>=nlin) i=nlin-1; 17811046Sshannon if (ctype(i,c) == 's') 17911046Sshannon { 18011046Sshannon for(ck=c; ctype(i,ck)=='s'; ck--); 18111046Sshannon if (thish(i,ck)==0) 18211046Sshannon return(0); 18311046Sshannon } 18411046Sshannon i =stynum[i]; 18511046Sshannon i = lefline[i][c]; 18611046Sshannon if (i>0) return(i); 18711046Sshannon if (dboxflg && c==0) return(2); 18811046Sshannon if (allflg)return(1); 18911046Sshannon if (boxflg && c==0) return(1); 19011046Sshannon return(0); 19111046Sshannon } 19211046Sshannon next(i) 19311046Sshannon { 19411046Sshannon while (i+1 <nlin) 19511046Sshannon { 19611046Sshannon i++; 19711046Sshannon if (!fullbot[i] && !instead[i]) break; 19811046Sshannon } 19911046Sshannon return(i); 20011046Sshannon } 20111046Sshannon prev(i) 20211046Sshannon { 20311046Sshannon while (--i >=0 && (fullbot[i] || instead[i])) 20411046Sshannon ; 20511046Sshannon return(i); 20611046Sshannon } 207