Annotation of 43BSD/usr.bin/tbl/t5.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)t5.c       4.3 9/14/85";
        !             3: #endif
        !             4: 
        !             5:  /* t5.c: read data for table */
        !             6: # include "t..c"
        !             7: gettbl()
        !             8: {
        !             9: int icol, ch;
        !            10: cstore=cspace= chspace();
        !            11: textflg=0;
        !            12: for (nlin=nslin=0; gets1(cstore); nlin++)
        !            13:        {
        !            14:        stynum[nlin]=nslin;
        !            15:        if (prefix(".TE", cstore))
        !            16:                {
        !            17:                leftover=0;
        !            18:                break;
        !            19:                }
        !            20:        if (prefix(".TC", cstore) || prefix(".T&", cstore))
        !            21:                {
        !            22:                readspec();
        !            23:                nslin++;
        !            24:                }
        !            25:        if (nlin>=MAXLIN)
        !            26:                {
        !            27:                leftover=(int)cstore;
        !            28:                break;
        !            29:                }
        !            30:        fullbot[nlin]=0;
        !            31:        if (cstore[0] == '.' && !isdigit(cstore[1]))
        !            32:                {
        !            33:                instead[nlin] = cstore;
        !            34:                while (*cstore++);
        !            35:                continue;
        !            36:                }
        !            37:        else instead[nlin] = 0;
        !            38:        if (nodata(nlin))
        !            39:                {
        !            40:                if (ch = oneh(nlin))
        !            41:                        fullbot[nlin]= ch;
        !            42:                nlin++;
        !            43:                nslin++;
        !            44:                instead[nlin]=(char *)0;
        !            45:                fullbot[nlin]=0;
        !            46:                }
        !            47:        table[nlin] = (struct colstr *)alocv((ncol+2)*sizeof(table[0][0]));
        !            48:        if (cstore[1]==0)
        !            49:        switch(cstore[0])
        !            50:                {
        !            51:                case '_': fullbot[nlin]= '-'; continue;
        !            52:                case '=': fullbot[nlin]= '='; continue;
        !            53:                }
        !            54:        stynum[nlin] = nslin;
        !            55:        nslin = min(nslin+1, nclin-1);
        !            56:        for (icol = 0; icol <ncol; icol++)
        !            57:                {
        !            58:                table[nlin][icol].col = cstore;
        !            59:                table[nlin][icol].rcol=0;
        !            60:                ch=1;
        !            61:                if (match(cstore, "T{")) /* text follows */
        !            62:                        table[nlin][icol].col =
        !            63:                                (char *)gettext(cstore, nlin, icol,
        !            64:                                        font[stynum[nlin]][icol],
        !            65:                                        csize[stynum[nlin]][icol]);
        !            66:                else
        !            67:                        {
        !            68:                        for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
        !            69:                                        ;
        !            70:                        *cstore++ = '\0';
        !            71:                        switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
        !            72:                                {
        !            73:                                case 'n':
        !            74:                                        table[nlin][icol].rcol = 
        !            75:                                            (char *)maknew(table[nlin][icol].col);
        !            76:                                        break;
        !            77:                                case 'a':
        !            78:                                        table[nlin][icol].rcol = table[nlin][icol].col;
        !            79:                                        table[nlin][icol].col = "";
        !            80:                                        break;
        !            81:                                }
        !            82:                        }
        !            83:                while (ctype(nlin,icol+1)== 's') /* spanning */
        !            84:                        table[nlin][++icol].col = "";
        !            85:                if (ch == '\0') break;
        !            86:                }
        !            87:        while (++icol <ncol+2)
        !            88:                {
        !            89:                table[nlin][icol].col = "";
        !            90:                table [nlin][icol].rcol=0;
        !            91:                }
        !            92:        while (*cstore != '\0')
        !            93:                 cstore++;
        !            94:        if (cstore-cspace > MAXCHS)
        !            95:                cstore = cspace = chspace();
        !            96:        }
        !            97: last = cstore;
        !            98: permute();
        !            99: if (textflg) untext();
        !           100: return;
        !           101: }
        !           102: nodata(il)
        !           103: {
        !           104: int c;
        !           105: for (c=0; c<ncol;c++)
        !           106:        {
        !           107:        switch(ctype(il,c))
        !           108:                {
        !           109:                case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
        !           110:                        return(0);
        !           111:                }
        !           112:        }
        !           113: return(1);
        !           114: }
        !           115: oneh(lin)
        !           116: {
        !           117: int k, icol;
        !           118: k = ctype(lin,0);
        !           119: for(icol=1; icol<ncol; icol++)
        !           120:        {
        !           121:        if (k != ctype(lin,icol))
        !           122:                return(0);
        !           123:        }
        !           124: return(k);
        !           125: }
        !           126: # define SPAN "\\^"
        !           127: permute()
        !           128: {
        !           129: int irow, jcol, is;
        !           130: char *start, *strig;
        !           131: for(jcol=0; jcol<ncol; jcol++)
        !           132:        {
        !           133:        for(irow=1; irow<nlin; irow++)
        !           134:                {
        !           135:                if (vspand(irow,jcol,0))
        !           136:                        {
        !           137:                        is = prev(irow);
        !           138:                        if (is<0)
        !           139:                                error("Vertical spanning in first row not allowed");
        !           140:                        start = table[is][jcol].col;
        !           141:                        strig = table[is][jcol].rcol;
        !           142:                        while (irow<nlin &&vspand(irow,jcol,0))
        !           143:                                irow++;
        !           144:                        table[--irow][jcol].col = start;
        !           145:                        table[irow][jcol].rcol = strig;
        !           146:                        while (is<irow)
        !           147:                                {
        !           148:                                table[is][jcol].rcol =0;
        !           149:                                table[is][jcol].col= SPAN;
        !           150:                                is = next(is);
        !           151:                                }
        !           152:                        }
        !           153:                }
        !           154:        }
        !           155: }
        !           156: vspand(ir,ij,ifform)
        !           157: {
        !           158: if (ir<0) return(0);
        !           159: if (ir>=nlin)return(0);
        !           160: if (instead[ir]) return(0);
        !           161: if (ifform==0 && ctype(ir,ij)=='^') return(1);
        !           162: if (table[ir][ij].rcol!=0) return(0);
        !           163: if (fullbot[ir]) return(0);
        !           164: return(vspen(table[ir][ij].col));
        !           165: }
        !           166: vspen(s)
        !           167:        char *s;
        !           168: {
        !           169: if (s==0) return(0);
        !           170: if (!point(s)) return(0);
        !           171: return(match(s, SPAN));
        !           172: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.