Annotation of researchv10no/cmd/PDP11/fpp/fpp.c, revision 1.1

1.1     ! root        1: /* mjm: started with rhfcc.c   (OCT 78, JAN 79)
        !             2:  *      Made version to be called from "cc -F[qunl]"; /lib/fpp
        !             3:  *     When SMALL DEFINEd,
        !             4:  *     SYMTABSZ, OB, N changed to fit into 16k
        !             5:  */
        !             6: /* #define SMALL       /* mjm: so will fit on LSX with 16K */
        !             7: #define MARK (-1)
        !             8: #ifndef SMALL
        !             9: #define SYMTABSZ 4096
        !            10: #define N 200
        !            11: #define OB 200
        !            12: #endif
        !            13: #ifdef SMALL
        !            14: #define SYMTABSZ 1024  /* mjm: was 4096 (11/20 only 16K) */
        !            15: #define N 100  /* mjm: was 200 */
        !            16: #define OB 100 /* mjm: was 200 */
        !            17: #endif
        !            18: #define ON 77
        !            19: 
        !            20: #define SHARPBUFL 128  /* chars in # lines max */
        !            21: #define HEADLEN 4      /* chars in Q object header */
        !            22: #define SHARPLEN 60    /* max chars in filename from # lines */
        !            23: static char sharptext[SHARPLEN];
        !            24: static int sharpn0,sharpn1; /* n1 = value from line n0 = inputno */
        !            25: 
        !            26: extern int unixfmt; /* if set, use unix format floating point */
        !            27: extern int unsign; /* 1 for unsigned allowed, 0 for not */
        !            28: static struct obj {
        !            29:        int type,size;
        !            30:        char text[2];
        !            31:        };
        !            32: static char ib[N],ugb[N];
        !            33: static int ibp = {N}, ugbp = {0};
        !            34: static int ifp,ofp;
        !            35: static char ob[OB];
        !            36: static int obp,lpos;
        !            37: static inputno;
        !            38: static nopt,qopt,uopt, lopt;   /* mjm: no popt,vopt,eopt; but lopt */
        !            39: static char *infile;
        !            40: char *symtout; /* mjm: file for rhsymtab.c (command arg) */
        !            41: 
        !            42: main(ac,av)
        !            43: int ac;
        !            44: char **av;
        !            45: {
        !            46: int i;
        !            47: char *s;
        !            48: if(ac < 4) {   /* mjm */
        !            49:        printf("fpp arg count error\n");        /* mjm */
        !            50:        exit(1);
        !            51: }
        !            52: if(ac == 5) {  /* mjm */
        !            53:        s = av[4];
        !            54:        while(*s)
        !            55:                switch(*s++) {
        !            56:                        case 'q': qopt=1; break;
        !            57:                        case 'n': nopt=1; break;
        !            58:                        case 'u': uopt=1; break;
        !            59:                        case 'l': lopt=1; break;
        !            60:                }
        !            61: }
        !            62: if(nopt) unixfmt=0;
        !            63: else unixfmt=1;
        !            64: 
        !            65: if(uopt) unsign=0; /* no unsigned declaration in output */
        !            66: else unsign=1; /* declare _ftou() and _ntou() unsigned */
        !            67: 
        !            68: infile=av[1];
        !            69: if((ifp=open(infile,0))<0) abt("can't open .i for read");
        !            70: if((ofp=creat(av[2],0666))<0) abt("can't open fcc write file");
        !            71: symtout = av[3];       /* mjm */
        !            72: symtab(SYMTABSZ);
        !            73: 
        !            74: file();
        !            75: flushout();
        !            76: close(ifp);
        !            77: close(ofp);
        !            78: unlink(symtout);       /* mjm: rm symbol table file */
        !            79: exit(0);
        !            80: }
        !            81: 
        !            82: abt(s)
        !            83: char *s;
        !            84: {
        !            85: pdiag("abt",s);        /* mjm */
        !            86: flushout();
        !            87: exit(1);
        !            88: }
        !            89: 
        !            90: warn(s)
        !            91: char *s;
        !            92: {
        !            93: if(qopt==0)
        !            94:        pdiag("warn",s);
        !            95: }
        !            96: 
        !            97: gc()   /* get a character */
        !            98: {
        !            99: int i,j;
        !           100: if((i=gc2())!='/')return(i); /* not a comment */
        !           101: if((j=gc2())!='*') {
        !           102:        ug(j); /* not a comment */
        !           103:        return(i);
        !           104:        }
        !           105: /*     skip till end of comment */
        !           106: while(1) {
        !           107:        while((i=gc2())!='*') if(i==0)abt("unclosed comment");
        !           108:        if((i=gc2())=='/') return(' '); /*replace comment by blank*/
        !           109:        ug(i);
        !           110:        }
        !           111: }
        !           112: 
        !           113: gc2() /* used to be gc(): this entry doesn't strip comments */
        !           114: {
        !           115: int i,j,k;
        !           116: register char *temp; /* buffer for # line */
        !           117: char outtemp[16+SHARPLEN]; /* buffer for # number on line numbers */
        !           118: char *s;       /* mjm */
        !           119: static int newline = 1; /* if 1, next char starts a new line. check for # */
        !           120: if(ugbp==0) {
        !           121: gc2top:        if(ibp>=N) {
        !           122:                j=read(ifp,ib,N);
        !           123:                if(j<0)j=0;
        !           124:                for(i=j; i<N; i++) ib[i]=0;
        !           125:                ibp=0;
        !           126:                }
        !           127:        if(newline) {   /* check for # line to skip */
        !           128:                newline=0;
        !           129:                if(lopt)        /* mjm: only to get extra line numbers */
        !           130:                if(sharptext[0]) { /* toss out # n file if ever seen # */
        !           131:                        for(k=0; outtemp[k]="# "[k]; k++);
        !           132:                        outtemp[i=k+5]=0; /* convert 5 digits */
        !           133:                        j=inputno-sharpn0+sharpn1;
        !           134:                        while(j) {
        !           135:                                outtemp[--i]=j%10+'0';
        !           136:                                j/=10;
        !           137:                                }
        !           138:                        while(outtemp[k++]=outtemp[i++]);
        !           139:                        outtemp[k-1] = ' ';     /* mjm */
        !           140:                        s = sharptext;  /* mjm: filename also */
        !           141:                        while(outtemp[k++] = *s++) ; /* mjm */
        !           142:                        outtemp[k-1]='\n';
        !           143:                        write(ofp,outtemp,k);
        !           144:                        }
        !           145:                if(ib[ibp]=='#') {
        !           146:                        temp=(char *)getq(SHARPBUFL-HEADLEN); /* get buffer for line */
        !           147:                        for(i=0; i<SHARPBUFL;) {
        !           148:                                if((temp[i++]=gc2())=='\n')break;
        !           149:                                }
        !           150:                        write(ofp,temp,i);
        !           151:                        sharpn0=inputno;
        !           152:                        j=1; while(temp[j]==' ')j++;
        !           153:                        if(temp[j]=='\n')goto skipx;
        !           154:                        sharpn1=0;
        !           155:                        while(temp[j]>='0'&&temp[j]<='9')sharpn1=sharpn1*10
        !           156:                                                        +temp[j++]-'0';
        !           157:                        while(temp[j]==' ')j++;
        !           158:                        if(temp[j]=='\n')goto skipx;
        !           159:                        i=0;
        !           160:                        while(temp[j]!='\n'&&i<SHARPLEN-1)
        !           161:                                sharptext[i++]=temp[j++];
        !           162:                        sharptext[i]=0;
        !           163:                skipx:
        !           164:                        free(temp);
        !           165:                        goto gc2top;
        !           166:                        }
        !           167:                }
        !           168:        inputno+=newline=ib[ibp]=='\n'; /* ha! */
        !           169:        while((j=ib[ibp++])=='\\') {
        !           170:                if((i=gc())!='\n') {
        !           171:                        ug(i);
        !           172:                        return('\\');
        !           173:                        }
        !           174:                }
        !           175:        return(j);
        !           176:        }
        !           177: return(ugb[ugbp--]);
        !           178: }
        !           179: 
        !           180: ug(c)  /* unget a character */
        !           181: int c;
        !           182: {
        !           183: ugb[++ugbp]=c;
        !           184: if(ugbp>=N-1)abt("unget buffer overflow");
        !           185: return(c);
        !           186: }
        !           187: 
        !           188: 
        !           189: outq(op)
        !           190: struct obj *op;
        !           191: {
        !           192: int i,j,k;
        !           193: int c;
        !           194: char *s;
        !           195: k=op->size;
        !           196: s=op->text;
        !           197:        for(i=0; i<k; i++) {
        !           198:                c= *s++;
        !           199:                ob[obp++]=c;
        !           200:                if(c=='\n') flushout();
        !           201:                lpos+= c!=MARK;
        !           202:                if(lpos>ON||obp>=OB) partial();
        !           203:                }
        !           204: }
        !           205: 
        !           206: flushout()
        !           207: {
        !           208: int i,j,k;
        !           209: if(obp<=0)return(0);
        !           210: for(i=j=0; i<obp; i++) {
        !           211:        if(ob[i]!=MARK)ob[j++]=ob[i];
        !           212:        }
        !           213: if(j==0)ob[j++]='\n';
        !           214: if(ob[j-1]!='\n')ob[j++]='\n';
        !           215: if(write(ofp,ob,j)<=0) {
        !           216:        obp=0;
        !           217:        abt("write error");
        !           218:        }
        !           219: lpos=obp=0;
        !           220: }
        !           221: 
        !           222: partial()
        !           223: {
        !           224: int i,j,k,l;
        !           225: for(i=j=k=0; i<obp; i++) {
        !           226:        if(ob[i]==MARK) {
        !           227:                if(k<ON) j=i;
        !           228:                }
        !           229:        else k++;
        !           230:        }
        !           231: if(j==0) {
        !           232:        l=obp;
        !           233:        for(i=ON; i>0; --i)if(ob[i-1]!='\\')break;
        !           234:        if(i==0)abt("funny line in 'partial()'");
        !           235:        k=ob[i];
        !           236:        j=ob[i+1];
        !           237:        ob[i]='\\';
        !           238:        ob[i+1]='\n';
        !           239:        obp=i+2;
        !           240:        flushout();
        !           241:        obp=l;
        !           242:        ob[i]=k;
        !           243:        ob[i+1]=j;
        !           244:        for(j=lpos=0; i<l; i++) {
        !           245:                lpos+= (ob[j++]=ob[i])!=MARK;
        !           246:                }
        !           247:        obp=j;
        !           248:        return(0);
        !           249:        }
        !           250: else {
        !           251:        ob[j++]='\n';
        !           252:        l=obp;
        !           253:        obp=j;
        !           254:        flushout();
        !           255:        for(i=lpos=0; j<l; j++) {
        !           256:                lpos+= (ob[i++]=ob[j])!=MARK;
        !           257:                }
        !           258:        obp=i;
        !           259:        return(0);
        !           260:        }
        !           261: }
        !           262: static pdiag(name,s)   /* mjm: replaces printif() and printf's in abt and warn */
        !           263: char *name, *s;
        !           264: {
        !           265:        printf("%s line %d:", sharptext,inputno-sharpn0+sharpn1);
        !           266:        printf("  fpp %s: %s\n", name,s);
        !           267: }

unix.superglobalmegacorp.com

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