plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

tu.c (4777B)


      1 /* tu.c: draws horizontal lines */
      2 # include "t.h"
      3 
      4 void
      5 makeline(int i, int c, int lintype)
      6 {
      7 	int	cr, type, shortl;
      8 
      9 	type = thish(i, c);
     10 	if (type == 0)
     11 		return;
     12 	shortl = (table[i][c].col[0] == '\\');
     13 	if (c > 0 && !shortl && thish(i, c - 1) == type)
     14 		return;
     15 	if (shortl == 0)
     16 		for (cr = c; cr < ncol && (ctype(i, cr) == 's' || type == thish(i, cr)); cr++)
     17 			;
     18 	else
     19 		for (cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++)
     20 			;
     21 	drawline(i, c, cr - 1, lintype, 0, shortl);
     22 }
     23 
     24 
     25 void
     26 fullwide(int i, int lintype)
     27 {
     28 	int	cr, cl;
     29 
     30 	if (!pr1403)
     31 		Bprint(&tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
     32 	cr = 0;
     33 	while (cr < ncol) {
     34 		cl = cr;
     35 		while (i > 0 && vspand(prev(i), cl, 1))
     36 			cl++;
     37 		for (cr = cl; cr < ncol; cr++)
     38 			if (i > 0 && vspand(prev(i), cr, 1))
     39 				break;
     40 		if (cl < ncol)
     41 			drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 1, 0);
     42 	}
     43 	Bprint(&tabout, "\n");
     44 	if (!pr1403)
     45 		Bprint(&tabout, ".vs \\n(%du\n", SVS);
     46 }
     47 
     48 
     49 void
     50 drawline(int i, int cl, int cr, int lintype, int noheight, int shortl)
     51 {
     52 	char	*exhr, *exhl, *lnch;
     53 	int	lcount, ln, linpos, oldpos, nodata;
     54 
     55 	lcount = 0;
     56 	exhr = exhl = "";
     57 	switch (lintype) {
     58 	case '-':
     59 		lcount = 1;
     60 		break;
     61 	case '=':
     62 		lcount = pr1403 ? 1 : 2;
     63 		break;
     64 	case SHORTLINE:
     65 		lcount = 1;
     66 		break;
     67 	}
     68 	if (lcount <= 0)
     69 		return;
     70 	nodata = cr - cl >= ncol || noheight || allh(i);
     71 	if (!nodata)
     72 		Bprint(&tabout, "\\v'-.5m'");
     73 	for (ln = oldpos = 0; ln < lcount; ln++) {
     74 		linpos = 2 * ln - lcount + 1;
     75 		if (linpos != oldpos)
     76 			Bprint(&tabout, "\\v'%dp'", linpos - oldpos);
     77 		oldpos = linpos;
     78 		if (shortl == 0) {
     79 			tohcol(cl);
     80 			if (lcount > 1) {
     81 				switch (interv(i, cl)) {
     82 				case TOP:
     83 					exhl = ln == 0 ? "1p" : "-1p";
     84 					break;
     85 				case BOT:
     86 					exhl = ln == 1 ? "1p" : "-1p";
     87 					break;
     88 				case THRU:
     89 					exhl = "1p";
     90 					break;
     91 				}
     92 				if (exhl[0])
     93 					Bprint(&tabout, "\\h'%s'", exhl);
     94 			} else if (lcount == 1) {
     95 				switch (interv(i, cl)) {
     96 				case TOP:
     97 				case BOT:
     98 					exhl = "-1p";
     99 					break;
    100 				case THRU:
    101 					exhl = "1p";
    102 					break;
    103 				}
    104 				if (exhl[0])
    105 					Bprint(&tabout, "\\h'%s'", exhl);
    106 			}
    107 			if (lcount > 1) {
    108 				switch (interv(i, cr + 1)) {
    109 				case TOP:
    110 					exhr = ln == 0 ? "-1p" : "+1p";
    111 					break;
    112 				case BOT:
    113 					exhr = ln == 1 ? "-1p" : "+1p";
    114 					break;
    115 				case THRU:
    116 					exhr = "-1p";
    117 					break;
    118 				}
    119 			} else if (lcount == 1) {
    120 				switch (interv(i, cr + 1)) {
    121 				case TOP:
    122 				case BOT:
    123 					exhr = "+1p";
    124 					break;
    125 				case THRU:
    126 					exhr = "-1p";
    127 					break;
    128 				}
    129 			}
    130 		} else
    131 			Bprint(&tabout, "\\h'|\\n(%2su'", reg(cl, CLEFT));
    132 		Bprint(&tabout, "\\s\\n(%d", LSIZE);
    133 		if (linsize)
    134 			Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
    135 		if (shortl)
    136 			Bprint(&tabout, "\\l'|\\n(%2su'", reg(cr, CRIGHT));
    137 		else
    138 		 {
    139 			lnch = "\\(ul";
    140 			if (pr1403)
    141 				lnch = lintype == 2 ? "=" : "\\(ru";
    142 			if (cr + 1 >= ncol)
    143 				Bprint(&tabout, "\\l'|\\n(TWu%s%s'", exhr, lnch);
    144 			else
    145 				Bprint(&tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr, CRIGHT),
    146 				    reg(cr + 1, CLEFT), exhr, lnch);
    147 		}
    148 		if (linsize)
    149 			Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
    150 		Bprint(&tabout, "\\s0");
    151 	}
    152 	if (oldpos != 0)
    153 		Bprint(&tabout, "\\v'%dp'", -oldpos);
    154 	if (!nodata)
    155 		Bprint(&tabout, "\\v'+.5m'");
    156 }
    157 
    158 
    159 void
    160 getstop(void)
    161 {
    162 	int	i, c, k, junk, stopp;
    163 
    164 	stopp = 1;
    165 	for (i = 0; i < MAXLIN; i++)
    166 		linestop[i] = 0;
    167 	for (i = 0; i < nlin; i++)
    168 		for (c = 0; c < ncol; c++) {
    169 			k = left(i, c, &junk);
    170 			if (k >= 0 && linestop[k] == 0)
    171 				linestop[k] = ++stopp;
    172 		}
    173 	if (boxflg || allflg || dboxflg)
    174 		linestop[0] = 1;
    175 }
    176 
    177 
    178 int
    179 left(int i, int c, int *lwidp)
    180 {
    181 	int	kind, li, lj;
    182 					/* returns -1 if no line to left */
    183 					/* returns number of line where it starts */
    184 					/* stores into lwid the kind of line */
    185 	*lwidp = 0;
    186 	if (i < 0)
    187 		return(-1);
    188 	kind = lefdata(i, c);
    189 	if (kind == 0)
    190 		return(-1);
    191 	if (i + 1 < nlin)
    192 		if (lefdata(next(i), c) == kind)
    193 			return(-1);
    194 	li = i;
    195 	while (i >= 0 && lefdata(i, c) == kind)
    196 		i = prev(li = i);
    197 	if (prev(li) == -1)
    198 		li = 0;
    199 	*lwidp = kind;
    200 	for (lj = i + 1; lj < li; lj++)
    201 		if (instead[lj] && strcmp(instead[lj], ".TH") == 0)
    202 			return(li);
    203 	for (i = i + 1; i < li; i++)
    204 		if (fullbot[i])
    205 			li = i;
    206 	return(li);
    207 }
    208 
    209 
    210 int
    211 lefdata(int i, int c)
    212 {
    213 	int	ck;
    214 
    215 	if (i >= nlin)
    216 		i = nlin - 1;
    217 	if (ctype(i, c) == 's') {
    218 		for (ck = c; ctype(i, ck) == 's'; ck--)
    219 			;
    220 		if (thish(i, ck) == 0)
    221 			return(0);
    222 	}
    223 	i = stynum[i];
    224 	i = lefline[c][i];
    225 	if (i > 0)
    226 		return(i);
    227 	if (dboxflg && c == 0)
    228 		return(2);
    229 	if (allflg)
    230 		return(1);
    231 	if (boxflg && c == 0)
    232 		return(1);
    233 	return(0);
    234 }
    235 
    236 
    237 int
    238 next(int i)
    239 {
    240 	while (i + 1 < nlin) {
    241 		i++;
    242 		if (!fullbot[i] && !instead[i])
    243 			break;
    244 	}
    245 	return(i);
    246 }
    247 
    248 
    249 int
    250 prev(int i)
    251 {
    252 	while (--i >= 0  && (fullbot[i] || instead[i]))
    253 		;
    254 	return(i);
    255 }