Mercurial > hg > CbC > CbC_gcc
comparison gcc/scan.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Utility functions for scan-decls and fix-header programs. | |
2 Copyright (C) 1993, 1994, 1998, 2002, 2003, 2007, 2008 | |
3 Free Software Foundation, Inc. | |
4 | |
5 This program is free software; you can redistribute it and/or modify it | |
6 under the terms of the GNU General Public License as published by the | |
7 Free Software Foundation; either version 3, or (at your option) any | |
8 later version. | |
9 | |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with this program; see the file COPYING3. If not see | |
17 <http://www.gnu.org/licenses/>. */ | |
18 | |
19 #include "bconfig.h" | |
20 #include "system.h" | |
21 #include "coretypes.h" | |
22 #include "tm.h" | |
23 #include "scan.h" | |
24 | |
25 int lineno = 1; | |
26 int source_lineno = 1; | |
27 sstring source_filename; | |
28 | |
29 void | |
30 make_sstring_space (sstring *str, int count) | |
31 { | |
32 int cur_pos = str->ptr - str->base; | |
33 int cur_size = str->limit - str->base; | |
34 int new_size = cur_pos + count + 100; | |
35 | |
36 if (new_size <= cur_size) | |
37 return; | |
38 | |
39 str->base = (char *) xrealloc (str->base, new_size); | |
40 str->ptr = str->base + cur_size; | |
41 str->limit = str->base + new_size; | |
42 } | |
43 | |
44 void | |
45 sstring_append (sstring *dst, sstring *src) | |
46 { | |
47 char *d, *s; | |
48 int count = SSTRING_LENGTH (src); | |
49 | |
50 MAKE_SSTRING_SPACE (dst, count + 1); | |
51 d = dst->ptr; | |
52 s = src->base; | |
53 while (--count >= 0) *d++ = *s++; | |
54 dst->ptr = d; | |
55 *d = 0; | |
56 } | |
57 | |
58 int | |
59 scan_ident (FILE *fp, sstring *s, int c) | |
60 { | |
61 s->ptr = s->base; | |
62 if (ISIDST (c)) | |
63 { | |
64 for (;;) | |
65 { | |
66 SSTRING_PUT (s, c); | |
67 c = getc (fp); | |
68 if (c == EOF || ! ISIDNUM (c)) | |
69 break; | |
70 } | |
71 } | |
72 MAKE_SSTRING_SPACE (s, 1); | |
73 *s->ptr = 0; | |
74 return c; | |
75 } | |
76 | |
77 int | |
78 scan_string (FILE *fp, sstring *s, int init) | |
79 { | |
80 int c; | |
81 | |
82 for (;;) | |
83 { | |
84 c = getc (fp); | |
85 if (c == EOF || c == '\n') | |
86 break; | |
87 if (c == init) | |
88 { | |
89 c = getc (fp); | |
90 break; | |
91 } | |
92 if (c == '\\') | |
93 { | |
94 c = getc (fp); | |
95 if (c == EOF) | |
96 break; | |
97 if (c == '\n') | |
98 continue; | |
99 } | |
100 SSTRING_PUT (s, c); | |
101 } | |
102 MAKE_SSTRING_SPACE (s, 1); | |
103 *s->ptr = 0; | |
104 return c; | |
105 } | |
106 | |
107 /* Skip horizontal white spaces (spaces, tabs, and C-style comments). */ | |
108 | |
109 int | |
110 skip_spaces (FILE *fp, int c) | |
111 { | |
112 for (;;) | |
113 { | |
114 if (c == ' ' || c == '\t') | |
115 c = getc (fp); | |
116 else if (c == '/') | |
117 { | |
118 c = getc (fp); | |
119 if (c != '*') | |
120 { | |
121 ungetc (c, fp); | |
122 return '/'; | |
123 } | |
124 c = getc (fp); | |
125 for (;;) | |
126 { | |
127 if (c == EOF) | |
128 return EOF; | |
129 else if (c != '*') | |
130 { | |
131 if (c == '\n') | |
132 source_lineno++, lineno++; | |
133 c = getc (fp); | |
134 } | |
135 else if ((c = getc (fp)) == '/') | |
136 return getc (fp); | |
137 } | |
138 } | |
139 else | |
140 break; | |
141 } | |
142 return c; | |
143 } | |
144 | |
145 int | |
146 read_upto (FILE *fp, sstring *str, int delim) | |
147 { | |
148 int ch; | |
149 | |
150 for (;;) | |
151 { | |
152 ch = getc (fp); | |
153 if (ch == EOF || ch == delim) | |
154 break; | |
155 SSTRING_PUT (str, ch); | |
156 } | |
157 MAKE_SSTRING_SPACE (str, 1); | |
158 *str->ptr = 0; | |
159 return ch; | |
160 } | |
161 | |
162 int | |
163 get_token (FILE *fp, sstring *s) | |
164 { | |
165 int c; | |
166 | |
167 s->ptr = s->base; | |
168 retry: | |
169 c = ' '; | |
170 c = skip_spaces (fp, c); | |
171 if (c == '\n') | |
172 { | |
173 source_lineno++; | |
174 lineno++; | |
175 goto retry; | |
176 } | |
177 if (c == '#') | |
178 { | |
179 c = get_token (fp, s); | |
180 if (c == INT_TOKEN) | |
181 { | |
182 source_lineno = atoi (s->base) - 1; /* '\n' will add 1 */ | |
183 get_token (fp, &source_filename); | |
184 } | |
185 for (;;) | |
186 { | |
187 c = getc (fp); | |
188 if (c == EOF) | |
189 return EOF; | |
190 if (c == '\n') | |
191 { | |
192 source_lineno++; | |
193 lineno++; | |
194 goto retry; | |
195 } | |
196 } | |
197 } | |
198 if (c == EOF) | |
199 return EOF; | |
200 if (ISDIGIT (c)) | |
201 { | |
202 do | |
203 { | |
204 SSTRING_PUT (s, c); | |
205 c = getc (fp); | |
206 } while (c != EOF && ISDIGIT (c)); | |
207 ungetc (c, fp); | |
208 c = INT_TOKEN; | |
209 goto done; | |
210 } | |
211 if (ISIDST (c)) | |
212 { | |
213 c = scan_ident (fp, s, c); | |
214 ungetc (c, fp); | |
215 return IDENTIFIER_TOKEN; | |
216 } | |
217 if (c == '\'' || c == '"') | |
218 { | |
219 c = scan_string (fp, s, c); | |
220 ungetc (c, fp); | |
221 return c == '\'' ? CHAR_TOKEN : STRING_TOKEN; | |
222 } | |
223 SSTRING_PUT (s, c); | |
224 done: | |
225 MAKE_SSTRING_SPACE (s, 1); | |
226 *s->ptr = 0; | |
227 return c; | |
228 } | |
229 | |
230 unsigned int | |
231 hashstr (const char *str, unsigned int len) | |
232 { | |
233 unsigned int n = len; | |
234 unsigned int r = 0; | |
235 const unsigned char *s = (const unsigned char *) str; | |
236 | |
237 do | |
238 r = r * 67 + (*s++ - 113); | |
239 while (--n); | |
240 return r + len; | |
241 } |