BSD 4 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Sun, 6 Apr 1980 16:14:31 +0000 (08:14 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Sun, 6 Apr 1980 16:14:31 +0000 (08:14 -0800)
Work on file usr/src/cmd/pcc/VMS/filter.c

Synthesized-from: CSRG//cd1/4.0

usr/src/cmd/pcc/VMS/filter.c [new file with mode: 0644]

diff --git a/usr/src/cmd/pcc/VMS/filter.c b/usr/src/cmd/pcc/VMS/filter.c
new file mode 100644 (file)
index 0000000..e634a17
--- /dev/null
@@ -0,0 +1,302 @@
+#include <stdio.h>
+#include "as.yh"
+#define NCPS 24
+#define LIBNAME "      .LIBRARY        /DB0:[C]JEQL.MLB/\n"
+#define TRUE 1
+#define FALSE 0
+#define clearl()       (*strpnt=0,fputs(strbuf,stdout),strpnt=strbuf)
+FILE   *tmpfil;
+FILE   *relfil;
+FILE   *txtfil;
+char   yytext[NCPS+2];
+char   sname[8];
+char   strbuf[512];
+char   *strpnt = strbuf;
+int    pending;
+int    index;
+int    lineno;
+int    curval;
+int    skipspace;
+int    coffset;
+int    yylval;
+long   intval;
+int    anyerrs;
+int    sawname;
+int    saveit;
+/*define yylex() (fprintf(stderr,"yylex returns %d\n",saveit=oyylex()),saveit)*/
+#define yylex() oyylex()
+
+main(argc,argv)
+register char **argv;
+{
+       int nameflag = 0;char namebuf[16]; register int i;
+       if(--argc>0) {
+               freopen(*++argv,"r",stdin);
+               nameflag = 1;
+       }
+       if(--argc>0)
+               freopen(argv[1],"w",stdout);
+       if(nameflag) {
+               register char *base = *argv;
+
+               while(*base++);                         /* Find end */
+               while(--base>=*argv && *base!='/');     /* find last slash */
+               base++;                                 /* set base */
+               for(i = 0; i < 16 && base[i] && base[i]!='.';)
+                       namebuf[i++]=((base[i] >= 'a' && base[i] <= 'z')
+                                       ? (base[i] + 'A' -'a') : base[i]);
+                       namebuf[i] = 0;
+               printf("\t.TITLE\t%s\n",namebuf);
+               printf(LIBNAME);
+       }
+
+
+loop:
+       for(;;)  {
+               i = yylex();
+       again:
+               switch(i) {
+
+               case NL:
+                       clearl();
+                       break;
+
+               case NAME:
+                       sawname = 1;
+                       break;
+
+               case CM: case SP:
+                       sawname = 0;
+                       
+               case LP:
+                       fixlength();
+                       break;
+
+               case 0:
+                       goto done;
+               
+               }
+       }
+done:  printf("        .END\n");
+}
+
+fixlength(){
+       register char *cp = strpnt;
+       if(sawname==0) return;
+       while(*--cp != ' ' && *cp != '\t' && *cp != ',' && *cp!='@') {
+               cp[2] = *cp;
+               if(cp <= strbuf) yyerror("Bad ( construction");
+       }
+       cp++;
+       *cp++ = 'L';
+       *cp++ = '^';
+       strpnt += 2;
+}
+
+static long mask[] = {
+0xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8, 
+0xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80, 
+0xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800, 
+0xfffff000, 0xffffe000, 0xffffc000, 0xffff8000, 
+0xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000, 
+0xfff00000, 0xffe00000, 0xffc00000, 0xff800000, 
+0xff000000, 0xfe000000, 0xfc000000, 0xf8000000, 
+0xf0000000, 0xe0000000, 0xc0000000, 0x80000000,
+};
+
+short type[] = {
+       EOF,
+       SP,     0,      0,      0,      0,      0,      0,      0,
+       0,      SP,     NL,     0,      0,      SP,     0,      0,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       0,      0,      0,      0,      0,      0,      0,      0,
+       SP,     0,      0,      SH,     LITOP,  REG,    AND,    SQ,
+       LP,     RP,     MUL,    PLUS,   CM,     MINUS,  ALPH,   DIV,
+       DIG,    DIG,    DIG,    DIG,    DIG,    DIG,    DIG,    DIG,
+       DIG,    DIG,    COLON,  SEMI,   LSH,    0,      RSH,    0,
+       0,      ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   LB,     0,      RB,     XOR,    ALPH,
+       0,      ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,   ALPH,
+       ALPH,   ALPH,   ALPH,   0,      IOR,    0,      TILDE,  0,
+};
+
+oyylex()
+{
+       register val;
+       register base;
+       register char *cp;
+       struct symtab *op;
+       static double fltval;
+       char fltchr[64];
+       int minflag = FALSE;
+
+loop:
+       switch(yylval = (type+1)[val = getchar()]) {
+
+       case SH:
+               copy(';');
+               while ((val = getchar()) != '\n' && val>0)
+                       copy(val);
+               copy(val);
+               val = NL;
+               goto ret;
+
+
+       case EOF:
+               val = 0;
+               goto ret;
+
+       case ALPH:
+               cp = yytext;
+               if(val=='_') val = getchar();
+               do {
+                       if (cp <= &yytext[NCPS])
+                               *cp++ = val;
+                               copy(val);
+               } while ((type+1)[val=getchar()]==ALPH || (type+1)[val]==DIG 
+                               || (type+1)[val]==LITOP);
+               *cp = '\0';
+               if(skipspace)
+                       for(;(type+1)[val]==SP; val = getchar())
+                               copy(val);
+               ungetc(val, stdin);
+               if(*yytext!='.')
+                       return(val=NAME);
+               else if(strcmp(yytext,".byte")==0)
+                       return(IBYTE);
+               else if(strcmp(yytext,".word")==0)
+                       return(IWORD);
+               else if(strcmp(yytext,".long")==0)
+                       return(ILONG);
+               else
+                       return(NAME);
+
+       case MINUS:
+               copy(val);
+               switch ((type+1)[val = getchar()]) {
+               case LP:
+                       copy(val);
+                       return(val = MP);
+               case DIG:
+                       break;
+               default:
+                       ungetc(val,stdin);
+                       return(val = MINUS);
+               }
+               minflag = TRUE;
+       case DIG:
+               intval = val-'0';
+               if (val=='0') {
+                       val = getchar();
+                       if (val=='x' || val=='X') {
+                               base = 16;
+                               copy('^');
+                               copy('X');
+                       } else if (val=='d' || val=='D' || val=='f' || val=='F') {
+                               char *p = fltchr;
+                               double atof();
+                               while (p < &fltchr[63] && ((val=getchar())=='.'
+                                || val=='e' || val=='d' || val=='E' || val=='D'
+                                || val=='-' || val=='+' || (type+1)[val]==DIG))
+                                       copy(val),*p++ = val;
+                               ungetc(val, stdin);
+                               *p++ = '\0';
+                               fltval = atof(fltchr);
+                               val = FLTNUM;
+                               goto ret;
+                       } else {
+                               ungetc(val, stdin);
+                               base = 8;
+                               if((type+1)[val]!=DIG) {
+                                       copy('0');
+                                       val = INT;
+                                       yylval = 0;
+                                       goto ret;
+                               }
+                               copy('^');
+                               copy('O');
+                       }
+               } else
+                       copy(val),base = 10;
+               while ((type+1)[val=getchar()]==DIG
+                   || (base==16 && (val>='a' && val<='f'||val>='A' && val<='F'))) {
+                       copy(val);
+                       if (base==8)
+                               intval <<= 3;
+                       else if (base==10)
+                               intval *= 10;
+                       else
+                               intval <<= 4;
+                       if (val>='a' && val<='f')
+                               val -= 'a' - 10 - '0';
+                       else if (val>='A' && val<='F')
+                               val -= 'A' - 10 - '0';
+                       intval += val-'0';
+               }
+               ungetc(val, stdin);
+               val = INT;
+               if(minflag) intval = -intval;
+               goto ret;
+
+
+       case MUL:
+               copy('@');
+               goto ret;
+       
+       case LITOP:
+               copy('#');
+               goto ret;
+       
+       case SQ:
+               if ((yylval = getchar()) == '\n')
+                       lineno++;
+               intval = yylval;
+               sprintf(strpnt,"%d",intval);
+               for(;(strpnt<&strbuf[512])&& *strpnt; strpnt++);
+               val = INT;
+               goto ret;
+
+       case 0:
+               yyerror("Illegal character");
+               val = NOCHAR;
+               goto ret;
+
+       case SP:
+               if(skipspace) {
+                       copy(val);
+                       goto loop;
+               }
+
+       default:
+               copy(val);
+               val = yylval;
+               goto ret;
+       }
+ret:
+       return(val);
+}
+
+yyerror(s, a)
+char *s;
+{
+       if (anyerrs==0)
+               fprintf(stderr, "Assembler:\n");
+       anyerrs++;
+       fprintf(stderr, "line %d: ", lineno);
+       fprintf(stderr, s, a);
+       fprintf(stderr, "\n");
+}
+
+copy(p)
+register p;
+{      
+       if(p>='a'&&p<='z')
+               p += 'A' - 'a';
+       if(strpnt<strbuf+512)
+               *strpnt++=(p);
+       return(p);
+}