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

1.1     ! root        1: #define MARK (-1)
        !             2: #define SYMTABSZ 4096
        !             3: #define OUTFILE "a_out.c"
        !             4: #define OUTFILE2 "a_out.o"
        !             5: #define N 200
        !             6: #define ON 77
        !             7: #define OB 200
        !             8: 
        !             9: char *symtout "a.out"; /* symbol table filename */
        !            10: extern int unixfmt; /* if set, use unix format floating point */
        !            11: extern int unsign; /* 1 for unsigned allowed, 0 for not */
        !            12: static struct obj {
        !            13:        int type,size;
        !            14:        char text[2];
        !            15:        };
        !            16: static char ib[N],ugb[N];
        !            17: static int ibp {N}, ugbp {0};
        !            18: static int ifp,ofp;
        !            19: static char ob[OB];
        !            20: static int obp,lpos;
        !            21: static inputno;
        !            22: static popt,nopt,vopt,qopt,uopt;
        !            23: static eopt; /* use -E option */
        !            24: static char *infile;
        !            25: #define SHARPBUFL 256  /* chars in # lines max */
        !            26: #define HEADLEN 4      /* chars in Q object header */
        !            27: #define SHARPLEN 80    /* max characters in filename from # lines */
        !            28: static char sharptext[SHARPLEN];
        !            29: static int sharpn0,sharpn1; /* n1 = value from line n0 = inputno */
        !            30: 
        !            31: main(ac,av)
        !            32: int ac;
        !            33: char **av;
        !            34: {
        !            35: int i;
        !            36: char *s;
        !            37: if(ac<2) {
        !            38:        printf("usage: fcc progname.c -options\n");
        !            39:        printf("   options: 'P' halt after text conversion\n");
        !            40:        printf("            'n' norgen-format floating point constants\n");
        !            41:        printf("            'v' verbose mode: lots of commentary\n");
        !            42:        printf("            'q' quiet mode: warnings do not print\n");
        !            43:        printf("            'u' no unsigned declaration generated\n");
        !            44:        printf("            'E' use source line numbers if possible\n");
        !            45:        exit(0);
        !            46:        }
        !            47: if(ac>2) {
        !            48:        s=av[2];
        !            49:        if(*s!='-') {
        !            50:                if(av[1][0]=='-') {
        !            51:                        av[2]=av[1];
        !            52:                        av[1]=s;
        !            53:                        s=av[2];
        !            54:                        }
        !            55:                else abt("bad option, expect -nPvqu");
        !            56:                }
        !            57:        while(*++s) {
        !            58:                nopt=| *s=='n';
        !            59:                popt=| *s=='P';
        !            60:                vopt=| *s=='v';
        !            61:                qopt=| *s=='q';
        !            62:                uopt=| *s=='u';
        !            63:                eopt=| *s=='E';
        !            64:                }
        !            65:        }
        !            66: /* change to "!eopt" to reverse default meaning of E option */
        !            67: if(eopt) {
        !            68:        system4("cc -E ",av[1]," >",OUTFILE); /* .i output */
        !            69:        for(i=0; av[1][i]; i++); av[1][--i]='i';
        !            70:        if(av[1][i-1]!='.')abt("need '.c' name");
        !            71:        system4("mv ",OUTFILE," ",av[1]);
        !            72:        }
        !            73: else   system4("cc -P ",av[1],"","");
        !            74: for(i=0; av[1][i]; i++);
        !            75: av[1][--i]='i';
        !            76: if(--i<=0||av[1][i]!='.')abt("need '.c' name");
        !            77: infile=av[1];
        !            78: if((ifp=open(av[1],0))<0)abt("can't open .i for read");
        !            79: if((ofp=creat(OUTFILE,0666))<0)abt("can't open fcc temp file");
        !            80: symtab(SYMTABSZ);
        !            81: 
        !            82: if(nopt) {
        !            83:        unixfmt=0;
        !            84:        if(vopt)printf("using -n: norgen-format float\n");
        !            85:        }
        !            86: else unixfmt=1;
        !            87: 
        !            88: if(uopt)unsign=0; /* no unsigned declaration in output */
        !            89: else unsign=1; /* declare _ftou() and _ntou() unsigned */
        !            90: 
        !            91: if(vopt)printf("begin %s-float conversion: file %s to %s\n",
        !            92:        unixfmt?"unix":"norgen",av[1],OUTFILE);
        !            93: file();
        !            94: flushout();
        !            95: close(ifp);
        !            96: close(ofp);
        !            97: if(popt==0) system4("rm ",av[1],"","");
        !            98: else {
        !            99:        if(vopt)printf("conversion input is %s\n",av[1]);
        !           100:        if(vopt)printf("conversion output is %s\n",OUTFILE);
        !           101:        if(vopt)printf("-P option: quit.\n");
        !           102:        exit(0);
        !           103:        }
        !           104: system4("cc -c -O ",OUTFILE,"","");
        !           105: system4("rm ",OUTFILE,"","");
        !           106: for(i=0; av[1][i]; i++);
        !           107: av[1][--i]='o';
        !           108: system4("mv ",OUTFILE2," ",av[1]);
        !           109: exit(0);
        !           110: }
        !           111: system4(s1,s2,s3,s4)
        !           112: char *s1,*s2,*s3,*s4;
        !           113: {
        !           114: char s[100];
        !           115: int i;
        !           116: i=0; while(*s1)s[i++]= *s1++;
        !           117: while(*s2)s[i++]= *s2++;
        !           118: while(*s3)s[i++]= *s3++;
        !           119: while(*s4)s[i++]= *s4++;
        !           120: s[i]=0;
        !           121: if(vopt)printf("%s\n",s);
        !           122: if(fork()==0) execl("/bin/sh","sh","-c",s,0);
        !           123: wait(&i);
        !           124: if(i) {
        !           125:        printf("bad termination status from %s\n",s);
        !           126:        exit(1);
        !           127:        }
        !           128: return ;
        !           129: }
        !           130: 
        !           131: abt(s)
        !           132: char *s;
        !           133: {
        !           134: printif();
        !           135: printf("%s line %d abort in fcc\n",infile,inputno+1);
        !           136: printf("   %s\n",s);
        !           137: flushout();
        !           138: exit(1);
        !           139: }
        !           140: 
        !           141: warn(s)
        !           142: char *s;
        !           143: {
        !           144: if(qopt)return;
        !           145: printif();
        !           146: printf("%s line %d warn: %s\n",infile,inputno+1,s);
        !           147: }
        !           148: 
        !           149: gc()   /* get a character */
        !           150: {
        !           151: int i,j;
        !           152: if((i=gc2())!='/')return(i); /* not a comment */
        !           153: if((j=gc2())!='*') {
        !           154:        ug(j); /* not a comment */
        !           155:        return(i);
        !           156:        }
        !           157: /*     skip till end of comment */
        !           158: while(1) {
        !           159:        while((i=gc2())!='*') if(i==0)abt("unclosed comment");
        !           160:        if((i=gc2())=='/') return(' '); /*replace comment by blank*/
        !           161:        ug(i);
        !           162:        }
        !           163: }
        !           164: 
        !           165: gc2() /* used to be gc(): this entry doesn't strip comments */
        !           166: {
        !           167: int i,j,k;
        !           168: char *temp; /* buffer for # line */
        !           169: char outtemp[16]; /* buffer for # number on line numbers */
        !           170: static int newline 1; /* if 1, next char starts a new line. check for # */
        !           171: if(ugbp==0) {
        !           172: gc2top:        if(ibp>=N) {
        !           173:                j=read(ifp,&ib,N);
        !           174:                if(j<0)j=0;
        !           175:                for(i=j; i<N; i++) ib[i]=0;
        !           176:                ibp=0;
        !           177:                }
        !           178:        if(newline) {   /* check for # line to skip */
        !           179:                newline=0;
        !           180:                if(sharptext[0]) { /* toss out # n file if ever seen # */
        !           181:                        for(k=0; outtemp[k]="# "[k]; k++);
        !           182:                        outtemp[i=k+5]=0; /* convert 5 digits */
        !           183:                        j=inputno-sharpn0+sharpn1;
        !           184:                        while(j) {
        !           185:                                outtemp[--i]=j%10+'0';
        !           186:                                j=/10;
        !           187:                                }
        !           188:                        while(outtemp[k++]=outtemp[i++]);
        !           189:                        outtemp[k-1]='\n';
        !           190:                        write(ofp,outtemp,k);
        !           191:                        }
        !           192:                if(ib[ibp]=='#') {
        !           193:                        temp=getq(SHARPBUFL-HEADLEN); /* get buffer for line */
        !           194:                        for(i=0; i<SHARPBUFL;) {
        !           195:                                if((temp[i++]=gc2())=='\n')break;
        !           196:                                }
        !           197:                        write(ofp,temp,i);
        !           198:                        sharpn0=inputno;
        !           199:                        j=1; while(temp[j]==' ')j++;
        !           200:                        if(temp[j]=='\n')goto skipx;
        !           201:                        sharpn1=0;
        !           202:                        while(temp[j]>='0'&&temp[j]<='9')sharpn1=sharpn1*10
        !           203:                                                        +temp[j++]-'0';
        !           204:                        while(temp[j]==' ')j++;
        !           205:                        if(temp[j]=='\n')goto skipx;
        !           206:                        i=0;
        !           207:                        while(temp[j]!='\n'&&i<SHARPLEN-1)
        !           208:                                sharptext[i++]=temp[j++];
        !           209:                        sharptext[i]=0;
        !           210:                skipx:
        !           211:                        free(temp);
        !           212:                        goto gc2top;
        !           213:                        }
        !           214:                }
        !           215:        inputno=+newline=ib[ibp]=='\n'; /* ha! */
        !           216:        while((j=ib[ibp++])=='\\') {
        !           217:                if((i=gc())!='\n') {
        !           218:                        ug(i);
        !           219:                        return('\\');
        !           220:                        }
        !           221:                }
        !           222:        return(j);
        !           223:        }
        !           224: return(ugb[ugbp--]);
        !           225: }
        !           226: 
        !           227: ug(c)  /* unget a character */
        !           228: int c;
        !           229: {
        !           230: ugb[++ugbp]=c;
        !           231: if(ugbp>=N-1)abt("unget buffer overflow");
        !           232: return(c);
        !           233: }
        !           234: 
        !           235: 
        !           236: outq(op)
        !           237: struct obj *op;
        !           238: {
        !           239: int i,j,k;
        !           240: int c;
        !           241: char *s;
        !           242: k=op->size;
        !           243: s=op->text;
        !           244:        for(i=0; i<k; i++) {
        !           245:                c= *s++;
        !           246:                ob[obp++]=c;
        !           247:                if(c=='\n') flushout();
        !           248:                lpos=+ c!=MARK;
        !           249:                if(lpos>ON||obp>=OB) partial();
        !           250:                }
        !           251: }
        !           252: 
        !           253: flushout()
        !           254: {
        !           255: int i,j,k;
        !           256: if(obp<=0)return(0);
        !           257: for(i=j=0; i<obp; i++) {
        !           258:        if(ob[i]!=MARK)ob[j++]=ob[i];
        !           259:        }
        !           260: if(j==0)ob[j++]='\n';
        !           261: if(ob[j-1]!='\n')ob[j++]='\n';
        !           262: if(write(ofp,ob,j)<=0) {
        !           263:        obp=0;
        !           264:        abt("write error");
        !           265:        }
        !           266: lpos=obp=0;
        !           267: }
        !           268: 
        !           269: partial()
        !           270: {
        !           271: int i,j,k,l;
        !           272: for(i=j=k=0; i<obp; i++) {
        !           273:        if(ob[i]==MARK) {
        !           274:                if(k<ON) j=i;
        !           275:                }
        !           276:        else k++;
        !           277:        }
        !           278: if(j==0) {
        !           279:        l=obp;
        !           280:        for(i=ON; i>0; --i)if(ob[i-1]!='\\')break;
        !           281:        if(i==0)abt("funny line in 'partial()'");
        !           282:        k=ob[i];
        !           283:        j=ob[i+1];
        !           284:        ob[i]='\\';
        !           285:        ob[i+1]='\n';
        !           286:        obp=i+2;
        !           287:        flushout();
        !           288:        obp=l;
        !           289:        ob[i]=k;
        !           290:        ob[i+1]=j;
        !           291:        for(j=lpos=0; i<l; i++) {
        !           292:                lpos=+ (ob[j++]=ob[i])!=MARK;
        !           293:                }
        !           294:        obp=j;
        !           295:        return(0);
        !           296:        }
        !           297: else {
        !           298:        ob[j++]='\n';
        !           299:        l=obp;
        !           300:        obp=j;
        !           301:        flushout();
        !           302:        for(i=lpos=0; j<l; j++) {
        !           303:                lpos=+ (ob[i++]=ob[j])!=MARK;
        !           304:                }
        !           305:        obp=i;
        !           306:        return(0);
        !           307:        }
        !           308: }
        !           309: static printif() {
        !           310: if(sharptext[0]==0)return;
        !           311: printf("%s line %d & ",sharptext,inputno-sharpn0+sharpn1);
        !           312: }

unix.superglobalmegacorp.com

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