Annotation of researchv9/cmd/tbl/t4.c, revision 1.1.1.1

1.1       root        1:  /* t4.c: read table specification */
                      2: # include "t..c"
                      3: int oncol;
                      4: getspec()
                      5: {
                      6: int icol, i;
                      7: qcol = findcol()+1;/* must allow one extra for line at right */
                      8: garray(qcol);
                      9: sep[-1]= -1;
                     10: for(icol=0; icol<qcol; icol++)
                     11:        {
                     12:        sep[icol]= -1;
                     13:        evenup[icol]=0;
                     14:        cll[icol][0]=0;
                     15:        for(i=0; i<MAXHEAD; i++)
                     16:                {
                     17:                csize[icol][i][0]=0;
                     18:                vsize[icol][i][0]=0;
                     19:                font[icol][i][0] = lefline[icol][i] = 0;
                     20:                flags[icol][i]=0;
                     21:                style[icol][i]= 'l';
                     22:                }
                     23:        }
                     24: for(i=0;i<MAXHEAD;i++)
                     25:        lefline[qcol][i]=0;     /* fixes sample55 looping */
                     26: nclin=ncol=0;
                     27: oncol =0;
                     28: left1flg=rightl=0;
                     29: readspec();
                     30: fprintf(tabout, ".rm");
                     31: for(i=0; i<ncol; i++)
                     32:        fprintf(tabout, " %2s", reg(i, CRIGHT));
                     33: fprintf(tabout, "\n");
                     34: }
                     35: readspec()
                     36: {
                     37: int icol, c, sawchar, stopc, i;
                     38: char sn[10], *snp, *temp;
                     39: sawchar=icol=0;
                     40: while (c=get1char())
                     41:        {
                     42:        switch(c)
                     43:                {
                     44:                default:
                     45:                        if (c != tab)
                     46:                        error("bad table specification character");
                     47:                case ' ': /* note this is also case tab */
                     48:                        continue;
                     49:                case '\n':
                     50:                        if(sawchar==0) continue;
                     51:                case ',':
                     52:                case '.': /* end of table specification */
                     53:                        ncol = max(ncol, icol);
                     54:                        if (lefline[ncol][nclin]>0) {ncol++; rightl++;};
                     55:                        if(sawchar)
                     56:                                nclin++;
                     57:                        if (nclin>=MAXHEAD)
                     58:                                error("too many lines in specification");
                     59:                        icol=0;
                     60:                        if (ncol==0 || nclin==0)
                     61:                                error("no specification");
                     62:                        if (c== '.')
                     63:                                {
                     64:                                while ((c=get1char()) && c != '\n')
                     65:                                        if (c != ' ' && c != '\t')
                     66:                                                error("dot not last character on format line");
                     67:                                /* fix up sep - default is 3 except at edge */
                     68:                                for(icol=0; icol<ncol; icol++)
                     69:                                        if (sep[icol]<0)
                     70:                                                sep[icol] =  icol+1<ncol ? 3 : 2;
                     71:                                if (oncol == 0)
                     72:                                        oncol = ncol;
                     73:                                else if (oncol +2 <ncol)
                     74:                                        error("tried to widen table in T&, not allowed");
                     75:                                return;
                     76:                                }
                     77:                        sawchar=0;
                     78:                        continue;
                     79:                case 'C': case 'S': case 'R': case 'N': case 'L':  case 'A':
                     80:                        c += ('a'-'A');
                     81:                case '_': if (c=='_') c= '-';
                     82:                case '=': case '-':
                     83:                case '^':
                     84:                case 'c': case 's': case 'n': case 'r': case 'l':  case 'a':
                     85:                        style[icol][nclin]=c;
                     86:                        if (c== 's' && icol<=0)
                     87:                                error("first column can not be S-type");
                     88:                        if (c=='s' && style[icol-1][nclin] == 'a')
                     89:                                {
                     90:                                fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
                     91:                                style[icol-1][nclin] = 'l';
                     92:                                }
                     93:                        if (c=='s' && style[icol-1][nclin] == 'n')
                     94:                                {
                     95:                                fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
                     96:                                style[icol-1][nclin] = 'c';
                     97:                                }
                     98:                        icol++;
                     99:                        if (c=='^' && nclin<=0)
                    100:                                error("first row can not contain vertical span");
                    101:                        if (icol>qcol)
                    102:                                error("too many columns in table");
                    103:                        sawchar=1;
                    104:                        continue;
                    105:                case 'b': case 'i': 
                    106:                        c += 'A'-'a';
                    107:                case 'B': case 'I':
                    108:                        if (icol==0) continue;
                    109:                        snp=font[icol-1][nclin];
                    110:                        snp[0]= (c=='I' ? '2' : '3');
                    111:                        snp[1]=0;
                    112:                        continue;
                    113:                case 't': case 'T':
                    114:                        if (icol>0)
                    115:                        flags[icol-1][nclin] |= CTOP;
                    116:                        continue;
                    117:                case 'd': case 'D':
                    118:                        if (icol>0)
                    119:                        flags[icol-1][nclin] |= CDOWN;
                    120:                        continue;
                    121:                case 'f': case 'F':
                    122:                        if (icol==0) continue;
                    123:                        snp=font[icol-1][nclin];
                    124:                        snp[0]=snp[1]=stopc=0;
                    125:                        for(i=0; i<2; i++)
                    126:                                {
                    127:                                c = get1char();
                    128:                                if (i==0 && c=='(')
                    129:                                        {
                    130:                                        stopc=')';
                    131:                                        c = get1char();
                    132:                                        }
                    133:                                if (c==0) break;
                    134:                                if (c==stopc) {stopc=0; break;}
                    135:                                if (stopc==0)  if (c==' ' || c== tab ) break;
                    136:                                if (c=='\n'){un1getc(c); break;}
                    137:                                snp[i] = c;
                    138:                                if (c>= '0' && c<= '9') break;
                    139:                                }
                    140:                        if (stopc) if (get1char()!=stopc)
                    141:                                error("Nonterminated font name");
                    142:                        continue;
                    143:                case 'P': case 'p':
                    144:                        if (icol<=0) continue;
                    145:                        temp = snp = csize[icol-1][nclin];
                    146:                        while (c = get1char())
                    147:                                {
                    148:                                if (c== ' ' || c== tab || c=='\n') break;
                    149:                                if (c=='-' || c == '+')
                    150:                                        if (snp>temp)
                    151:                                                break;
                    152:                                        else
                    153:                                                *snp++=c;
                    154:                                else
                    155:                                if (digit(c))
                    156:                                        *snp++ = c;
                    157:                                else break;
                    158:                                if (snp-temp>4)
                    159:                                        error("point size too large");
                    160:                                }
                    161:                        *snp = 0;
                    162:                        if (atoi(temp)>36)
                    163:                                error("point size unreasonable");
                    164:                        un1getc (c);
                    165:                        continue;
                    166:                case 'V': case 'v':
                    167:                        if (icol<=0) continue;
                    168:                        temp = snp = vsize[icol-1][nclin];
                    169:                        while (c = get1char())
                    170:                                {
                    171:                                if (c== ' ' || c== tab || c=='\n') break;
                    172:                                if (c=='-' || c == '+')
                    173:                                        if (snp>temp)
                    174:                                                break;
                    175:                                        else
                    176:                                                *snp++=c;
                    177:                                else
                    178:                                if (digit(c))
                    179:                                        *snp++ = c;
                    180:                                else break;
                    181:                                if (snp-temp>4)
                    182:                                        error("vertical spacing value too large");
                    183:                                }
                    184:                        *snp=0;
                    185:                        un1getc(c);
                    186:                        continue;
                    187:                case 'w': case 'W':
                    188:                        snp = cll [icol-1];
                    189:                /* Dale Smith didn't like this check - possible to have two text blocks
                    190:                   of different widths now ....
                    191:                        if (*snp)
                    192:                                {
                    193:                                fprintf(tabout, "Ignored second width specification");
                    194:                                continue;
                    195:                                }
                    196:                /* end commented out code ... */
                    197:                        stopc=0;
                    198:                        while (c = get1char())
                    199:                                {
                    200:                                if (snp==cll[icol-1] && c=='(')
                    201:                                        {
                    202:                                        stopc = ')';
                    203:                                        continue;
                    204:                                        }
                    205:                                if ( !stopc && (c>'9' || c< '0'))
                    206:                                        break;
                    207:                                if (stopc && c== stopc)
                    208:                                        break;
                    209:                                *snp++ =c;
                    210:                                }
                    211:                        *snp=0;
                    212:                        if (snp-cll[icol-1]>CLLEN)
                    213:                                error ("column width too long");
                    214:                        if (!stopc)
                    215:                                un1getc(c);
                    216:                        continue;
                    217:                case 'e': case 'E':
                    218:                        if (icol<1) continue;
                    219:                        evenup[icol-1]=1;
                    220:                        evenflg=1;
                    221:                        continue;
                    222:                case 'z': case 'Z': /* zero width-ignre width this item */
                    223:                        if (icol<1) continue;
                    224:                        flags[icol-1][nclin] |= ZEROW;
                    225:                        continue;
                    226:                case 'u': case 'U': /* half line up */
                    227:                        if (icol<1) continue;
                    228:                        flags[icol-1][nclin] |= HALFUP;
                    229:                        continue;
                    230:                case '0': case '1': case '2': case '3': case '4':
                    231:                case '5': case '6': case '7': case '8': case '9': 
                    232:                        sn[0] = c;
                    233:                        snp=sn+1;
                    234:                        while (digit(*snp++ = c = get1char()))
                    235:                                ;
                    236:                        un1getc(c);
                    237:                        sep[icol-1] = max(sep[icol-1], numb(sn));
                    238:                        continue;
                    239:                case '|':
                    240:                        lefline[icol][nclin]++;
                    241:                        if (icol==0) left1flg=1;
                    242:                        continue;
                    243:                }
                    244:        }
                    245: error("EOF reading table specification");
                    246: }
                    247: findcol()
                    248: {
                    249: # define FLNLIM 200
                    250: /* this counts the number of columns and then puts the line back*/
                    251: char *s, line[FLNLIM+2], *p;
                    252: int c, n=0, inpar=0;
                    253: while ((c=get1char())!=EOF && c == ' ')
                    254:        ;
                    255: if (c!='\n')
                    256:        un1getc(c);
                    257: for(s=line; *s = c = get1char(); s++)
                    258:        {
                    259:        if (c==')') inpar=0;
                    260:        if (inpar) continue;
                    261:        if (c=='\n' || c == EOF || c == '.' || c==',')
                    262:                break;
                    263:        else if (c=='(')
                    264:                inpar=1;
                    265:        else
                    266:                if (s>=line+FLNLIM)
                    267:                        error("too long spec line");
                    268:        }
                    269: for(p=line; p<s; p++)
                    270:        switch (c= *p)
                    271:                {
                    272:                case 'l': case 'r': case 'c': case 'n': case 'a': case 's': 
                    273:                case 'L': case 'R': case 'C': case 'N': case 'A': case 'S': 
                    274:                case '-': case '=': case '_':
                    275:                        n++;
                    276:                }
                    277: while (p>=line)
                    278:        un1getc(*p--);
                    279: return(n);
                    280: }
                    281: garray(qcol)
                    282: {
                    283: char * getcore();
                    284: style =  (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
                    285: evenup = (int *) getcore(qcol, sizeof(int));
                    286: lefline = (int (*)[]) getcore(MAXHEAD*(qcol+1), sizeof (int)); /*+1 for sample55 loop - others may need it too*/
                    287: font = (char (*)[][2]) getcore(MAXHEAD*qcol, 2);
                    288: csize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
                    289: vsize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD*qcol, 4);
                    290: flags =  (int (*)[]) getcore(MAXHEAD*qcol, sizeof(int));
                    291: cll = (char (*)[])getcore(qcol, CLLEN);
                    292: sep = (int *) getcore(qcol+1, sizeof(int));
                    293: sep++; /* sep[-1] must be legal */
                    294: used = (int *) getcore(qcol+1, sizeof(int));
                    295: lused = (int *) getcore(qcol+1, sizeof(int));
                    296: rused = (int *) getcore(qcol+1, sizeof(int));
                    297: doubled = (int *) getcore(qcol+1, sizeof(int));
                    298: acase = (int *) getcore(qcol+1, sizeof(int));
                    299: topat = (int *) getcore(qcol+1, sizeof(int));
                    300: }
                    301: char *
                    302: getcore(a,b)
                    303: {
                    304: char *x, *calloc();
                    305: x = calloc(a,b);
                    306: if (x==0) 
                    307:        error("Couldn't get memory");
                    308: return(x);
                    309: }
                    310: freearr()
                    311: {
                    312: cfree(style);
                    313: cfree(evenup);
                    314: cfree(lefline);
                    315: cfree(flags);
                    316: cfree(font);
                    317: cfree(csize);
                    318: cfree(vsize);
                    319: cfree(cll);
                    320: cfree(--sep);  /* netnews says this should be --sep because incremented earlier! */
                    321: cfree(used);
                    322: cfree(lused);
                    323: cfree(rused);
                    324: cfree(doubled);
                    325: cfree(acase);
                    326: cfree(topat);
                    327: }

unix.superglobalmegacorp.com

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