Remove a few more warnings.
[suif.git] / src / basesuif / snoot / input.cc
blobbece41993539b8319fde0c02e065fc7078d1a8ab
1 /* file "input.cc" */
3 /* Copyright (c) 1994 Stanford University
5 All rights reserved.
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 */
14 #include "c.h"
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];
34 lineno = 0;
35 file = NULL;
36 bsize = -1;
37 infp = fp;
38 nextline();
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)
47 *limit = '\n';
48 bsize = 0;
51 /* fillbuf - fill the input buffer, moving tail portion if necessary */
52 void fillbuf(void)
54 if (bsize == 0)
55 return;
56 if (limit <= cp)
58 cp = &buffer[MAXTOKEN + 1];
60 else /* move tail portion */
62 int n = limit - cp;
63 unsigned char *s = &buffer[MAXTOKEN + 1] - n;
64 assert(s >= buffer);
65 line = (char *)s - ((char *)cp - line);
66 while (cp < limit)
67 *s++ = *cp++;
68 cp = &buffer[MAXTOKEN + 1] - n;
70 bsize = fread(&buffer[MAXTOKEN + 1], sizeof(unsigned char), BUFSIZE, infp);
71 assert(bsize >= 0);
72 limit = &buffer[MAXTOKEN + 1 + bsize];
73 *limit = '\n';
76 /* nextline - prepare to read next line */
77 void nextline(void)
79 if (cp >= limit) /* refill buffer */
81 fillbuf();
82 if (cp >= limit) /* signal end of file */
84 cp = limit = &buffer[MAXTOKEN+1];
85 *limit = '\0';
87 if (lineno > 0)
88 return;
90 lineno++;
91 for (line = (char *)cp; *cp == ' ' || *cp == '\t'; cp++)
93 if (*cp == '#')
95 resynch();
96 nextline();
100 /* pragma - handle #pragma */
101 static void pragma(void)
103 while ((*cp == ' ') || (*cp == '\t'))
104 cp++;
105 if ((*cp == '\n') || (*cp == 0))
106 return;
108 concat_strings = FALSE;
110 t = gettok();
112 const char *annote_name;
113 if ((t == ID) && (strcmp(token, "suif_annote") == 0))
115 while ((*cp == ' ') || (*cp == '\t'))
116 cp++;
117 if ((*cp == '\n') || (*cp == 0))
119 warning("bad suif annote -- missing name; ignored\n");
120 concat_strings = TRUE;
121 return;
123 t = gettok();
124 if (t != SCON)
126 warning("bad suif annote -- invalid name; ignored\n");
127 while ((*cp != '\n') && (*cp != 0))
128 cp++;
129 concat_strings = TRUE;
130 return;
132 annote_name = lexicon->enter(tsym->u.c.v.p)->sp;
133 while ((*cp == ' ') || (*cp == '\t'))
134 cp++;
135 if ((*cp != '\n') && (*cp != 0))
136 t = gettok();
138 else
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);)
153 if (t == EOI)
154 break;
155 switch (t)
157 case FCON:
158 new_annote->append(immed_and_type_for_C_floatconst(token,
159 NULL));
160 break;
161 case ICON:
163 immed the_immed;
164 if (*token == '\'')
165 the_immed = immed(tsym->u.c.v.i);
166 else
167 the_immed = immed_and_type_for_C_intconst(token, NULL);
168 new_annote->append(the_immed);
169 break;
171 case SCON:
172 new_annote->append(immed(tsym->u.c.v.p));
173 break;
174 case ID:
175 if ((tsym != NULL) && (tsym->suif_symbol != NULL))
177 new_annote->append(immed(tsym->suif_symbol));
178 break;
180 else
182 new_annote->append(immed(token));
183 break;
185 default:
186 new_annote->append(immed(stringf("%k", t)));
187 break;
189 while ((*cp == ' ') || (*cp == '\t'))
190 cp++;
191 if ((*cp == '\n') || (*cp == 0))
192 break;
193 t = gettok();
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));
202 else
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'); )
213 cp++;
214 if (limit - cp < MAXTOKEN)
215 fillbuf();
216 if (strncmp((char *)cp, "pragma", 6) == 0)
218 cp += 6;
219 pragma();
221 else if ((*cp >= '0') && (*cp <= '9'))
223 line:
224 for (lineno = 0; (*cp >= '0') && (*cp <= '9'); )
225 lineno = 10*lineno + *cp++ - '0';
226 lineno--;
227 while ((*cp == ' ') || (*cp == '\t'))
228 cp++;
229 if (*cp == '"')
231 file = (char *)++cp;
232 while ((*cp != 0) && (*cp != '"') && (*cp != '\n'))
233 cp++;
234 if (cp == limit)
236 char buf[MAXLINE], *s = buf;
237 while (file < (char *)cp)
238 *s++ = *file++;
239 while (cp == limit && *cp)
241 cp++;
242 nextline();
243 for (; (*cp != 0) && (*cp != '"') && (*cp != '\n'); cp++)
245 if (s < &buf[sizeof buf])
246 *s++ = *cp;
249 file = stringn(buf, s - buf);
250 if (s == &buf[sizeof buf])
251 warning("file name is too long\n");
253 else
255 file = stringn(file, (char *)cp - file);
257 if (*cp == '\n')
258 warning("missing \" in preprocessor line\n");
259 if (firstfile == NULL)
260 firstfile = file;
263 else if (strncmp((char *)cp, "line", 4) == 0)
265 for (cp += 4; (*cp == ' ') || (*cp == '\t'); )
266 cp++;
267 if ((*cp >= '0') && (*cp <= '9'))
268 goto line;
269 if (Aflag >= 2)
270 warning("unrecognized control line\n");
272 else if ((Aflag >= 2) && (*cp != '\n'))
274 warning("unrecognized control line\n");
276 while (*cp)
278 if (*cp++ == '\n')
280 if (cp == limit + 1)
281 nextline();
282 else
283 break;