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