1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* scanner.h */ |
4 | /* */ |
5 | /* Configuration file scanner for the ld65 linker */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 1998-2013, Ullrich von Bassewitz */ |
10 | /* Roemerstrasse 52 */ |
11 | /* D-70794 Filderstadt */ |
12 | /* EMail: uz@cc65.org */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #ifndef SCANNER_H |
37 | #define SCANNER_H |
38 | |
39 | |
40 | |
41 | /* common */ |
42 | #include "filepos.h" |
43 | #include "strbuf.h" |
44 | |
45 | |
46 | |
47 | /*****************************************************************************/ |
48 | /* Data */ |
49 | /*****************************************************************************/ |
50 | |
51 | |
52 | |
53 | /* Config file tokens */ |
54 | typedef enum { |
55 | CFGTOK_NONE, |
56 | CFGTOK_INTCON, /* Integer constant */ |
57 | CFGTOK_STRCON, /* String constant */ |
58 | CFGTOK_IDENT, /* Identifier */ |
59 | CFGTOK_PLUS, |
60 | CFGTOK_MINUS, |
61 | CFGTOK_MUL, |
62 | CFGTOK_DIV, |
63 | CFGTOK_LPAR, |
64 | CFGTOK_RPAR, |
65 | CFGTOK_LCURLY, |
66 | CFGTOK_RCURLY, |
67 | CFGTOK_SEMI, |
68 | CFGTOK_COMMA, |
69 | CFGTOK_EQ, |
70 | CFGTOK_COLON, |
71 | CFGTOK_DOT, |
72 | CFGTOK_EOF, |
73 | |
74 | /* Special identifiers */ |
75 | CFGTOK_MEMORY, |
76 | CFGTOK_FILES, |
77 | CFGTOK_SEGMENTS, |
78 | CFGTOK_FORMATS, |
79 | CFGTOK_FEATURES, |
80 | CFGTOK_SYMBOLS, |
81 | |
82 | CFGTOK_START, |
83 | CFGTOK_SIZE, |
84 | CFGTOK_TYPE, |
85 | CFGTOK_FILE, |
86 | CFGTOK_DEFINE, |
87 | CFGTOK_BANK, |
88 | CFGTOK_FILL, |
89 | CFGTOK_FILLVAL, |
90 | CFGTOK_EXPORT, |
91 | CFGTOK_IMPORT, |
92 | CFGTOK_OS, |
93 | CFGTOK_ID, |
94 | CFGTOK_VERSION, |
95 | CFGTOK_FORMAT, |
96 | CFGTOK_RUNAD, |
97 | CFGTOK_INITAD, |
98 | |
99 | CFGTOK_LOAD, |
100 | CFGTOK_RUN, |
101 | CFGTOK_ALIGN, |
102 | CFGTOK_ALIGN_LOAD, |
103 | CFGTOK_OFFSET, |
104 | CFGTOK_OPTIONAL, |
105 | |
106 | CFGTOK_RO, |
107 | CFGTOK_RW, |
108 | CFGTOK_BSS, |
109 | CFGTOK_ZP, |
110 | CFGTOK_OVERWRITE, |
111 | |
112 | CFGTOK_ATARIEXE, |
113 | CFGTOK_O65, |
114 | CFGTOK_BIN, |
115 | |
116 | CFGTOK_SMALL, |
117 | CFGTOK_LARGE, |
118 | |
119 | CFGTOK_TRUE, |
120 | CFGTOK_FALSE, |
121 | |
122 | CFGTOK_LUNIX, |
123 | CFGTOK_OSA65, |
124 | CFGTOK_CC65, |
125 | CFGTOK_OPENCBM, |
126 | |
127 | CFGTOK_CONDES, |
128 | CFGTOK_STARTADDRESS, |
129 | |
130 | CFGTOK_ADDRSIZE, |
131 | CFGTOK_VALUE, |
132 | |
133 | CFGTOK_WEAK, |
134 | |
135 | CFGTOK_ABS, |
136 | CFGTOK_FAR, |
137 | CFGTOK_LONG, |
138 | |
139 | CFGTOK_SEGMENT, |
140 | CFGTOK_LABEL, |
141 | CFGTOK_COUNT, |
142 | CFGTOK_ORDER, |
143 | |
144 | CFGTOK_CONSTRUCTOR, |
145 | CFGTOK_DESTRUCTOR, |
146 | CFGTOK_INTERRUPTOR, |
147 | |
148 | CFGTOK_DECREASING, |
149 | CFGTOK_INCREASING, |
150 | |
151 | CFGTOK_DEFAULT |
152 | |
153 | } cfgtok_t; |
154 | |
155 | |
156 | |
157 | /* Mapping table entry, special identifier --> token */ |
158 | typedef struct IdentTok IdentTok; |
159 | struct IdentTok { |
160 | const char* Ident; /* Identifier */ |
161 | cfgtok_t Tok; /* Token for identifier */ |
162 | }; |
163 | #define ENTRY_COUNT(s) (sizeof (s) / sizeof (s [0])) |
164 | |
165 | |
166 | |
167 | /* Current token and attributes */ |
168 | extern cfgtok_t CfgTok; |
169 | extern StrBuf CfgSVal; |
170 | extern unsigned long CfgIVal; |
171 | |
172 | /* Error location. PLEASE NOTE: I'm abusing the FilePos structure to some |
173 | ** degree. It is used mostly to hold a file position, where the Name member |
174 | ** is an index into the source file table of an object file. As used in config |
175 | ** file processing, the Name member is a string pool index instead. This is |
176 | ** distinguished by the object file pointer being NULL or not in the structs |
177 | ** where this is relevant. |
178 | */ |
179 | extern FilePos CfgErrorPos; |
180 | |
181 | |
182 | |
183 | /*****************************************************************************/ |
184 | /* Code */ |
185 | /*****************************************************************************/ |
186 | |
187 | |
188 | |
189 | void CfgWarning (const FilePos* Pos, const char* Format, ...) attribute((format(printf,2,3))); |
190 | /* Print a warning message adding file name and line number of the config file */ |
191 | |
192 | void CfgError (const FilePos* Pos, const char* Format, ...) attribute((format(printf,2,3))); |
193 | /* Print an error message adding file name and line number of a given file */ |
194 | |
195 | void CfgNextTok (void); |
196 | /* Read the next token from the input stream */ |
197 | |
198 | void CfgConsume (cfgtok_t T, const char* Msg); |
199 | /* Skip a token, print an error message if not found */ |
200 | |
201 | void CfgConsumeSemi (void); |
202 | /* Consume a semicolon */ |
203 | |
204 | void CfgConsumeColon (void); |
205 | /* Consume a colon */ |
206 | |
207 | void CfgOptionalComma (void); |
208 | /* Consume a comma if there is one */ |
209 | |
210 | void CfgOptionalAssign (void); |
211 | /* Consume an equal sign if there is one */ |
212 | |
213 | void CfgAssureInt (void); |
214 | /* Make sure the next token is an integer */ |
215 | |
216 | void CfgAssureStr (void); |
217 | /* Make sure the next token is a string constant */ |
218 | |
219 | void CfgAssureIdent (void); |
220 | /* Make sure the next token is an identifier */ |
221 | |
222 | void CfgRangeCheck (unsigned long Lo, unsigned long Hi); |
223 | /* Check the range of CfgIVal */ |
224 | |
225 | void CfgSpecialToken (const IdentTok* Table, unsigned Size, const char* Name); |
226 | /* Map an identifier to one of the special tokens in the table */ |
227 | |
228 | void CfgBoolToken (void); |
229 | /* Map an identifier or integer to a boolean token */ |
230 | |
231 | void CfgSetName (const char* Name); |
232 | /* Set a name for a config file */ |
233 | |
234 | int CfgAvail (void); |
235 | /* Return true if we have a configuration available */ |
236 | |
237 | void CfgOpenInput (void); |
238 | /* Open the input file if we have one */ |
239 | |
240 | void CfgCloseInput (void); |
241 | /* Close the input file if we have one */ |
242 | |
243 | |
244 | |
245 | /* End of scanner.h */ |
246 | |
247 | #endif |
248 | |