1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* scanner.h */ |
4 | /* */ |
5 | /* Configuration file scanner for the da65 disassembler */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 2000-2011, 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 | /*****************************************************************************/ |
42 | /* Data */ |
43 | /*****************************************************************************/ |
44 | |
45 | |
46 | |
47 | /* Info file tokens */ |
48 | typedef enum token_t { |
49 | INFOTOK_NONE, |
50 | INFOTOK_INTCON, |
51 | INFOTOK_STRCON, |
52 | INFOTOK_CHARCON, |
53 | INFOTOK_IDENT, |
54 | INFOTOK_LCURLY, |
55 | INFOTOK_RCURLY, |
56 | INFOTOK_SEMI, |
57 | INFOTOK_COMMA, |
58 | INFOTOK_EQ, |
59 | INFOTOK_COLON, |
60 | INFOTOK_DOT, |
61 | INFOTOK_EOF, |
62 | |
63 | /* Special tokens */ |
64 | INFOTOK_GLOBAL, |
65 | INFOTOK_RANGE, |
66 | INFOTOK_LABEL, |
67 | INFOTOK_ASMINC, |
68 | INFOTOK_SEGMENT, |
69 | |
70 | /* Global section */ |
71 | INFOTOK_ARGUMENT_COLUMN, |
72 | INFOTOK_COMMENT_COLUMN, |
73 | , |
74 | INFOTOK_CPU, |
75 | INFOTOK_HEXOFFS, |
76 | INFOTOK_INPUTNAME, |
77 | INFOTOK_INPUTOFFS, |
78 | INFOTOK_INPUTSIZE, |
79 | INFOTOK_LABELBREAK, |
80 | INFOTOK_MNEMONIC_COLUMN, |
81 | INFOTOK_NL_AFTER_JMP, |
82 | INFOTOK_NL_AFTER_RTS, |
83 | INFOTOK_OUTPUTNAME, |
84 | INFOTOK_PAGELENGTH, |
85 | INFOTOK_STARTADDR, |
86 | INFOTOK_TEXT_COLUMN, |
87 | |
88 | /* Range section */ |
89 | INFOTOK_START, |
90 | INFOTOK_END, |
91 | INFOTOK_TYPE, |
92 | |
93 | INFOTOK_CODE, |
94 | INFOTOK_BYTETAB, |
95 | INFOTOK_DBYTETAB, |
96 | INFOTOK_WORDTAB, |
97 | INFOTOK_DWORDTAB, |
98 | INFOTOK_ADDRTAB, |
99 | INFOTOK_RTSTAB, |
100 | INFOTOK_TEXTTAB, |
101 | INFOTOK_SKIP, |
102 | |
103 | /* Label section */ |
104 | INFOTOK_NAME, |
105 | , |
106 | INFOTOK_ADDR, |
107 | INFOTOK_SIZE, |
108 | INFOTOK_PARAMSIZE, |
109 | |
110 | /* ASMINC section */ |
111 | INFOTOK_FILE, |
112 | , |
113 | INFOTOK_IGNOREUNKNOWN, |
114 | |
115 | /* */ |
116 | INFOTOK_TRUE, |
117 | INFOTOK_FALSE |
118 | } token_t; |
119 | |
120 | |
121 | /* Mapping table entry, special identifier --> token */ |
122 | typedef struct IdentTok IdentTok; |
123 | struct IdentTok { |
124 | const char* Ident; /* Identifier */ |
125 | token_t Tok; /* Token for identifier */ |
126 | }; |
127 | #define ENTRY_COUNT(s) (sizeof (s) / sizeof (s [0])) |
128 | |
129 | |
130 | |
131 | /* Current token and attributes */ |
132 | #define CFG_MAX_IDENT_LEN 255 |
133 | extern unsigned InfoTok; |
134 | extern char InfoSVal[CFG_MAX_IDENT_LEN+1]; |
135 | extern long InfoIVal; |
136 | |
137 | /* Error location */ |
138 | extern unsigned InfoErrorLine; |
139 | extern unsigned InfoErrorCol; |
140 | |
141 | |
142 | |
143 | /*****************************************************************************/ |
144 | /* Code */ |
145 | /*****************************************************************************/ |
146 | |
147 | |
148 | |
149 | void InfoWarning (const char* Format, ...); |
150 | /* Print a warning message adding file name and line number of the config file */ |
151 | |
152 | void InfoError (const char* Format, ...); |
153 | /* Print an error message adding file name and line number of the config file */ |
154 | |
155 | void InfoNextTok (void); |
156 | /* Read the next token from the input stream */ |
157 | |
158 | void InfoConsume (unsigned T, const char* Msg); |
159 | /* Skip a token, print an error message if not found */ |
160 | |
161 | void InfoConsumeLCurly (void); |
162 | /* Consume a left curly brace */ |
163 | |
164 | void InfoConsumeRCurly (void); |
165 | /* Consume a right curly brace */ |
166 | |
167 | void InfoConsumeSemi (void); |
168 | /* Consume a semicolon */ |
169 | |
170 | void InfoConsumeColon (void); |
171 | /* Consume a colon */ |
172 | |
173 | void InfoOptionalComma (void); |
174 | /* Consume a comma if there is one */ |
175 | |
176 | void InfoOptionalAssign (void); |
177 | /* Consume an equal sign if there is one */ |
178 | |
179 | void InfoAssureInt (void); |
180 | /* Make sure the next token is an integer */ |
181 | |
182 | void InfoAssureStr (void); |
183 | /* Make sure the next token is a string constant */ |
184 | |
185 | void InfoAssureChar (void); |
186 | /* Make sure the next token is a char constant */ |
187 | |
188 | void InfoAssureIdent (void); |
189 | /* Make sure the next token is an identifier */ |
190 | |
191 | void InfoRangeCheck (long Lo, long Hi); |
192 | /* Check the range of InfoIVal */ |
193 | |
194 | void InfoSpecialToken (const IdentTok* Table, unsigned Size, const char* Name); |
195 | /* Map an identifier to one of the special tokens in the table */ |
196 | |
197 | void InfoBoolToken (void); |
198 | /* Map an identifier or integer to a boolean token */ |
199 | |
200 | void InfoSetName (const char* Name); |
201 | /* Set a name for a config file */ |
202 | |
203 | const char* InfoGetName (void); |
204 | /* Get the name of the config file */ |
205 | |
206 | int InfoAvail (); |
207 | /* Return true if we have an info file given */ |
208 | |
209 | void InfoOpenInput (void); |
210 | /* Open the input file if we have one */ |
211 | |
212 | void InfoCloseInput (void); |
213 | /* Close the input file if we have one */ |
214 | |
215 | |
216 | |
217 | /* End of scanner.h */ |
218 | |
219 | #endif |
220 | |