xref: /csrg-svn/old/tbl/tu.c (revision 14514)
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