123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /* tu.c: draws horizontal lines */
- # include "t.h"
- void
- makeline(int i, int c, int lintype)
- {
- int cr, type, shortl;
- type = thish(i, c);
- if (type == 0)
- return;
- shortl = (table[i][c].col[0] == '\\');
- if (c > 0 && !shortl && thish(i, c - 1) == type)
- return;
- if (shortl == 0)
- for (cr = c; cr < ncol && (ctype(i, cr) == 's' || type == thish(i, cr)); cr++)
- ;
- else
- for (cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++)
- ;
- drawline(i, c, cr - 1, lintype, 0, shortl);
- }
- void
- fullwide(int i, int lintype)
- {
- int cr, cl;
- if (!pr1403)
- Bprint(&tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
- cr = 0;
- while (cr < ncol) {
- cl = cr;
- while (i > 0 && vspand(prev(i), cl, 1))
- cl++;
- for (cr = cl; cr < ncol; cr++)
- if (i > 0 && vspand(prev(i), cr, 1))
- break;
- if (cl < ncol)
- drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 1, 0);
- }
- Bprint(&tabout, "\n");
- if (!pr1403)
- Bprint(&tabout, ".vs \\n(%du\n", SVS);
- }
- void
- drawline(int i, int cl, int cr, int lintype, int noheight, int shortl)
- {
- char *exhr, *exhl, *lnch;
- int lcount, ln, linpos, oldpos, nodata;
- lcount = 0;
- exhr = exhl = "";
- switch (lintype) {
- case '-':
- lcount = 1;
- break;
- case '=':
- lcount = pr1403 ? 1 : 2;
- break;
- case SHORTLINE:
- lcount = 1;
- break;
- }
- if (lcount <= 0)
- return;
- nodata = cr - cl >= ncol || noheight || allh(i);
- if (!nodata)
- Bprint(&tabout, "\\v'-.5m'");
- for (ln = oldpos = 0; ln < lcount; ln++) {
- linpos = 2 * ln - lcount + 1;
- if (linpos != oldpos)
- Bprint(&tabout, "\\v'%dp'", linpos - oldpos);
- oldpos = linpos;
- if (shortl == 0) {
- tohcol(cl);
- if (lcount > 1) {
- switch (interv(i, cl)) {
- case TOP:
- exhl = ln == 0 ? "1p" : "-1p";
- break;
- case BOT:
- exhl = ln == 1 ? "1p" : "-1p";
- break;
- case THRU:
- exhl = "1p";
- break;
- }
- if (exhl[0])
- Bprint(&tabout, "\\h'%s'", exhl);
- } else if (lcount == 1) {
- switch (interv(i, cl)) {
- case TOP:
- case BOT:
- exhl = "-1p";
- break;
- case THRU:
- exhl = "1p";
- break;
- }
- if (exhl[0])
- Bprint(&tabout, "\\h'%s'", exhl);
- }
- if (lcount > 1) {
- switch (interv(i, cr + 1)) {
- case TOP:
- exhr = ln == 0 ? "-1p" : "+1p";
- break;
- case BOT:
- exhr = ln == 1 ? "-1p" : "+1p";
- break;
- case THRU:
- exhr = "-1p";
- break;
- }
- } else if (lcount == 1) {
- switch (interv(i, cr + 1)) {
- case TOP:
- case BOT:
- exhr = "+1p";
- break;
- case THRU:
- exhr = "-1p";
- break;
- }
- }
- } else
- Bprint(&tabout, "\\h'|\\n(%2su'", reg(cl, CLEFT));
- Bprint(&tabout, "\\s\\n(%d", LSIZE);
- if (linsize)
- Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
- if (shortl)
- Bprint(&tabout, "\\l'|\\n(%2su'", reg(cr, CRIGHT));
- else
- {
- lnch = "\\(ul";
- if (pr1403)
- lnch = lintype == 2 ? "=" : "\\(ru";
- if (cr + 1 >= ncol)
- Bprint(&tabout, "\\l'|\\n(TWu%s%s'", exhr, lnch);
- else
- Bprint(&tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr, CRIGHT),
- reg(cr + 1, CLEFT), exhr, lnch);
- }
- if (linsize)
- Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
- Bprint(&tabout, "\\s0");
- }
- if (oldpos != 0)
- Bprint(&tabout, "\\v'%dp'", -oldpos);
- if (!nodata)
- Bprint(&tabout, "\\v'+.5m'");
- }
- void
- getstop(void)
- {
- int i, c, k, junk, stopp;
- stopp = 1;
- for (i = 0; i < MAXLIN; i++)
- linestop[i] = 0;
- for (i = 0; i < nlin; i++)
- for (c = 0; c < ncol; c++) {
- k = left(i, c, &junk);
- if (k >= 0 && linestop[k] == 0)
- linestop[k] = ++stopp;
- }
- if (boxflg || allflg || dboxflg)
- linestop[0] = 1;
- }
- int
- left(int i, int c, int *lwidp)
- {
- int kind, li, lj;
- /* returns -1 if no line to left */
- /* returns number of line where it starts */
- /* stores into lwid the kind of line */
- *lwidp = 0;
- if (i < 0)
- return(-1);
- kind = lefdata(i, c);
- if (kind == 0)
- return(-1);
- if (i + 1 < nlin)
- if (lefdata(next(i), c) == kind)
- return(-1);
- li = i;
- while (i >= 0 && lefdata(i, c) == kind)
- i = prev(li = i);
- if (prev(li) == -1)
- li = 0;
- *lwidp = kind;
- for (lj = i + 1; lj < li; lj++)
- if (instead[lj] && strcmp(instead[lj], ".TH") == 0)
- return(li);
- for (i = i + 1; i < li; i++)
- if (fullbot[i])
- li = i;
- return(li);
- }
- int
- lefdata(int i, int c)
- {
- int ck;
- if (i >= nlin)
- i = nlin - 1;
- if (ctype(i, c) == 's') {
- for (ck = c; ctype(i, ck) == 's'; ck--)
- ;
- if (thish(i, ck) == 0)
- return(0);
- }
- i = stynum[i];
- i = lefline[c][i];
- if (i > 0)
- return(i);
- if (dboxflg && c == 0)
- return(2);
- if (allflg)
- return(1);
- if (boxflg && c == 0)
- return(1);
- return(0);
- }
- int
- next(int i)
- {
- while (i + 1 < nlin) {
- i++;
- if (!fullbot[i] && !instead[i])
- break;
- }
- return(i);
- }
- int
- prev(int i)
- {
- while (--i >= 0 && (fullbot[i] || instead[i]))
- ;
- return(i);
- }
|