Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "tdef.h"
#include "ext.h"
#include "fns.h"
#include <ctype.h>

/*
 * n6.c -- width functions, sizes and fonts
*/

n_width(Tchar j)
{
        int i, k;

        if (iszbit(j))
                return 0;
        if (ismot(j)) {
                if (isvmot(j))
                        return(0);
                k = absmot(j);
                if (isnmot(j))
                        k = -k;
                return(k);
        }
        i = cbits(j);
        if (i < ' ') {
                if (i == '\b')
                        return(-widthp);
                if (i == PRESC)
                        i = eschar;
                else if (i == HX)
                        return(0);
        }
        if (i == ohc)
                return(0);
        i = trtab[i];
        if (i < ' ')
                return(0);
        if (i >= t.tfont.nchars)        /* not on the font */
                k = t.Char;             /* really ought to check properly */
        else
                k = t.tfont.wp[i].wid * t.Char;
        widthp = k;
        return(k);
}


Tchar n_setch(int c)
{
        return t_setch(c);
}

Tchar n_setabs(void)    /* set absolute char from \N'...' */
{                       /* for now, a no-op */
        return t_setabs();
}

int n_findft(int i)
{
        int k;

        if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
                return(k);
        for (k = 0; fontlab[k] != i; k++)
                if (k > nfonts)
                        return(-1);
        return(k);
}



void n_mchbits(void)
{
        chbits = 0;
        setfbits(chbits, font);
        sps = width(' ' | chbits);
}


void n_setps(void )
{
        int i, j;

        i = cbits(getch());
        if (isdigit(i)) {               /* \sd or \sdd */
                i -= '0';
                if (i == 0) {           /* \s0 */
                        ;
                } else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) {      /* \sdd */
                        ch = 0;
                }
        } else if (i == '(') {          /* \s(dd */
                getch();
                getch();
        } else if (i == '+' || i == '-') {      /* \s+, \s- */
                j = cbits(getch());
                if (isdigit(j)) {               /* \s+d, \s-d */
                        ;
                } else if (j == '(') {          /* \s+(dd, \s-(dd */
                        getch();
                        getch();
                }
        }
}


Tchar n_setht(void)             /* set character height from \H'...' */
{

        getch();
        inumb(&apts);
        getch();
        return(0);
}


Tchar n_setslant(void)          /* set slant from \S'...' */
{
        int n;

        getch();
        n = 0;
        n = inumb(&n);
        getch();
        return(0);
}


void n_caseft(void)
{
        skip();
        setfont(1);
}


void n_setfont(int a)
{
        int i, j;

        if (a)
                i = getrq();
        else 
                i = getsn();
        if (!i || i == 'P') {
                j = font1;
                goto s0;
        }
        if (i == 'S' || i == '0')
                return;
        if ((j = findft(i)) == -1)
                return;
s0:
        font1 = font;
        font = j;
        mchbits();
}


void n_setwd(void)
{
        int base, wid;
        Tchar i;
        int     delim, emsz, k;
        int     savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;

        base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0;
        if (ismot(i = getch()))
                return;
        delim = cbits(i);
        savhp = numtabp[HP].val;
        numtabp[HP].val = 0;
        savapts = apts;
        savapts1 = apts1;
        savfont = font;
        savfont1 = font1;
        savpts = pts;
        savpts1 = pts1;
        setwdf++;
        while (cbits(i = getch()) != delim && !nlflg) {
                k = width(i);
                wid += k;
                numtabp[HP].val += k;
                if (!ismot(i)) {
                        emsz = (INCH * pts + 36) / 72;
                } else if (isvmot(i)) {
                        k = absmot(i);
                        if (isnmot(i))
                                k = -k;
                        base -= k;
                        emsz = 0;
                } else 
                        continue;
                if (base < numtabp[SB].val)
                        numtabp[SB].val = base;
                if ((k = base + emsz) > numtabp[ST].val)
                        numtabp[ST].val = k;
        }
        setn1(wid, 0, (Tchar) 0);
        numtabp[HP].val = savhp;
        apts = savapts;
        apts1 = savapts1;
        font = savfont;
        font1 = savfont1;
        pts = savpts;
        pts1 = savpts1;
        mchbits();
        setwdf = 0;
}


Tchar n_vmot(void)
{
        dfact = lss;
        vflag++;
        return n_mot();
}


Tchar n_hmot(void)
{
        dfact = EM;
        return n_mot();
}


Tchar n_mot(void)
{
        int j, n;
        Tchar i;

        j = HOR;
        getch(); /*eat delim*/
        if (n = atoi0()) {
                if (vflag)
                        j = VERT;
                i = makem(quant(n, j));
        } else
                i = 0;
        getch();
        vflag = 0;
        dfact = 1;
        return(i);
}


Tchar n_sethl(int k)
{
        int j;
        Tchar i;

        j = t.Halfline;
        if (k == 'u')
                j = -j;
        else if (k == 'r')
                j = -2 * j;
        vflag++;
        i = makem(j);
        vflag = 0;
        return(i);
}


Tchar n_makem(int i)
{
        Tchar j;

        if (i >= 0)
                j = i;
        else
                j = -i;
        j |= MOT;
        if (i < 0)
                j |= NMOT;
        if (vflag)
                j |= VMOT;
        return(j);
}


void n_casefp(void)
{
        int i, j;

        skip();
        if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
                return;
        if (skip() || !(j = getrq()))
                return;
        fontlab[i] = j;
}



void n_casebd(void)
{
        int i, j, k;

        j = k = 0;
bd0:
        if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
                if (k)
                        goto bd1;
                else 
                        return;
        }
        if (j == smnt) {
                k = smnt;
                goto bd0;
        }
        if (k) {
                sbold = j;
                j = k;
        }
bd1:
        skip();
        noscale++;
        bdtab[j] = atoi0();
        noscale = 0;
}


void n_casevs(void)
{
        int i;

        skip();
        vflag++;
        dfact = INCH; /*default scaling is points!*/
        dfactd = 72;
        res = VERT;
        i = inumb(&lss);
        if (nonumb)
                i = lss1;
        if (i < VERT)
                i = VERT;       /* was VERT */
        lss1 = lss;
        lss = i;
}




Tchar n_xlss(void)
{
        /* stores \x'...' into
        /* two successive Tchars.
        /* the first contains HX, the second the value,
        /* encoded as a vertical motion.
        /* decoding is done in n2.c by pchar().
        */
        int     i;

        getch();
        dfact = lss;
        i = quant(atoi0(), VERT);
        dfact = 1;
        getch();
        if (i >= 0)
                *pbp++ = MOT | VMOT | i;
        else
                *pbp++ = MOT | VMOT | NMOT | -i;
        return(HX);
}