Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* 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);
}