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;