BSD 4 development
[unix-history] / usr / src / cmd / pcc / VMS / filter.c
CommitLineData
0fe9a170
BJ
1#include <stdio.h>
2#include "as.yh"
3#define NCPS 24
4#define LIBNAME " .LIBRARY /DB0:[C]JEQL.MLB/\n"
5#define TRUE 1
6#define FALSE 0
7#define clearl() (*strpnt=0,fputs(strbuf,stdout),strpnt=strbuf)
8FILE *tmpfil;
9FILE *relfil;
10FILE *txtfil;
11char yytext[NCPS+2];
12char sname[8];
13char strbuf[512];
14char *strpnt = strbuf;
15int pending;
16int index;
17int lineno;
18int curval;
19int skipspace;
20int coffset;
21int yylval;
22long intval;
23int anyerrs;
24int sawname;
25int saveit;
26/*define yylex() (fprintf(stderr,"yylex returns %d\n",saveit=oyylex()),saveit)*/
27#define yylex() oyylex()
28
29main(argc,argv)
30register char **argv;
31{
32 int nameflag = 0;char namebuf[16]; register int i;
33 if(--argc>0) {
34 freopen(*++argv,"r",stdin);
35 nameflag = 1;
36 }
37 if(--argc>0)
38 freopen(argv[1],"w",stdout);
39 if(nameflag) {
40 register char *base = *argv;
41
42 while(*base++); /* Find end */
43 while(--base>=*argv && *base!='/'); /* find last slash */
44 base++; /* set base */
45 for(i = 0; i < 16 && base[i] && base[i]!='.';)
46 namebuf[i++]=((base[i] >= 'a' && base[i] <= 'z')
47 ? (base[i] + 'A' -'a') : base[i]);
48 namebuf[i] = 0;
49 printf("\t.TITLE\t%s\n",namebuf);
50 printf(LIBNAME);
51 }
52
53
54loop:
55 for(;;) {
56 i = yylex();
57 again:
58 switch(i) {
59
60 case NL:
61 clearl();
62 break;
63
64 case NAME:
65 sawname = 1;
66 break;
67
68 case CM: case SP:
69 sawname = 0;
70
71 case LP:
72 fixlength();
73 break;
74
75 case 0:
76 goto done;
77
78 }
79 }
80done: printf(" .END\n");
81}
82
83fixlength(){
84 register char *cp = strpnt;
85 if(sawname==0) return;
86 while(*--cp != ' ' && *cp != '\t' && *cp != ',' && *cp!='@') {
87 cp[2] = *cp;
88 if(cp <= strbuf) yyerror("Bad ( construction");
89 }
90 cp++;
91 *cp++ = 'L';
92 *cp++ = '^';
93 strpnt += 2;
94}
95
96static long mask[] = {
970xffffffff, 0xfffffffe, 0xfffffffc, 0xfffffff8,
980xfffffff0, 0xffffffe0, 0xffffffc0, 0xffffff80,
990xffffff00, 0xfffffe00, 0xfffffc00, 0xfffff800,
1000xfffff000, 0xffffe000, 0xffffc000, 0xffff8000,
1010xffff0000, 0xfffe0000, 0xfffc0000, 0xfff80000,
1020xfff00000, 0xffe00000, 0xffc00000, 0xff800000,
1030xff000000, 0xfe000000, 0xfc000000, 0xf8000000,
1040xf0000000, 0xe0000000, 0xc0000000, 0x80000000,
105};
106
107short type[] = {
108 EOF,
109 SP, 0, 0, 0, 0, 0, 0, 0,
110 0, SP, NL, 0, 0, SP, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0,
113 SP, 0, 0, SH, LITOP, REG, AND, SQ,
114 LP, RP, MUL, PLUS, CM, MINUS, ALPH, DIV,
115 DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG,
116 DIG, DIG, COLON, SEMI, LSH, 0, RSH, 0,
117 0, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
118 ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
119 ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
120 ALPH, ALPH, ALPH, LB, 0, RB, XOR, ALPH,
121 0, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
122 ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
123 ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH, ALPH,
124 ALPH, ALPH, ALPH, 0, IOR, 0, TILDE, 0,
125};
126
127oyylex()
128{
129 register val;
130 register base;
131 register char *cp;
132 struct symtab *op;
133 static double fltval;
134 char fltchr[64];
135 int minflag = FALSE;
136
137loop:
138 switch(yylval = (type+1)[val = getchar()]) {
139
140 case SH:
141 copy(';');
142 while ((val = getchar()) != '\n' && val>0)
143 copy(val);
144 copy(val);
145 val = NL;
146 goto ret;
147
148
149 case EOF:
150 val = 0;
151 goto ret;
152
153 case ALPH:
154 cp = yytext;
155 if(val=='_') val = getchar();
156 do {
157 if (cp <= &yytext[NCPS])
158 *cp++ = val;
159 copy(val);
160 } while ((type+1)[val=getchar()]==ALPH || (type+1)[val]==DIG
161 || (type+1)[val]==LITOP);
162 *cp = '\0';
163 if(skipspace)
164 for(;(type+1)[val]==SP; val = getchar())
165 copy(val);
166 ungetc(val, stdin);
167 if(*yytext!='.')
168 return(val=NAME);
169 else if(strcmp(yytext,".byte")==0)
170 return(IBYTE);
171 else if(strcmp(yytext,".word")==0)
172 return(IWORD);
173 else if(strcmp(yytext,".long")==0)
174 return(ILONG);
175 else
176 return(NAME);
177
178 case MINUS:
179 copy(val);
180 switch ((type+1)[val = getchar()]) {
181 case LP:
182 copy(val);
183 return(val = MP);
184 case DIG:
185 break;
186 default:
187 ungetc(val,stdin);
188 return(val = MINUS);
189 }
190 minflag = TRUE;
191 case DIG:
192 intval = val-'0';
193 if (val=='0') {
194 val = getchar();
195 if (val=='x' || val=='X') {
196 base = 16;
197 copy('^');
198 copy('X');
199 } else if (val=='d' || val=='D' || val=='f' || val=='F') {
200 char *p = fltchr;
201 double atof();
202 while (p < &fltchr[63] && ((val=getchar())=='.'
203 || val=='e' || val=='d' || val=='E' || val=='D'
204 || val=='-' || val=='+' || (type+1)[val]==DIG))
205 copy(val),*p++ = val;
206 ungetc(val, stdin);
207 *p++ = '\0';
208 fltval = atof(fltchr);
209 val = FLTNUM;
210 goto ret;
211 } else {
212 ungetc(val, stdin);
213 base = 8;
214 if((type+1)[val]!=DIG) {
215 copy('0');
216 val = INT;
217 yylval = 0;
218 goto ret;
219 }
220 copy('^');
221 copy('O');
222 }
223 } else
224 copy(val),base = 10;
225 while ((type+1)[val=getchar()]==DIG
226 || (base==16 && (val>='a' && val<='f'||val>='A' && val<='F'))) {
227 copy(val);
228 if (base==8)
229 intval <<= 3;
230 else if (base==10)
231 intval *= 10;
232 else
233 intval <<= 4;
234 if (val>='a' && val<='f')
235 val -= 'a' - 10 - '0';
236 else if (val>='A' && val<='F')
237 val -= 'A' - 10 - '0';
238 intval += val-'0';
239 }
240 ungetc(val, stdin);
241 val = INT;
242 if(minflag) intval = -intval;
243 goto ret;
244
245
246 case MUL:
247 copy('@');
248 goto ret;
249
250 case LITOP:
251 copy('#');
252 goto ret;
253
254 case SQ:
255 if ((yylval = getchar()) == '\n')
256 lineno++;
257 intval = yylval;
258 sprintf(strpnt,"%d",intval);
259 for(;(strpnt<&strbuf[512])&& *strpnt; strpnt++);
260 val = INT;
261 goto ret;
262
263 case 0:
264 yyerror("Illegal character");
265 val = NOCHAR;
266 goto ret;
267
268 case SP:
269 if(skipspace) {
270 copy(val);
271 goto loop;
272 }
273
274 default:
275 copy(val);
276 val = yylval;
277 goto ret;
278 }
279ret:
280 return(val);
281}
282
283yyerror(s, a)
284char *s;
285{
286 if (anyerrs==0)
287 fprintf(stderr, "Assembler:\n");
288 anyerrs++;
289 fprintf(stderr, "line %d: ", lineno);
290 fprintf(stderr, s, a);
291 fprintf(stderr, "\n");
292}
293
294copy(p)
295register p;
296{
297 if(p>='a'&&p<='z')
298 p += 'A' - 'a';
299 if(strpnt<strbuf+512)
300 *strpnt++=(p);
301 return(p);
302}