Annotation of 41BSD/cmd/tbl/t5.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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