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 */
48typedef 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 INFOTOK_COMMENTS,
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 INFOTOK_COMMENT,
106 INFOTOK_ADDR,
107 INFOTOK_SIZE,
108 INFOTOK_PARAMSIZE,
109
110 /* ASMINC section */
111 INFOTOK_FILE,
112 INFOTOK_COMMENTSTART,
113 INFOTOK_IGNOREUNKNOWN,
114
115 /* */
116 INFOTOK_TRUE,
117 INFOTOK_FALSE
118} token_t;
119
120
121/* Mapping table entry, special identifier --> token */
122typedef struct IdentTok IdentTok;
123struct 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
133extern unsigned InfoTok;
134extern char InfoSVal[CFG_MAX_IDENT_LEN+1];
135extern long InfoIVal;
136
137/* Error location */
138extern unsigned InfoErrorLine;
139extern unsigned InfoErrorCol;
140
141
142
143/*****************************************************************************/
144/* Code */
145/*****************************************************************************/
146
147
148
149void InfoWarning (const char* Format, ...);
150/* Print a warning message adding file name and line number of the config file */
151
152void InfoError (const char* Format, ...);
153/* Print an error message adding file name and line number of the config file */
154
155void InfoNextTok (void);
156/* Read the next token from the input stream */
157
158void InfoConsume (unsigned T, const char* Msg);
159/* Skip a token, print an error message if not found */
160
161void InfoConsumeLCurly (void);
162/* Consume a left curly brace */
163
164void InfoConsumeRCurly (void);
165/* Consume a right curly brace */
166
167void InfoConsumeSemi (void);
168/* Consume a semicolon */
169
170void InfoConsumeColon (void);
171/* Consume a colon */
172
173void InfoOptionalComma (void);
174/* Consume a comma if there is one */
175
176void InfoOptionalAssign (void);
177/* Consume an equal sign if there is one */
178
179void InfoAssureInt (void);
180/* Make sure the next token is an integer */
181
182void InfoAssureStr (void);
183/* Make sure the next token is a string constant */
184
185void InfoAssureChar (void);
186/* Make sure the next token is a char constant */
187
188void InfoAssureIdent (void);
189/* Make sure the next token is an identifier */
190
191void InfoRangeCheck (long Lo, long Hi);
192/* Check the range of InfoIVal */
193
194void InfoSpecialToken (const IdentTok* Table, unsigned Size, const char* Name);
195/* Map an identifier to one of the special tokens in the table */
196
197void InfoBoolToken (void);
198/* Map an identifier or integer to a boolean token */
199
200void InfoSetName (const char* Name);
201/* Set a name for a config file */
202
203const char* InfoGetName (void);
204/* Get the name of the config file */
205
206int InfoAvail ();
207/* Return true if we have an info file given */
208
209void InfoOpenInput (void);
210/* Open the input file if we have one */
211
212void InfoCloseInput (void);
213/* Close the input file if we have one */
214
215
216
217/* End of scanner.h */
218
219#endif
220