1 %{
2 /*---------------------------------------------------------------------------*
3   Project:  TwlSDK - tools - makelcf
4   File:     tlcf.l
5 
6   Copyright 2003-2008 Nintendo.  All rights reserved.
7 
8   These coded instructions, statements, and computer programs contain
9   proprietary information of Nintendo of America Inc. and/or Nintendo
10   Company Ltd., and are protected by Federal copyright law.  They may
11   not be disclosed to third parties or copied or duplicated in any form,
12   in whole or in part, without the prior written consent of Nintendo.
13 
14   $Date:: 2008-09-18#$
15   $Rev: 8573 $
16   $Author: okubata_ryoma $
17  *---------------------------------------------------------------------------*/
18 #include	<stdio.h>
19 #include	<string.h>
20 #include	"makelcf.h"
21 #include	"tlcf.tab.h"
22 
23 #define	RETURN(x) { debug_printf( "%s [%s]\n", #x, tlcf_yytext ); return(x); }
24 
25 BOOL  GetLoopStackLevel( void );
26 
tlcf_yyerror(const char * str)27 void  tlcf_yyerror( const char* str )
28 {
29     if ( tlcf_yytext[0] >= ' ' )
30     {
31         fprintf( stderr, "makelcf: line %d: %s \'%s\'\n", tlcf_yylineno, str, tlcf_yytext );
32     }
33     else
34     {
35         fprintf( stderr, "makelcf: line %d: %s\n", tlcf_yylineno, str );
36     }
37 }
38 
getSection(const char * default_section)39 static char* getSection( const char* default_section )
40 {
41     char*  head = NULL;
42     char*  p;
43 
44     for ( p = tlcf_yytext; *p; p ++ )
45     {
46 	switch ( *p )
47 	{
48 	case '=':
49 	case ':':
50 	    if ( !head )
51 	    {
52 		head = p;
53 	    }
54 	    break;
55 
56 	case '>':
57 	    if ( head )
58 	    {
59 	        *p = '\0';
60 		return strdup( head );
61 	    }
62 	    break;
63 
64 	default:
65 	    break;
66 	}
67     }
68     return default_section ? strdup( default_section ) : NULL;
69 }
70 
71 %}
72 st			[ \t]*
73 ed			[ \t]*\r?\n
74 sec			(=[.a-zA-Z]*)?
75 mod			(:[htre])?
76 flt			(:[f])?
77 identifier		[A-Za-z_][A-Za-z_0-9]*
78 equation		(==|!=|\.EQ\.|\.NE\.|\.GT\.|\.GE\.|\.LT\.|\.LE\.)
79 value			[^>\n]*
80 
81 STATIC_OBJ		\<STATIC\.OBJECT{sec}{mod}\>
82 F_S_OBJS		\<FOREACH\.STATIC\.OBJECTS{sec}{flt}\>
83 E_S_OBJS		\<END\.STATIC\.OBJECTS{sec}{flt}\>
84 FOR_STATIC_OBJS_1	^{st}{F_S_OBJS}{ed}
85 FOR_STATIC_OBJS_2	{F_S_OBJS}
86 END_STATIC_OBJS_1	^{st}{E_S_OBJS}{ed}
87 END_STATIC_OBJS_2	{E_S_OBJS}
88 
89 STATIC_LIB		\<STATIC\.LIBRARY{sec}{mod}\>
90 F_S_LIBS		\<FOREACH\.STATIC\.LIBRARIES{sec}{flt}\>
91 E_S_LIBS		\<END\.STATIC\.LIBRARIES{sec}{flt}\>
92 FOR_STATIC_LIBS_1	^{st}{F_S_LIBS}{ed}
93 FOR_STATIC_LIBS_2	{F_S_LIBS}
94 END_STATIC_LIBS_1	^{st}{E_S_LIBS}{ed}
95 END_STATIC_LIBS_2	{E_S_LIBS}
96 
97 STATIC_SYM		\<STATIC\.SEARCHSYMBOL\>
98 F_S_SYMS		\<FOREACH\.STATIC\.SEARCHSYMBOLS\>
99 E_S_SYMS		\<END\.STATIC\.SEARCHSYMBOLS\>
100 FOR_STATIC_SYMS_1	^{st}{F_S_SYMS}{ed}
101 FOR_STATIC_SYMS_2	{F_S_SYMS}
102 END_STATIC_SYMS_1	^{st}{E_S_SYMS}{ed}
103 END_STATIC_SYMS_2	{E_S_SYMS}
104 
105 F_ATLS			\<FOREACH\.AUTOLOADS{sec}{flt}\>
106 E_ATLS			\<END\.AUTOLOADS{sec}{flt}\>
107 FOR_AUTOLOADS_1		^{st}{F_ATLS}{ed}
108 FOR_AUTOLOADS_2		{F_ATLS}
109 END_AUTOLOADS_1		^{st}{E_ATLS}{ed}
110 END_AUTOLOADS_2		{E_ATLS}
111 
112 AUTOLOAD_OBJ		\<AUTOLOAD\.OBJECT{sec}{mod}\>
113 F_A_OBJS		\<FOREACH\.AUTOLOAD\.OBJECTS{sec}{flt}\>
114 E_A_OBJS		\<END\.AUTOLOAD\.OBJECTS{sec}{flt}\>
115 FOR_AUTOLOAD_OBJS_1	^{st}{F_A_OBJS}{ed}
116 FOR_AUTOLOAD_OBJS_2	{F_A_OBJS}
117 END_AUTOLOAD_OBJS_1	^{st}{E_A_OBJS}{ed}
118 END_AUTOLOAD_OBJS_2	{E_A_OBJS}
119 
120 AUTOLOAD_LIB		\<AUTOLOAD\.LIBRARY{sec}{mod}\>
121 F_A_LIBS		\<FOREACH\.AUTOLOAD\.LIBRARIES{sec}{flt}\>
122 E_A_LIBS		\<END\.AUTOLOAD\.LIBRARIES{sec}{flt}\>
123 FOR_AUTOLOAD_LIBS_1	^{st}{F_A_LIBS}{ed}
124 FOR_AUTOLOAD_LIBS_2	{F_A_LIBS}
125 END_AUTOLOAD_LIBS_1	^{st}{E_A_LIBS}{ed}
126 END_AUTOLOAD_LIBS_2	{E_A_LIBS}
127 
128 AUTOLOAD_SYM		\<AUTOLOAD\.SEARCHSYMBOL\>
129 F_A_SYMS		\<FOREACH\.AUTOLOAD\.SEARCHSYMBOLS\>
130 E_A_SYMS		\<END\.AUTOLOAD\.SEARCHSYMBOLS\>
131 FOR_AUTOLOAD_SYMS_1	^{st}{F_A_SYMS}{ed}
132 FOR_AUTOLOAD_SYMS_2	{F_A_SYMS}
133 END_AUTOLOAD_SYMS_1	^{st}{E_A_SYMS}{ed}
134 END_AUTOLOAD_SYMS_2	{E_A_SYMS}
135 
136 F_OVLS			\<FOREACH\.OVERLAYS{sec}{flt}\>
137 E_OVLS			\<END\.OVERLAYS{sec}{flt}\>
138 FOR_OVERLAYS_1		^{st}{F_OVLS}{ed}
139 FOR_OVERLAYS_2		{F_OVLS}
140 END_OVERLAYS_1		^{st}{E_OVLS}{ed}
141 END_OVERLAYS_2		{E_OVLS}
142 
143 OVERLAY_OBJ		\<OVERLAY\.OBJECT{sec}{mod}\>
144 F_O_OBJS		\<FOREACH\.OVERLAY\.OBJECTS{sec}{flt}\>
145 E_O_OBJS		\<END\.OVERLAY\.OBJECTS{sec}{flt}\>
146 FOR_OVERLAY_OBJS_1	^{st}{F_O_OBJS}{ed}
147 FOR_OVERLAY_OBJS_2	{F_O_OBJS}
148 END_OVERLAY_OBJS_1	^{st}{E_O_OBJS}{ed}
149 END_OVERLAY_OBJS_2	{E_O_OBJS}
150 
151 OVERLAY_LIB		\<OVERLAY\.LIBRARY{sec}{mod}\>
152 F_O_LIBS		\<FOREACH\.OVERLAY\.LIBRARIES{sec}{flt}\>
153 E_O_LIBS		\<END\.OVERLAY\.LIBRARIES{sec}{flt}\>
154 FOR_OVERLAY_LIBS_1	^{st}{F_O_LIBS}{ed}
155 FOR_OVERLAY_LIBS_2	{F_O_LIBS}
156 END_OVERLAY_LIBS_1	^{st}{E_O_LIBS}{ed}
157 END_OVERLAY_LIBS_2	{E_O_LIBS}
158 
159 OVERLAY_SYM		\<OVERLAY\.SEARCHSYMBOL\>
160 F_O_SYMS		\<FOREACH\.OVERLAY\.SEARCHSYMBOLS\>
161 E_O_SYMS		\<END\.OVERLAY\.SEARCHSYMBOLS\>
162 FOR_OVERLAY_SYMS_1	^{st}{F_O_SYMS}{ed}
163 FOR_OVERLAY_SYMS_2	{F_O_SYMS}
164 END_OVERLAY_SYMS_1	^{st}{E_O_SYMS}{ed}
165 END_OVERLAY_SYMS_2	{E_O_SYMS}
166 
167 F_LTDATLS		\<FOREACH\.LTDAUTOLOADS{sec}{flt}\>
168 E_LTDATLS		\<END\.LTDAUTOLOADS{sec}{flt}\>
169 FOR_LTDAUTOLOADS_1		^{st}{F_LTDATLS}{ed}
170 FOR_LTDAUTOLOADS_2		{F_LTDATLS}
171 END_LTDAUTOLOADS_1		^{st}{E_LTDATLS}{ed}
172 END_LTDAUTOLOADS_2		{E_LTDATLS}
173 
174 LTDAUTOLOAD_OBJ		\<LTDAUTOLOAD\.OBJECT{sec}{mod}\>
175 F_LA_OBJS		\<FOREACH\.LTDAUTOLOAD\.OBJECTS{sec}{flt}\>
176 E_LA_OBJS		\<END\.LTDAUTOLOAD\.OBJECTS{sec}{flt}\>
177 FOR_LTDAUTOLOAD_OBJS_1	^{st}{F_LA_OBJS}{ed}
178 FOR_LTDAUTOLOAD_OBJS_2	{F_LA_OBJS}
179 END_LTDAUTOLOAD_OBJS_1	^{st}{E_LA_OBJS}{ed}
180 END_LTDAUTOLOAD_OBJS_2	{E_LA_OBJS}
181 
182 LTDAUTOLOAD_LIB		\<LTDAUTOLOAD\.LIBRARY{sec}{mod}\>
183 F_LA_LIBS		\<FOREACH\.LTDAUTOLOAD\.LIBRARIES{sec}{flt}\>
184 E_LA_LIBS		\<END\.LTDAUTOLOAD\.LIBRARIES{sec}{flt}\>
185 FOR_LTDAUTOLOAD_LIBS_1	^{st}{F_LA_LIBS}{ed}
186 FOR_LTDAUTOLOAD_LIBS_2	{F_LA_LIBS}
187 END_LTDAUTOLOAD_LIBS_1	^{st}{E_LA_LIBS}{ed}
188 END_LTDAUTOLOAD_LIBS_2	{E_LA_LIBS}
189 
190 LTDAUTOLOAD_SYM		\<LTDAUTOLOAD\.SEARCHSYMBOL\>
191 F_LA_SYMS		\<FOREACH\.LTDAUTOLOAD\.SEARCHSYMBOLS\>
192 E_LA_SYMS		\<END\.LTDAUTOLOAD\.SEARCHSYMBOLS\>
193 FOR_LTDAUTOLOAD_SYMS_1	^{st}{F_LA_SYMS}{ed}
194 FOR_LTDAUTOLOAD_SYMS_2	{F_LA_SYMS}
195 END_LTDAUTOLOAD_SYMS_1	^{st}{E_LA_SYMS}{ed}
196 END_LTDAUTOLOAD_SYMS_2	{E_LA_SYMS}
197 
198 F_LTDOVLS		\<FOREACH\.LTDOVERLAYS{sec}{flt}\>
199 E_LTDOVLS		\<END\.LTDOVERLAYS{sec}{flt}\>
200 FOR_LTDOVERLAYS_1		^{st}{F_LTDOVLS}{ed}
201 FOR_LTDOVERLAYS_2		{F_LTDOVLS}
202 END_LTDOVERLAYS_1		^{st}{E_LTDOVLS}{ed}
203 END_LTDOVERLAYS_2		{E_LTDOVLS}
204 
205 LTDOVERLAY_OBJ		\<LTDOVERLAY\.OBJECT{sec}{mod}\>
206 F_LO_OBJS		\<FOREACH\.LTDOVERLAY\.OBJECTS{sec}{flt}\>
207 E_LO_OBJS		\<END\.LTDOVERLAY\.OBJECTS{sec}{flt}\>
208 FOR_LTDOVERLAY_OBJS_1	^{st}{F_LO_OBJS}{ed}
209 FOR_LTDOVERLAY_OBJS_2	{F_LO_OBJS}
210 END_LTDOVERLAY_OBJS_1	^{st}{E_LO_OBJS}{ed}
211 END_LTDOVERLAY_OBJS_2	{E_LO_OBJS}
212 
213 LTDOVERLAY_LIB		\<LTDOVERLAY\.LIBRARY{sec}{mod}\>
214 F_LO_LIBS		\<FOREACH\.LTDOVERLAY\.LIBRARIES{sec}{flt}\>
215 E_LO_LIBS		\<END\.LTDOVERLAY\.LIBRARIES{sec}{flt}\>
216 FOR_LTDOVERLAY_LIBS_1	^{st}{F_LO_LIBS}{ed}
217 FOR_LTDOVERLAY_LIBS_2	{F_LO_LIBS}
218 END_LTDOVERLAY_LIBS_1	^{st}{E_LO_LIBS}{ed}
219 END_LTDOVERLAY_LIBS_2	{E_LO_LIBS}
220 
221 LTDOVERLAY_SYM		\<LTDOVERLAY\.SEARCHSYMBOL\>
222 F_LO_SYMS		\<FOREACH\.LTDOVERLAY\.SEARCHSYMBOLS\>
223 E_LO_SYMS		\<END\.LTDOVERLAY\.SEARCHSYMBOLS\>
224 FOR_LTDOVERLAY_SYMS_1	^{st}{F_LO_SYMS}{ed}
225 FOR_LTDOVERLAY_SYMS_2	{F_LO_SYMS}
226 END_LTDOVERLAY_SYMS_1	^{st}{E_LO_SYMS}{ed}
227 END_LTDOVERLAY_SYMS_2	{E_LO_SYMS}
228 
229 
230 %x IFCOND1
231 %x IFCOND2
232 %x IFCOND3
233 %option pointer
234 %option yylineno
235 %option noyywrap
236 %%
237 
238  //===========================================================================
239  //    LCF TOKENS
240  //===========================================================================
241 
242 \<IF\.				{ BEGIN IFCOND1; RETURN(tIF_OPEN);  }
243 <IFCOND1>{identifier}		{ BEGIN IFCOND2; tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_ID);    }
244 <IFCOND2>{equation}		{ BEGIN IFCOND3; tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_COMP);  }
245 <IFCOND3>{value}		{                tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_VALUE); }
246 <IFCOND3>\>			{ BEGIN INITIAL; RETURN(tIF_CLOSE); }
247 \<ELSE\>			{ RETURN(tIF_ELSE);  }
248 \<ENDIF\>			{ RETURN(tIF_ENDIF); }
249 
250 \<STATIC\.NAME\>		{ RETURN(tSTATIC_NAME);            }
251 \<STATIC\.ADDRESS\>		{ RETURN(tSTATIC_ADDRESS);         }
252 \<STATIC\.STACKSIZE\>		{ RETURN(tSTATIC_STACKSIZE);       }
253 \<STATIC\.IRQSTACKSIZE\>	{ RETURN(tSTATIC_IRQSTACKSIZE);    }
254 
255 {STATIC_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tSTATIC_OBJECT);          }
256 {FOR_STATIC_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_OBJECTS); }
257 {FOR_STATIC_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_OBJECTS); }
258 {END_STATIC_OBJS_1}		{ RETURN(tEND_STATIC_OBJECTS);     }
259 {END_STATIC_OBJS_2}		{ RETURN(tEND_STATIC_OBJECTS);     }
260 
261 {STATIC_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tSTATIC_LIBRARY);           }
262 {FOR_STATIC_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_LIBRARIES); }
263 {FOR_STATIC_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_LIBRARIES); }
264 {END_STATIC_LIBS_1}		{ RETURN(tEND_STATIC_LIBRARIES);   }
265 {END_STATIC_LIBS_2}		{ RETURN(tEND_STATIC_LIBRARIES);   }
266 
267 {STATIC_SYM}			{ RETURN(tSTATIC_SEARCHSYMBOL);          }
268 {FOR_STATIC_SYMS_1}		{ RETURN(tFOREACH_STATIC_SEARCHSYMBOLS); }
269 {FOR_STATIC_SYMS_2}		{ RETURN(tFOREACH_STATIC_SEARCHSYMBOLS); }
270 {END_STATIC_SYMS_1}		{ RETURN(tEND_STATIC_SEARCHSYMBOLS); }
271 {END_STATIC_SYMS_2}		{ RETURN(tEND_STATIC_SEARCHSYMBOLS); }
272 
273 \<AUTOLOAD\.ID\>		{ RETURN(tAUTOLOAD_ID);            }
274 \<AUTOLOAD\.NAME\>		{ RETURN(tAUTOLOAD_NAME);          }
275 \<AUTOLOAD\.ADDRESS\>		{ RETURN(tAUTOLOAD_ADDRESS);       }
276 \<NUMBER\.AUTOLOADS\>		{ RETURN(tNUMBER_AUTOLOADS);       }
277 
278 {FOR_AUTOLOADS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOADS); }
279 {FOR_AUTOLOADS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOADS); }
280 {END_AUTOLOADS_1}		{ RETURN(tEND_AUTOLOADS);          }
281 {END_AUTOLOADS_2}		{ RETURN(tEND_AUTOLOADS);          }
282 
283 {AUTOLOAD_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tAUTOLOAD_OBJECT);          }
284 {FOR_AUTOLOAD_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_OBJECTS); }
285 {FOR_AUTOLOAD_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_OBJECTS); }
286 {END_AUTOLOAD_OBJS_1}		{ RETURN(tEND_AUTOLOAD_OBJECTS);   }
287 {END_AUTOLOAD_OBJS_2}		{ RETURN(tEND_AUTOLOAD_OBJECTS);   }
288 
289 {AUTOLOAD_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tAUTOLOAD_LIBRARY);           }
290 {FOR_AUTOLOAD_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_LIBRARIES); }
291 {FOR_AUTOLOAD_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_LIBRARIES); }
292 {END_AUTOLOAD_LIBS_1}		{ RETURN(tEND_AUTOLOAD_LIBRARIES); }
293 {END_AUTOLOAD_LIBS_2}		{ RETURN(tEND_AUTOLOAD_LIBRARIES); }
294 
295 {AUTOLOAD_SYM}			{ RETURN(tAUTOLOAD_SEARCHSYMBOL);          }
296 {FOR_AUTOLOAD_SYMS_1}		{ RETURN(tFOREACH_AUTOLOAD_SEARCHSYMBOLS); }
297 {FOR_AUTOLOAD_SYMS_2}		{ RETURN(tFOREACH_AUTOLOAD_SEARCHSYMBOLS); }
298 {END_AUTOLOAD_SYMS_1}		{ RETURN(tEND_AUTOLOAD_SEARCHSYMBOLS); }
299 {END_AUTOLOAD_SYMS_2}		{ RETURN(tEND_AUTOLOAD_SEARCHSYMBOLS); }
300 
301 \<OVERLAY\.ID\>			{ RETURN(tOVERLAY_ID);             }
302 \<OVERLAY\.NAME\>		{ RETURN(tOVERLAY_NAME);           }
303 \<OVERLAY\.GROUP\>		{ RETURN(tOVERLAY_GROUP);          }
304 \<OVERLAY\.ADDRESS\>		{ RETURN(tOVERLAY_ADDRESS);        }
305 \<NUMBER\.OVERLAYS\>		{ RETURN(tNUMBER_OVERLAYS);        }
306 \<NUMBER_OVERLAYS\>		{ RETURN(tNUMBER_OVERLAYS);        }
307 
308 {FOR_OVERLAYS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAYS); }
309 {FOR_OVERLAYS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAYS); }
310 {END_OVERLAYS_1}		{ RETURN(tEND_OVERLAYS);           }
311 {END_OVERLAYS_2}		{ RETURN(tEND_OVERLAYS);           }
312 
313 {OVERLAY_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tOVERLAY_OBJECT);          }
314 {FOR_OVERLAY_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_OBJECTS); }
315 {FOR_OVERLAY_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_OBJECTS); }
316 {END_OVERLAY_OBJS_1}		{ RETURN(tEND_OVERLAY_OBJECTS);    }
317 {END_OVERLAY_OBJS_2}		{ RETURN(tEND_OVERLAY_OBJECTS);    }
318 
319 {OVERLAY_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tOVERLAY_LIBRARY);           }
320 {FOR_OVERLAY_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_LIBRARIES); }
321 {FOR_OVERLAY_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_LIBRARIES); }
322 {END_OVERLAY_LIBS_1}		{ RETURN(tEND_OVERLAY_LIBRARIES);  }
323 {END_OVERLAY_LIBS_2}		{ RETURN(tEND_OVERLAY_LIBRARIES);  }
324 
325 {OVERLAY_SYM}			{ RETURN(tOVERLAY_SEARCHSYMBOL);          }
326 {FOR_OVERLAY_SYMS_1}		{ RETURN(tFOREACH_OVERLAY_SEARCHSYMBOLS); }
327 {FOR_OVERLAY_SYMS_2}		{ RETURN(tFOREACH_OVERLAY_SEARCHSYMBOLS); }
328 {END_OVERLAY_SYMS_1}		{ RETURN(tEND_OVERLAY_SEARCHSYMBOLS);  }
329 {END_OVERLAY_SYMS_2}		{ RETURN(tEND_OVERLAY_SEARCHSYMBOLS);  }
330 
331 \<LTDAUTOLOAD\.ID\>			{ RETURN(tLTDAUTOLOAD_ID);            }
332 \<LTDAUTOLOAD\.NAME\>		{ RETURN(tLTDAUTOLOAD_NAME);          }
333 \<LTDAUTOLOAD\.ADDRESS\>	{ RETURN(tLTDAUTOLOAD_ADDRESS);       }
334 \<NUMBER\.LTDAUTOLOADS\>	{ RETURN(tNUMBER_LTDAUTOLOADS);       }
335 
336 {FOR_LTDAUTOLOADS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOADS); }
337 {FOR_LTDAUTOLOADS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOADS); }
338 {END_LTDAUTOLOADS_1}		{ RETURN(tEND_LTDAUTOLOADS);          }
339 {END_LTDAUTOLOADS_2}		{ RETURN(tEND_LTDAUTOLOADS);          }
340 
341 {LTDAUTOLOAD_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDAUTOLOAD_OBJECT);          }
342 {FOR_LTDAUTOLOAD_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_OBJECTS); }
343 {FOR_LTDAUTOLOAD_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_OBJECTS); }
344 {END_LTDAUTOLOAD_OBJS_1}		{ RETURN(tEND_LTDAUTOLOAD_OBJECTS);   }
345 {END_LTDAUTOLOAD_OBJS_2}		{ RETURN(tEND_LTDAUTOLOAD_OBJECTS);   }
346 
347 {LTDAUTOLOAD_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDAUTOLOAD_LIBRARY);           }
348 {FOR_LTDAUTOLOAD_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_LIBRARIES); }
349 {FOR_LTDAUTOLOAD_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_LIBRARIES); }
350 {END_LTDAUTOLOAD_LIBS_1}		{ RETURN(tEND_LTDAUTOLOAD_LIBRARIES); }
351 {END_LTDAUTOLOAD_LIBS_2}		{ RETURN(tEND_LTDAUTOLOAD_LIBRARIES); }
352 
353 {LTDAUTOLOAD_SYM}			{ RETURN(tLTDAUTOLOAD_SEARCHSYMBOL);          }
354 {FOR_LTDAUTOLOAD_SYMS_1}		{ RETURN(tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS); }
355 {FOR_LTDAUTOLOAD_SYMS_2}		{ RETURN(tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS); }
356 {END_LTDAUTOLOAD_SYMS_1}		{ RETURN(tEND_LTDAUTOLOAD_SEARCHSYMBOLS); }
357 {END_LTDAUTOLOAD_SYMS_2}		{ RETURN(tEND_LTDAUTOLOAD_SEARCHSYMBOLS); }
358 
359 \<LTDOVERLAY\.ID\>			{ RETURN(tLTDOVERLAY_ID);             }
360 \<LTDOVERLAY\.NAME\>		{ RETURN(tLTDOVERLAY_NAME);           }
361 \<LTDOVERLAY\.GROUP\>		{ RETURN(tLTDOVERLAY_GROUP);          }
362 \<LTDOVERLAY\.ADDRESS\>		{ RETURN(tLTDOVERLAY_ADDRESS);        }
363 \<NUMBER\.LTDOVERLAYS\>		{ RETURN(tNUMBER_LTDOVERLAYS);        }
364 \<NUMBER_LTDOVERLAYS\>		{ RETURN(tNUMBER_LTDOVERLAYS);        }
365 
366 {FOR_LTDOVERLAYS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAYS); }
367 {FOR_LTDOVERLAYS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAYS); }
368 {END_LTDOVERLAYS_1}		{ RETURN(tEND_LTDOVERLAYS);           }
369 {END_LTDOVERLAYS_2}		{ RETURN(tEND_LTDOVERLAYS);           }
370 
371 {LTDOVERLAY_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDOVERLAY_OBJECT);          }
372 {FOR_LTDOVERLAY_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_OBJECTS); }
373 {FOR_LTDOVERLAY_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_OBJECTS); }
374 {END_LTDOVERLAY_OBJS_1}		{ RETURN(tEND_LTDOVERLAY_OBJECTS);    }
375 {END_LTDOVERLAY_OBJS_2}		{ RETURN(tEND_LTDOVERLAY_OBJECTS);    }
376 
377 {LTDOVERLAY_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDOVERLAY_LIBRARY);           }
378 {FOR_LTDOVERLAY_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_LIBRARIES); }
379 {FOR_LTDOVERLAY_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_LIBRARIES); }
380 {END_LTDOVERLAY_LIBS_1}		{ RETURN(tEND_LTDOVERLAY_LIBRARIES);  }
381 {END_LTDOVERLAY_LIBS_2}		{ RETURN(tEND_LTDOVERLAY_LIBRARIES);  }
382 
383 {LTDOVERLAY_SYM}			{ RETURN(tLTDOVERLAY_SEARCHSYMBOL);          }
384 {FOR_LTDOVERLAY_SYMS_1}		{ RETURN(tFOREACH_LTDOVERLAY_SEARCHSYMBOLS); }
385 {FOR_LTDOVERLAY_SYMS_2}		{ RETURN(tFOREACH_LTDOVERLAY_SEARCHSYMBOLS); }
386 {END_LTDOVERLAY_SYMS_1}		{ RETURN(tEND_LTDOVERLAY_SEARCHSYMBOLS);  }
387 {END_LTDOVERLAY_SYMS_2}		{ RETURN(tEND_LTDOVERLAY_SEARCHSYMBOLS);  }
388 
389 \<PROPERTY\.OVERLAYDEFS\>	{ RETURN(tPROPERTY_OVERLAYDEFS);   }
390 \<PROPERTY\.OVERLAYTABLE\>	{ RETURN(tPROPERTY_OVERLAYTABLE);  }
391 \<PROPERTY\.LTDOVERLAYDEFS\>	{ RETURN(tPROPERTY_LTDOVERLAYDEFS); }
392 \<PROPERTY\.LTDOVERLAYTABLE\>	{ RETURN(tPROPERTY_LTDOVERLAYTABLE); }
393 \<PROPERTY\.SUR?FFIX\>		{ RETURN(tPROPERTY_SUFFIX);        }
394 \<PROPERTY\.FLXSUR?FFIX\>	{ RETURN(tPROPERTY_FLXSUFFIX); }
395 \<PROPERTY\.LTDSUR?FFIX\>	{ RETURN(tPROPERTY_LTDSUFFIX); }
396 
397 [^<\n]*\n?		|
398 \<			{
399 	tlcf_yylval.string = strdup(tlcf_yytext);
400 	RETURN(tSTRING);
401 }
402 
403 .   			{ RETURN(tlcf_yytext[0]); }
404 
405 %%
406 
407 /*============================================================================
408  *  PARSE TLCF FILE
409  */
410 int  ParseTlcfFile( const char* filename )
411 {
412     FILE *fp;
413     int   result;
414 
415     if ( NULL == ( fp = fopen( filename, "r" ) ) )
416     {
417 	fprintf( stderr, "Cannot open %s\n", filename );
418 	return 2;
419     }
420 
421     tlcf_yyin  = fp;
422     result = tlcf_yyparse();
423     fclose( fp );
424 
425     if ( GetLoopStackLevel( ) > 0 )
426     {
427 	tlcf_yyerror( "Unmatched foreach-end pair" );
428 	return 1;
429     }
430 
431     return result ? 1 : 0;
432 }
433