Mercurial > hg-old > index.cgi
comparison lwasm/input.c @ 332:67224d8d1024
Basic input layer works
author | lost |
---|---|
date | Tue, 02 Mar 2010 00:10:32 +0000 |
parents | 81c005b82775 |
children | 7166254491ed |
comparison
equal
deleted
inserted
replaced
331:ed3553296580 | 332:67224d8d1024 |
---|---|
82 /* onto the current file path stack */ | 82 /* onto the current file path stack */ |
83 char *dn, *dp; | 83 char *dn, *dp; |
84 int o; | 84 int o; |
85 | 85 |
86 dn = lw_strdup(fn); | 86 dn = lw_strdup(fn); |
87 dp = dn + strlen(dp); | 87 dp = dn + strlen(dn); |
88 | 88 |
89 while (--dp != dn) | 89 while (--dp != dn) |
90 { | 90 { |
91 if (*dp == '/') | 91 if (*dp == '/') |
92 break; | 92 break; |
128 char *p, *p2; | 128 char *p, *p2; |
129 | 129 |
130 t = lw_alloc(sizeof(struct input_stack)); | 130 t = lw_alloc(sizeof(struct input_stack)); |
131 t -> filespec = lw_strdup(s); | 131 t -> filespec = lw_strdup(s); |
132 | 132 |
133 for (s2 = s; *s2 && *s2 != ':'; s2++) | 133 for (s2 = s; *s2 && (*s2 != ':'); s2++) |
134 /* do nothing */ ; | 134 /* do nothing */ ; |
135 if (!s2) | 135 if (!*s2) |
136 { | 136 { |
137 t -> type = input_type_file; | 137 t -> type = input_type_file; |
138 } | 138 } |
139 else | 139 else |
140 { | 140 { |
141 char *ts; | 141 char *ts; |
142 | 142 |
143 ts = lw_strndup(s, s2 - s); | 143 ts = lw_strndup(s, s2 - s); |
144 s = s2 + 1; | 144 s = s2 + 1; |
145 | |
146 if (!strcmp(ts, "include")) | 145 if (!strcmp(ts, "include")) |
147 t -> type = input_type_include; | 146 t -> type = input_type_include; |
148 else if (!strcmp(ts, "file")) | 147 else if (!strcmp(ts, "file")) |
149 t -> type = input_type_file; | 148 t -> type = input_type_file; |
150 else | 149 else |
151 t -> type = input_type_error; | 150 t -> type = input_type_error; |
152 } | |
153 | 151 |
154 t -> next = IS; | 152 lw_free(ts); |
153 } | |
154 t -> next = as -> input_data; | |
155 as -> input_data = t; | 155 as -> input_data = t; |
156 | 156 |
157 switch (IS -> type) | 157 switch (IS -> type) |
158 { | 158 { |
159 case input_type_include: | 159 case input_type_include: |
196 } | 196 } |
197 lw_free(p2); | 197 lw_free(p2); |
198 lw_stringlist_next(as -> include_list); | 198 lw_stringlist_next(as -> include_list); |
199 } | 199 } |
200 lw_error("Cannot open include file '%s': %s", s, strerror(errno)); | 200 lw_error("Cannot open include file '%s': %s", s, strerror(errno)); |
201 | 201 |
202 case input_type_file: | 202 case input_type_file: |
203 IS -> data = fopen(s, "rb"); | 203 IS -> data = fopen(s, "rb"); |
204 | 204 |
205 if (!IS -> data) | 205 if (!IS -> data) |
206 { | 206 { |
208 } | 208 } |
209 input_pushpath(as, s); | 209 input_pushpath(as, s); |
210 return; | 210 return; |
211 } | 211 } |
212 | 212 |
213 lw_error("Cannot figure out how to open '%s'.", s); | 213 lw_error("Cannot figure out how to open '%s'.", t -> filespec); |
214 } | 214 } |
215 | 215 |
216 char *input_readline(asmstate_t *as) | 216 char *input_readline(asmstate_t *as) |
217 { | 217 { |
218 char *s; | 218 char *s; |
233 switch (IS -> type) | 233 switch (IS -> type) |
234 { | 234 { |
235 case input_type_file: | 235 case input_type_file: |
236 case input_type_include: | 236 case input_type_include: |
237 /* read from a file */ | 237 /* read from a file */ |
238 lbloc = 0; | |
238 for (;;) | 239 for (;;) |
239 { | 240 { |
240 int c, c2; | 241 int c, c2; |
241 c = fgetc(IS -> data); | 242 c = fgetc(IS -> data); |
242 lbloc = 0; | |
243 if (c == EOF) | 243 if (c == EOF) |
244 { | 244 { |
245 if (lbloc == 0) | 245 if (lbloc == 0) |
246 { | 246 { |
247 struct input_stack *t; | 247 struct input_stack *t; |