annotate lwasm/input.c @ 384:38b50ce6967a

Made --list and --depend work
author lost@starbug
date Sat, 15 May 2010 20:46:04 -0600
parents 7166254491ed
children af5f2c51db76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
1 /*
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
2 input.c
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
3
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
4 Copyright © 2010 William Astle
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
5
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
6 This file is part of LWTOOLS.
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
7
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
11 version.
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
12
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
16 more details.
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
17
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
20 */
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
21
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
22 #include <config.h>
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
23
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
24 /*
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
25 This file is used to handle reading input files. It serves to encapsulate
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
26 the entire input system to make porting to different media and systems
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
27 less difficult.
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
28 */
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
29
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
30 #include <errno.h>
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
31 #include <stdio.h>
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
32 #include <string.h>
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
33
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
34 #include <lw_alloc.h>
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
35 #include <lw_stringlist.h>
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
36 #include <lw_string.h>
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
37 #include "lwasm.h"
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
38
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
39 /*
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
40 Data type for storing input buffers
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
41 */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
42
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
43 enum input_types_e
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
44 {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
45 input_type_file, // regular file, no search path
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
46 input_type_include, // include path, start from "local"
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
47 input_type_string, // input from a string
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
48
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
49 input_type_error // invalid input type
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
50 };
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
51
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
52 struct input_stack
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
53 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
54 struct input_stack *next;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
55 int type;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
56 void *data;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
57 int data2;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
58 char *filespec;
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
59 };
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
60
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
61 #define IS ((struct input_stack *)(as -> input_data))
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
62
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
63 void input_init(asmstate_t *as)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
64 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
65 struct input_stack *t;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
66
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
67 if (as -> file_dir)
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
68 lw_stack_destroy(as -> file_dir);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
69 as -> file_dir = lw_stack_create(lw_free);
384
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
70 as -> includelist = lw_stack_create(lw_free);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
71 lw_stringlist_reset(as -> input_files);
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
72 while (IS)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
73 {
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
74 t = IS;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
75 as -> input_data = IS -> next;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
76 lw_free(t);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
77 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
78 }
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
79
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
80 void input_pushpath(asmstate_t *as, char *fn)
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
81 {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
82 /* take apart fn into path and filename then push the path */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
83 /* onto the current file path stack */
384
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
84
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
85 /* also add it to the list of files included */
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
86 char *dn, *dp;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
87 int o;
384
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
88
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
89 dn = lw_strdup(fn);
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
90 lw_stack_push(as -> includelist, dn);
38b50ce6967a Made --list and --depend work
lost@starbug
parents: 356
diff changeset
91
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
92 dn = lw_strdup(fn);
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
93 dp = dn + strlen(dn);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
94
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
95 while (--dp != dn)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
96 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
97 if (*dp == '/')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
98 break;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
99 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
100 if (*dp == '/')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
101 *dp = '\0';
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
102
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
103 if (dp == dn)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
104 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
105 lw_free(dn);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
106 dn = lw_strdup(".");
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
107 lw_stack_push(as -> file_dir, dn);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
108 return;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
109 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
110 dp = lw_strdup(dn);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
111 lw_free(dn);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
112 lw_stack_push(as -> file_dir, dp);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
113 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
114
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
115 void input_openstring(asmstate_t *as, char *s, char *str)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
116 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
117 struct input_stack *t;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
118
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
119 t = lw_alloc(sizeof(struct input_stack));
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
120 t -> filespec = lw_strdup(s);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
121
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
122 t -> type = input_type_string;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
123 t -> data = lw_strdup(str);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
124 t -> data2 = 0;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
125 t -> next = IS;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
126 as -> input_data = t;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
127 t -> filespec = lw_strdup(s);
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
128 }
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
129
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
130 void input_open(asmstate_t *as, char *s)
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
131 {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
132 struct input_stack *t;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
133 char *s2;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
134 char *p, *p2;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
135
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
136 t = lw_alloc(sizeof(struct input_stack));
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
137 t -> filespec = lw_strdup(s);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
138
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
139 for (s2 = s; *s2 && (*s2 != ':'); s2++)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
140 /* do nothing */ ;
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
141 if (!*s2)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
142 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
143 t -> type = input_type_file;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
144 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
145 else
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
146 {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
147 char *ts;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
148
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
149 ts = lw_strndup(s, s2 - s);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
150 s = s2 + 1;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
151 if (!strcmp(ts, "include"))
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
152 t -> type = input_type_include;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
153 else if (!strcmp(ts, "file"))
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
154 t -> type = input_type_file;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
155 else
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
156 t -> type = input_type_error;
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
157
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
158 lw_free(ts);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
159 }
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
160 t -> next = as -> input_data;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
161 as -> input_data = t;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
162
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
163 switch (IS -> type)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
164 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
165 case input_type_include:
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
166 /* first check for absolute path and if so, skip path */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
167 if (*s == '/')
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
168 {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
169 /* absolute path */
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
170 IS -> data = fopen(s, "rb");
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
171 if (!IS -> data)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
172 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
173 lw_error("Cannot open file '%s': %s", s, strerror(errno));
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
174 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
175 input_pushpath(as, s);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
176 break;
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
177 }
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
178
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
179 /* relative path, check relative to "current file" directory */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
180 p = lw_stack_top(as -> file_dir);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
181 0 == asprintf(&p2, "%s/%s", p, s);
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
182 IS -> data = fopen(p2, "rb");
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
183 if (IS -> data)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
184 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
185 input_pushpath(as, p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
186 lw_free(p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
187 break;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
188 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
189 lw_free(p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
190
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
191 /* now check relative to entries in the search path */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
192 lw_stringlist_reset(as -> include_list);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
193 while (p = lw_stringlist_current(as -> include_list))
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
194 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
195 0 == asprintf(&p2, "%s/%s", p, s);
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
196 IS -> data = fopen(p2, "rb");
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
197 if (IS -> data)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
198 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
199 input_pushpath(as, p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
200 lw_free(p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
201 return;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
202 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
203 lw_free(p2);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
204 lw_stringlist_next(as -> include_list);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
205 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
206 lw_error("Cannot open include file '%s': %s", s, strerror(errno));
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
207
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
208 case input_type_file:
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
209 IS -> data = fopen(s, "rb");
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
210
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
211 if (!IS -> data)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
212 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
213 lw_error("Cannot open file '%s': %s", s, strerror(errno));
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
214 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
215 input_pushpath(as, s);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
216 return;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
217 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
218
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
219 lw_error("Cannot figure out how to open '%s'.", t -> filespec);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
220 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
221
356
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
222 FILE *input_open_standalone(asmstate_t *as, char *s)
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
223 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
224 char *s2;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
225 FILE *fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
226 char *p, *p2;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
227
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
228 /* first check for absolute path and if so, skip path */
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
229 if (*s == '/')
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
230 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
231 /* absolute path */
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
232 fp = fopen(s, "rb");
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
233 if (!fp)
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
234 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
235 return NULL;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
236 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
237 return fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
238 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
239
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
240 /* relative path, check relative to "current file" directory */
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
241 p = lw_stack_top(as -> file_dir);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
242 0 == asprintf(&p2, "%s/%s", p, s);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
243 fp = fopen(p2, "rb");
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
244 if (fp)
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
245 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
246 lw_free(p2);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
247 return fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
248 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
249 lw_free(p2);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
250
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
251 /* now check relative to entries in the search path */
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
252 lw_stringlist_reset(as -> include_list);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
253 while (p = lw_stringlist_current(as -> include_list))
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
254 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
255 0 == asprintf(&p2, "%s/%s", p, s);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
256 fp = fopen(p2, "rb");
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
257 if (fp)
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
258 {
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
259 lw_free(p2);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
260 return fp;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
261 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
262 lw_free(p2);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
263 lw_stringlist_next(as -> include_list);
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
264 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
265
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
266 return NULL;
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
267 }
7166254491ed Finished pseudo ops
lost@starbug
parents: 332
diff changeset
268
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
269 char *input_readline(asmstate_t *as)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
270 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
271 char *s;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
272 char linebuff[2049];
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
273 int lbloc;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
274 int eol = 0;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
275
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
276 /* if no file is open, open one */
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
277 nextfile:
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
278 if (!IS) {
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
279 s = lw_stringlist_current(as -> input_files);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
280 if (!s)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
281 return NULL;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
282 lw_stringlist_next(as -> input_files);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
283 input_open(as, s);
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
284 }
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
285
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
286 switch (IS -> type)
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
287 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
288 case input_type_file:
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
289 case input_type_include:
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
290 /* read from a file */
332
67224d8d1024 Basic input layer works
lost
parents: 330
diff changeset
291 lbloc = 0;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
292 for (;;)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
293 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
294 int c, c2;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
295 c = fgetc(IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
296 if (c == EOF)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
297 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
298 if (lbloc == 0)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
299 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
300 struct input_stack *t;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
301 fclose(IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
302 lw_free(lw_stack_pop(as -> file_dir));
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
303 lw_free(IS -> filespec);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
304 t = IS -> next;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
305 lw_free(IS);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
306 as -> input_data = t;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
307 goto nextfile;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
308 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
309 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
310 eol = 1;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
311 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
312 else if (c == '\r')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
313 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
314 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
315 eol = 1;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
316 c2 = fgetc(IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
317 if (c2 == EOF)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
318 c = EOF;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
319 else if (c2 != '\n')
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
320 ungetc(c2, IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
321 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
322 else if (c == '\n')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
323 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
324 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
325 eol = 1;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
326 c2 = fgetc(IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
327 if (c2 == EOF)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
328 c = EOF;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
329 else if (c2 != '\r')
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
330 ungetc(c2, IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
331 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
332 else
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
333 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
334 if (lbloc < 2048)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
335 linebuff[lbloc++] = c;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
336 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
337 if (eol)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
338 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
339 s = lw_strdup(linebuff);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
340 return s;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
341 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
342 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
343
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
344 case input_type_string:
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
345 /* read from a string */
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
346 if (((char *)(IS -> data))[IS -> data2] == '\0')
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
347 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
348 struct input_stack *t;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
349 lw_free(IS -> data);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
350 lw_free(IS -> filespec);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
351 t = IS -> next;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
352 lw_free(IS);
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
353 as -> input_data = t;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
354 goto nextfile;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
355 }
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
356 s = (char *)(IS -> data);
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
357 lbloc = 0;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
358 for (;;)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
359 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
360 int c;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
361 c = s[IS -> data2];
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
362 if (c)
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
363 IS -> data2++;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
364 if (c == '\0')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
365 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
366 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
367 eol = 1;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
368 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
369 else if (c == '\r')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
370 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
371 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
372 eol = 1;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
373 if (s[IS -> data2] == '\n')
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
374 IS -> data2++;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
375 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
376 else if (c == '\n')
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
377 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
378 linebuff[lbloc] = '\0';
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
379 eol = 1;
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
380 if (s[IS -> data2] == '\r')
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
381 IS -> data2++;
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
382 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
383 else
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
384 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
385 if (lbloc < 2048)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
386 linebuff[lbloc++] = c;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
387 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
388 if (eol)
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
389 {
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
390 s = lw_strdup(linebuff);
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
391 return s;
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
392 }
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
393 }
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
394
329
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
395 default:
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
396 lw_error("Problem reading from unknown input type");
c15cca3ae6a2 Created first pass of input layer
lost
parents: 328
diff changeset
397 }
328
591d01b343b9 checkpoint - input layer
lost
parents:
diff changeset
398 }
330
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
399
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
400 char *input_curspec(asmstate_t *as)
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
401 {
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
402 if (IS)
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
403 return IS -> filespec;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
404 return NULL;
81c005b82775 More tinkering with input subsystem
lost
parents: 329
diff changeset
405 }