Annotation of researchv9/cmd/tbl/t4.c, revision 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.