code: plan9front

ref: 5622b0bbd878dbc34045cc6fd37cffa64461eabe
dir: /sys/src/cmd/tbl/tv.c/

View raw version
/* tv.c: draw vertical lines */
# include "t.h"

void
drawvert(int start, int end, int c, int lwid)
{
	char	*exb = 0, *ext = 0;
	int	tp = 0, sl, ln, pos, epb, ept, vm;

	end++;
	vm = 'v';
				/* note: nr 35 has value of 1m outside of linesize */
	while (instead[end]) 
		end++;
	for (ln = 0; ln < lwid; ln++) {
		epb = ept = 0;
		pos = 2 * ln - lwid + 1;
		if (pos != tp) 
			Bprint(&tabout, "\\h'%dp'", pos - tp);
		tp = pos;
		if (end < nlin) {
			if (fullbot[end] || (!instead[end] && allh(end)))
				epb = 2;
			else
				switch (midbar(end, c)) {
				case '-':
					exb = "1v-.5m"; 
					break;
				case '=':
					exb = "1v-.5m";
					epb = 1; 
					break;
				}
		}
		if (lwid > 1)
			switch (interh(end, c)) {
			case THRU: 
				epb -= 1; 
				break;
			case RIGHT: 
				epb += (ln == 0 ? 1 : -1); 
				break;
			case LEFT: 
				epb += (ln == 1 ? 1 : -1); 
				break;
			}
		if (lwid == 1)
			switch (interh(end, c)) {
			case THRU: 
				epb -= 1; 
				break;
			case RIGHT: 
			case LEFT: 
				epb += 1; 
				break;
			}
		if (start > 0) {
			sl = start - 1;
			while (sl >= 0 && instead[sl]) 
				sl--;
			if (sl >= 0 && (fullbot[sl] || allh(sl)))
				ept = 0;
			else if (sl >= 0)
				switch (midbar(sl, c)) {
				case '-':
					ext = ".5m"; 
					break;
				case '=':
					ext = ".5m"; 
					ept = -1; 
					break;
				default:
					vm = 'm'; 
					break;
				}
			else
				ept = -4;
		} else if (start == 0 && allh(0)) {
			ept = 0;
			vm = 'm';
		}
		if (lwid > 1)
			switch (interh(start, c)) {
			case THRU: 
				ept += 1; 
				break;
			case LEFT: 
				ept += (ln == 0 ? 1 : -1); 
				break;
			case RIGHT: 
				ept += (ln == 1 ? 1 : -1); 
				break;
			}
		else if (lwid == 1)
			switch (interh(start, c)) {
			case THRU: 
				ept += 1; 
				break;
			case LEFT: 
			case RIGHT: 
				ept -= 1; 
				break;
			}
		if (exb)
			Bprint(&tabout, "\\v'%s'", exb);
		if (epb)
			Bprint(&tabout, "\\v'%dp'", epb);
		Bprint(&tabout, "\\s\\n(%d", LSIZE);
		if (linsize)
			Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
		Bprint(&tabout, "\\h'-\\n(#~u'");	 /* adjustment for T450 nroff boxes */
		Bprint(&tabout, "\\L'|\\n(#%cu-%s", linestop[start] + 'a' - 1,
		      vm == 'v' ? "1v" : "\\n(35u");
		if (ext)
			Bprint(&tabout, "-(%s)", ext);
		if (exb)
			Bprint(&tabout, "-(%s)", exb);
		pos = ept - epb;
		if (pos)
			Bprint(&tabout, "%s%dp", pos >= 0 ? "+" : "", pos);
		/* the string #d is either "nl" or ".d" depending
	   on diversions; on GCOS not the same */
		Bprint(&tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
		     linestop[start] + 'a' - 1, vm == 'v' ? "1v" : "\\n(35u");
		if (ext)
			Bprint(&tabout, "+%s", ext);
		if (ept)
			Bprint(&tabout, "%s%dp", (-ept) > 0 ? "+" : "", (-ept));
		Bprint(&tabout, "'");
		if (linsize)
			Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
	}
}


int
midbar(int i, int c)
{
	int	k;

	k = midbcol(i, c);
	if (k == 0 && c > 0)
		k = midbcol(i, c - 1);
	return(k);
}


int
midbcol(int i, int c)
{
	int	ct;

	while ( (ct = ctype(i, c)) == 's')
		c--;
	if (ct == '-' || ct == '=')
		return(ct);
	if (ct = barent(table[i][c].col))
		return(ct);
	return(0);
}


int
barent(char *s)
{
	if (s == 0) 
		return (1);
	if (!point(s)) 
		return(0);
	if (s[0] == '\\') 
		s++;
	if (s[1] != 0)
		return(0);
	switch (s[0]) {
	case '_':
		return('-');
	case '=':
		return('=');
	}
	return(0);
}