|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.