3 /* Copyright (c) 1994 Stanford University
7 This software is provided under the terms described in
8 the "suif_copyright.h" include file. */
10 #include <suif_copyright.h>
12 /* snoot input processing */
16 unsigned char *cp
; /* current input character */
17 char *file
; /* current input file name */
18 char *firstfile
; /* first input file */
19 unsigned char *limit
; /* points to last character + 1 */
20 char *line
; /* current line */
21 int lineno
; /* line number of current line */
23 static FILE *infp
; /* input file pointer */
24 static long bsize
; /* number of chars in last read */
25 static unsigned char buffer
[MAXTOKEN
+1 + BUFSIZE
+1]; /* input buffer */
27 static void pragma(void);
28 static void resynch(void);
30 /* inputInit - initialize input processing */
31 void inputInit(FILE *fp
)
33 limit
= cp
= &buffer
[MAXTOKEN
+ 1];
41 /* inputstring - arrange to read str as next input */
42 void inputstring(char *str
)
44 limit
= cp
= &buffer
[MAXTOKEN
+1];
45 while ((*limit
++ = *str
++) != 0)
51 /* fillbuf - fill the input buffer, moving tail portion if necessary */
58 cp
= &buffer
[MAXTOKEN
+ 1];
60 else /* move tail portion */
63 unsigned char *s
= &buffer
[MAXTOKEN
+ 1] - n
;
65 line
= (char *)s
- ((char *)cp
- line
);
68 cp
= &buffer
[MAXTOKEN
+ 1] - n
;
70 bsize
= fread(&buffer
[MAXTOKEN
+ 1], sizeof(unsigned char), BUFSIZE
, infp
);
72 limit
= &buffer
[MAXTOKEN
+ 1 + bsize
];
76 /* nextline - prepare to read next line */
79 if (cp
>= limit
) /* refill buffer */
82 if (cp
>= limit
) /* signal end of file */
84 cp
= limit
= &buffer
[MAXTOKEN
+1];
91 for (line
= (char *)cp
; *cp
== ' ' || *cp
== '\t'; cp
++)
100 /* pragma - handle #pragma */
101 static void pragma(void)
103 while ((*cp
== ' ') || (*cp
== '\t'))
105 if ((*cp
== '\n') || (*cp
== 0))
108 concat_strings
= FALSE
;
112 const char *annote_name
;
113 if ((t
== ID
) && (strcmp(token
, "suif_annote") == 0))
115 while ((*cp
== ' ') || (*cp
== '\t'))
117 if ((*cp
== '\n') || (*cp
== 0))
119 warning("bad suif annote -- missing name; ignored\n");
120 concat_strings
= TRUE
;
126 warning("bad suif annote -- invalid name; ignored\n");
127 while ((*cp
!= '\n') && (*cp
!= 0))
129 concat_strings
= TRUE
;
132 annote_name
= lexicon
->enter(tsym
->u
.c
.v
.p
)->sp
;
133 while ((*cp
== ' ') || (*cp
== '\t'))
135 if ((*cp
!= '\n') && (*cp
!= 0))
140 annote_name
= lexicon
->enter("C pragma")->sp
;
143 immed_list
*new_annote
= new immed_list
;
145 if (lookup_annote(annote_name
) == NULL
)
147 annote_def
*new_def
= new annote_def(annote_name
, TRUE
);
148 register_annote(new_def
);
151 for (; (*cp
!= 'n') && (*cp
!= 0);)
158 new_annote
->append(immed_and_type_for_C_floatconst(token
,
165 the_immed
= immed(tsym
->u
.c
.v
.i
);
167 the_immed
= immed_and_type_for_C_intconst(token
, NULL
);
168 new_annote
->append(the_immed
);
172 new_annote
->append(immed(tsym
->u
.c
.v
.p
));
175 if ((tsym
!= NULL
) && (tsym
->suif_symbol
!= NULL
))
177 new_annote
->append(immed(tsym
->suif_symbol
));
182 new_annote
->append(immed(token
));
186 new_annote
->append(immed(stringf("%k", t
)));
189 while ((*cp
== ' ') || (*cp
== '\t'))
191 if ((*cp
== '\n') || (*cp
== 0))
196 if (curr_list
!= NULL
)
198 in_rrr
*new_mark
= new in_rrr(io_mrk
);
199 new_mark
->append_annote(annote_name
, new_annote
);
200 curr_list
->append(new tree_instr(new_mark
));
204 outf
->append_annote(annote_name
, new_annote
);
206 concat_strings
= TRUE
;
209 /* resynch - set line number/file name in # n [ "file" ] and #pragma ... */
210 static void resynch(void)
212 for (cp
++; (*cp
== ' ') || (*cp
== '\t'); )
214 if (limit
- cp
< MAXTOKEN
)
216 if (strncmp((char *)cp
, "pragma", 6) == 0)
221 else if ((*cp
>= '0') && (*cp
<= '9'))
224 for (lineno
= 0; (*cp
>= '0') && (*cp
<= '9'); )
225 lineno
= 10*lineno
+ *cp
++ - '0';
227 while ((*cp
== ' ') || (*cp
== '\t'))
232 while ((*cp
!= 0) && (*cp
!= '"') && (*cp
!= '\n'))
236 char buf
[MAXLINE
], *s
= buf
;
237 while (file
< (char *)cp
)
239 while (cp
== limit
&& *cp
)
243 for (; (*cp
!= 0) && (*cp
!= '"') && (*cp
!= '\n'); cp
++)
245 if (s
< &buf
[sizeof buf
])
249 file
= stringn(buf
, s
- buf
);
250 if (s
== &buf
[sizeof buf
])
251 warning("file name is too long\n");
255 file
= stringn(file
, (char *)cp
- file
);
258 warning("missing \" in preprocessor line\n");
259 if (firstfile
== NULL
)
263 else if (strncmp((char *)cp
, "line", 4) == 0)
265 for (cp
+= 4; (*cp
== ' ') || (*cp
== '\t'); )
267 if ((*cp
>= '0') && (*cp
<= '9'))
270 warning("unrecognized control line\n");
272 else if ((Aflag
>= 2) && (*cp
!= '\n'))
274 warning("unrecognized control line\n");