Subversion Repositories planix.SVN

Rev

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

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