1 %{
2 /*---------------------------------------------------------------------------*
3   Project:  TwlSDK - tools - makelcf
4   File:     tlcf.l
5 
6   Copyright 2003-2009 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:: 2009-06-04#$
15   $Rev: 10698 $
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_CRT0_OBJ	\<STATIC\.CRT0\.OBJECT{sec}\>
82 
83 STATIC_OBJ		\<STATIC\.OBJECT{sec}{mod}\>
84 F_S_OBJS		\<FOREACH\.STATIC\.OBJECTS{sec}{flt}\>
85 E_S_OBJS		\<END\.STATIC\.OBJECTS{sec}{flt}\>
86 FOR_STATIC_OBJS_1	^{st}{F_S_OBJS}{ed}
87 FOR_STATIC_OBJS_2	{F_S_OBJS}
88 END_STATIC_OBJS_1	^{st}{E_S_OBJS}{ed}
89 END_STATIC_OBJS_2	{E_S_OBJS}
90 
91 STATIC_LIB		\<STATIC\.LIBRARY{sec}{mod}\>
92 F_S_LIBS		\<FOREACH\.STATIC\.LIBRARIES{sec}{flt}\>
93 E_S_LIBS		\<END\.STATIC\.LIBRARIES{sec}{flt}\>
94 FOR_STATIC_LIBS_1	^{st}{F_S_LIBS}{ed}
95 FOR_STATIC_LIBS_2	{F_S_LIBS}
96 END_STATIC_LIBS_1	^{st}{E_S_LIBS}{ed}
97 END_STATIC_LIBS_2	{E_S_LIBS}
98 
99 STATIC_SYM		\<STATIC\.SEARCHSYMBOL\>
100 F_S_SYMS		\<FOREACH\.STATIC\.SEARCHSYMBOLS\>
101 E_S_SYMS		\<END\.STATIC\.SEARCHSYMBOLS\>
102 FOR_STATIC_SYMS_1	^{st}{F_S_SYMS}{ed}
103 FOR_STATIC_SYMS_2	{F_S_SYMS}
104 END_STATIC_SYMS_1	^{st}{E_S_SYMS}{ed}
105 END_STATIC_SYMS_2	{E_S_SYMS}
106 
107 F_ATLS			\<FOREACH\.AUTOLOADS{sec}{flt}\>
108 E_ATLS			\<END\.AUTOLOADS{sec}{flt}\>
109 FOR_AUTOLOADS_1		^{st}{F_ATLS}{ed}
110 FOR_AUTOLOADS_2		{F_ATLS}
111 END_AUTOLOADS_1		^{st}{E_ATLS}{ed}
112 END_AUTOLOADS_2		{E_ATLS}
113 
114 AUTOLOAD_OBJ		\<AUTOLOAD\.OBJECT{sec}{mod}\>
115 F_A_OBJS		\<FOREACH\.AUTOLOAD\.OBJECTS{sec}{flt}\>
116 E_A_OBJS		\<END\.AUTOLOAD\.OBJECTS{sec}{flt}\>
117 FOR_AUTOLOAD_OBJS_1	^{st}{F_A_OBJS}{ed}
118 FOR_AUTOLOAD_OBJS_2	{F_A_OBJS}
119 END_AUTOLOAD_OBJS_1	^{st}{E_A_OBJS}{ed}
120 END_AUTOLOAD_OBJS_2	{E_A_OBJS}
121 
122 AUTOLOAD_LIB		\<AUTOLOAD\.LIBRARY{sec}{mod}\>
123 F_A_LIBS		\<FOREACH\.AUTOLOAD\.LIBRARIES{sec}{flt}\>
124 E_A_LIBS		\<END\.AUTOLOAD\.LIBRARIES{sec}{flt}\>
125 FOR_AUTOLOAD_LIBS_1	^{st}{F_A_LIBS}{ed}
126 FOR_AUTOLOAD_LIBS_2	{F_A_LIBS}
127 END_AUTOLOAD_LIBS_1	^{st}{E_A_LIBS}{ed}
128 END_AUTOLOAD_LIBS_2	{E_A_LIBS}
129 
130 AUTOLOAD_SYM		\<AUTOLOAD\.SEARCHSYMBOL\>
131 F_A_SYMS		\<FOREACH\.AUTOLOAD\.SEARCHSYMBOLS\>
132 E_A_SYMS		\<END\.AUTOLOAD\.SEARCHSYMBOLS\>
133 FOR_AUTOLOAD_SYMS_1	^{st}{F_A_SYMS}{ed}
134 FOR_AUTOLOAD_SYMS_2	{F_A_SYMS}
135 END_AUTOLOAD_SYMS_1	^{st}{E_A_SYMS}{ed}
136 END_AUTOLOAD_SYMS_2	{E_A_SYMS}
137 
138 F_OVLS			\<FOREACH\.OVERLAYS{sec}{flt}\>
139 E_OVLS			\<END\.OVERLAYS{sec}{flt}\>
140 FOR_OVERLAYS_1		^{st}{F_OVLS}{ed}
141 FOR_OVERLAYS_2		{F_OVLS}
142 END_OVERLAYS_1		^{st}{E_OVLS}{ed}
143 END_OVERLAYS_2		{E_OVLS}
144 
145 OVERLAY_OBJ		\<OVERLAY\.OBJECT{sec}{mod}\>
146 F_O_OBJS		\<FOREACH\.OVERLAY\.OBJECTS{sec}{flt}\>
147 E_O_OBJS		\<END\.OVERLAY\.OBJECTS{sec}{flt}\>
148 FOR_OVERLAY_OBJS_1	^{st}{F_O_OBJS}{ed}
149 FOR_OVERLAY_OBJS_2	{F_O_OBJS}
150 END_OVERLAY_OBJS_1	^{st}{E_O_OBJS}{ed}
151 END_OVERLAY_OBJS_2	{E_O_OBJS}
152 
153 OVERLAY_LIB		\<OVERLAY\.LIBRARY{sec}{mod}\>
154 F_O_LIBS		\<FOREACH\.OVERLAY\.LIBRARIES{sec}{flt}\>
155 E_O_LIBS		\<END\.OVERLAY\.LIBRARIES{sec}{flt}\>
156 FOR_OVERLAY_LIBS_1	^{st}{F_O_LIBS}{ed}
157 FOR_OVERLAY_LIBS_2	{F_O_LIBS}
158 END_OVERLAY_LIBS_1	^{st}{E_O_LIBS}{ed}
159 END_OVERLAY_LIBS_2	{E_O_LIBS}
160 
161 OVERLAY_SYM		\<OVERLAY\.SEARCHSYMBOL\>
162 F_O_SYMS		\<FOREACH\.OVERLAY\.SEARCHSYMBOLS\>
163 E_O_SYMS		\<END\.OVERLAY\.SEARCHSYMBOLS\>
164 FOR_OVERLAY_SYMS_1	^{st}{F_O_SYMS}{ed}
165 FOR_OVERLAY_SYMS_2	{F_O_SYMS}
166 END_OVERLAY_SYMS_1	^{st}{E_O_SYMS}{ed}
167 END_OVERLAY_SYMS_2	{E_O_SYMS}
168 
169 F_LTDATLS		\<FOREACH\.LTDAUTOLOADS{sec}{flt}\>
170 E_LTDATLS		\<END\.LTDAUTOLOADS{sec}{flt}\>
171 FOR_LTDAUTOLOADS_1		^{st}{F_LTDATLS}{ed}
172 FOR_LTDAUTOLOADS_2		{F_LTDATLS}
173 END_LTDAUTOLOADS_1		^{st}{E_LTDATLS}{ed}
174 END_LTDAUTOLOADS_2		{E_LTDATLS}
175 
176 LTDAUTOLOAD_OBJ		\<LTDAUTOLOAD\.OBJECT{sec}{mod}\>
177 F_LA_OBJS		\<FOREACH\.LTDAUTOLOAD\.OBJECTS{sec}{flt}\>
178 E_LA_OBJS		\<END\.LTDAUTOLOAD\.OBJECTS{sec}{flt}\>
179 FOR_LTDAUTOLOAD_OBJS_1	^{st}{F_LA_OBJS}{ed}
180 FOR_LTDAUTOLOAD_OBJS_2	{F_LA_OBJS}
181 END_LTDAUTOLOAD_OBJS_1	^{st}{E_LA_OBJS}{ed}
182 END_LTDAUTOLOAD_OBJS_2	{E_LA_OBJS}
183 
184 LTDAUTOLOAD_LIB		\<LTDAUTOLOAD\.LIBRARY{sec}{mod}\>
185 F_LA_LIBS		\<FOREACH\.LTDAUTOLOAD\.LIBRARIES{sec}{flt}\>
186 E_LA_LIBS		\<END\.LTDAUTOLOAD\.LIBRARIES{sec}{flt}\>
187 FOR_LTDAUTOLOAD_LIBS_1	^{st}{F_LA_LIBS}{ed}
188 FOR_LTDAUTOLOAD_LIBS_2	{F_LA_LIBS}
189 END_LTDAUTOLOAD_LIBS_1	^{st}{E_LA_LIBS}{ed}
190 END_LTDAUTOLOAD_LIBS_2	{E_LA_LIBS}
191 
192 LTDAUTOLOAD_SYM		\<LTDAUTOLOAD\.SEARCHSYMBOL\>
193 F_LA_SYMS		\<FOREACH\.LTDAUTOLOAD\.SEARCHSYMBOLS\>
194 E_LA_SYMS		\<END\.LTDAUTOLOAD\.SEARCHSYMBOLS\>
195 FOR_LTDAUTOLOAD_SYMS_1	^{st}{F_LA_SYMS}{ed}
196 FOR_LTDAUTOLOAD_SYMS_2	{F_LA_SYMS}
197 END_LTDAUTOLOAD_SYMS_1	^{st}{E_LA_SYMS}{ed}
198 END_LTDAUTOLOAD_SYMS_2	{E_LA_SYMS}
199 
200 F_LTDOVLS		\<FOREACH\.LTDOVERLAYS{sec}{flt}\>
201 E_LTDOVLS		\<END\.LTDOVERLAYS{sec}{flt}\>
202 FOR_LTDOVERLAYS_1		^{st}{F_LTDOVLS}{ed}
203 FOR_LTDOVERLAYS_2		{F_LTDOVLS}
204 END_LTDOVERLAYS_1		^{st}{E_LTDOVLS}{ed}
205 END_LTDOVERLAYS_2		{E_LTDOVLS}
206 
207 LTDOVERLAY_OBJ		\<LTDOVERLAY\.OBJECT{sec}{mod}\>
208 F_LO_OBJS		\<FOREACH\.LTDOVERLAY\.OBJECTS{sec}{flt}\>
209 E_LO_OBJS		\<END\.LTDOVERLAY\.OBJECTS{sec}{flt}\>
210 FOR_LTDOVERLAY_OBJS_1	^{st}{F_LO_OBJS}{ed}
211 FOR_LTDOVERLAY_OBJS_2	{F_LO_OBJS}
212 END_LTDOVERLAY_OBJS_1	^{st}{E_LO_OBJS}{ed}
213 END_LTDOVERLAY_OBJS_2	{E_LO_OBJS}
214 
215 LTDOVERLAY_LIB		\<LTDOVERLAY\.LIBRARY{sec}{mod}\>
216 F_LO_LIBS		\<FOREACH\.LTDOVERLAY\.LIBRARIES{sec}{flt}\>
217 E_LO_LIBS		\<END\.LTDOVERLAY\.LIBRARIES{sec}{flt}\>
218 FOR_LTDOVERLAY_LIBS_1	^{st}{F_LO_LIBS}{ed}
219 FOR_LTDOVERLAY_LIBS_2	{F_LO_LIBS}
220 END_LTDOVERLAY_LIBS_1	^{st}{E_LO_LIBS}{ed}
221 END_LTDOVERLAY_LIBS_2	{E_LO_LIBS}
222 
223 LTDOVERLAY_SYM		\<LTDOVERLAY\.SEARCHSYMBOL\>
224 F_LO_SYMS		\<FOREACH\.LTDOVERLAY\.SEARCHSYMBOLS\>
225 E_LO_SYMS		\<END\.LTDOVERLAY\.SEARCHSYMBOLS\>
226 FOR_LTDOVERLAY_SYMS_1	^{st}{F_LO_SYMS}{ed}
227 FOR_LTDOVERLAY_SYMS_2	{F_LO_SYMS}
228 END_LTDOVERLAY_SYMS_1	^{st}{E_LO_SYMS}{ed}
229 END_LTDOVERLAY_SYMS_2	{E_LO_SYMS}
230 
231 
232 %x IFCOND1
233 %x IFCOND2
234 %x IFCOND3
235 %option pointer
236 %option yylineno
237 %option noyywrap
238 %%
239 
240  //===========================================================================
241  //    LCF TOKENS
242  //===========================================================================
243 
244 \<IF\.				{ BEGIN IFCOND1; RETURN(tIF_OPEN);  }
245 <IFCOND1>{identifier}		{ BEGIN IFCOND2; tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_ID);    }
246 <IFCOND2>{equation}		{ BEGIN IFCOND3; tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_COMP);  }
247 <IFCOND3>{value}		{                tlcf_yylval.string = strdup(tlcf_yytext); RETURN(tIF_VALUE); }
248 <IFCOND3>\>			{ BEGIN INITIAL; RETURN(tIF_CLOSE); }
249 \<ELSE\>			{ RETURN(tIF_ELSE);  }
250 \<ENDIF\>			{ RETURN(tIF_ENDIF); }
251 
252 \<STATIC\.NAME\>		{ RETURN(tSTATIC_NAME);            }
253 \<STATIC\.ADDRESS\>		{ RETURN(tSTATIC_ADDRESS);         }
254 \<STATIC\.STACKSIZE\>		{ RETURN(tSTATIC_STACKSIZE);       }
255 \<STATIC\.IRQSTACKSIZE\>	{ RETURN(tSTATIC_IRQSTACKSIZE);    }
256 
257 {STATIC_CRT0_OBJ}       { tlcf_yylval.string = getSection("=*"); RETURN(tSTATIC_CRT0_OBJECT); }
258 
259 {STATIC_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tSTATIC_OBJECT);          }
260 {FOR_STATIC_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_OBJECTS); }
261 {FOR_STATIC_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_OBJECTS); }
262 {END_STATIC_OBJS_1}		{ RETURN(tEND_STATIC_OBJECTS);     }
263 {END_STATIC_OBJS_2}		{ RETURN(tEND_STATIC_OBJECTS);     }
264 
265 {STATIC_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tSTATIC_LIBRARY);           }
266 {FOR_STATIC_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_LIBRARIES); }
267 {FOR_STATIC_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_STATIC_LIBRARIES); }
268 {END_STATIC_LIBS_1}		{ RETURN(tEND_STATIC_LIBRARIES);   }
269 {END_STATIC_LIBS_2}		{ RETURN(tEND_STATIC_LIBRARIES);   }
270 
271 {STATIC_SYM}			{ RETURN(tSTATIC_SEARCHSYMBOL);          }
272 {FOR_STATIC_SYMS_1}		{ RETURN(tFOREACH_STATIC_SEARCHSYMBOLS); }
273 {FOR_STATIC_SYMS_2}		{ RETURN(tFOREACH_STATIC_SEARCHSYMBOLS); }
274 {END_STATIC_SYMS_1}		{ RETURN(tEND_STATIC_SEARCHSYMBOLS); }
275 {END_STATIC_SYMS_2}		{ RETURN(tEND_STATIC_SEARCHSYMBOLS); }
276 
277 \<AUTOLOAD\.ID\>		{ RETURN(tAUTOLOAD_ID);            }
278 \<AUTOLOAD\.NAME\>		{ RETURN(tAUTOLOAD_NAME);          }
279 \<AUTOLOAD\.ADDRESS\>		{ RETURN(tAUTOLOAD_ADDRESS);       }
280 \<NUMBER\.AUTOLOADS\>		{ RETURN(tNUMBER_AUTOLOADS);       }
281 
282 {FOR_AUTOLOADS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOADS); }
283 {FOR_AUTOLOADS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOADS); }
284 {END_AUTOLOADS_1}		{ RETURN(tEND_AUTOLOADS);          }
285 {END_AUTOLOADS_2}		{ RETURN(tEND_AUTOLOADS);          }
286 
287 {AUTOLOAD_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tAUTOLOAD_OBJECT);          }
288 {FOR_AUTOLOAD_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_OBJECTS); }
289 {FOR_AUTOLOAD_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_OBJECTS); }
290 {END_AUTOLOAD_OBJS_1}		{ RETURN(tEND_AUTOLOAD_OBJECTS);   }
291 {END_AUTOLOAD_OBJS_2}		{ RETURN(tEND_AUTOLOAD_OBJECTS);   }
292 
293 {AUTOLOAD_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tAUTOLOAD_LIBRARY);           }
294 {FOR_AUTOLOAD_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_LIBRARIES); }
295 {FOR_AUTOLOAD_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_AUTOLOAD_LIBRARIES); }
296 {END_AUTOLOAD_LIBS_1}		{ RETURN(tEND_AUTOLOAD_LIBRARIES); }
297 {END_AUTOLOAD_LIBS_2}		{ RETURN(tEND_AUTOLOAD_LIBRARIES); }
298 
299 {AUTOLOAD_SYM}			{ RETURN(tAUTOLOAD_SEARCHSYMBOL);          }
300 {FOR_AUTOLOAD_SYMS_1}		{ RETURN(tFOREACH_AUTOLOAD_SEARCHSYMBOLS); }
301 {FOR_AUTOLOAD_SYMS_2}		{ RETURN(tFOREACH_AUTOLOAD_SEARCHSYMBOLS); }
302 {END_AUTOLOAD_SYMS_1}		{ RETURN(tEND_AUTOLOAD_SEARCHSYMBOLS); }
303 {END_AUTOLOAD_SYMS_2}		{ RETURN(tEND_AUTOLOAD_SEARCHSYMBOLS); }
304 
305 \<OVERLAY\.ID\>			{ RETURN(tOVERLAY_ID);             }
306 \<OVERLAY\.NAME\>		{ RETURN(tOVERLAY_NAME);           }
307 \<OVERLAY\.GROUP\>		{ RETURN(tOVERLAY_GROUP);          }
308 \<OVERLAY\.ADDRESS\>		{ RETURN(tOVERLAY_ADDRESS);        }
309 \<NUMBER\.OVERLAYS\>		{ RETURN(tNUMBER_OVERLAYS);        }
310 \<NUMBER_OVERLAYS\>		{ RETURN(tNUMBER_OVERLAYS);        }
311 
312 {FOR_OVERLAYS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAYS); }
313 {FOR_OVERLAYS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAYS); }
314 {END_OVERLAYS_1}		{ RETURN(tEND_OVERLAYS);           }
315 {END_OVERLAYS_2}		{ RETURN(tEND_OVERLAYS);           }
316 
317 {OVERLAY_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tOVERLAY_OBJECT);          }
318 {FOR_OVERLAY_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_OBJECTS); }
319 {FOR_OVERLAY_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_OBJECTS); }
320 {END_OVERLAY_OBJS_1}		{ RETURN(tEND_OVERLAY_OBJECTS);    }
321 {END_OVERLAY_OBJS_2}		{ RETURN(tEND_OVERLAY_OBJECTS);    }
322 
323 {OVERLAY_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tOVERLAY_LIBRARY);           }
324 {FOR_OVERLAY_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_LIBRARIES); }
325 {FOR_OVERLAY_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_OVERLAY_LIBRARIES); }
326 {END_OVERLAY_LIBS_1}		{ RETURN(tEND_OVERLAY_LIBRARIES);  }
327 {END_OVERLAY_LIBS_2}		{ RETURN(tEND_OVERLAY_LIBRARIES);  }
328 
329 {OVERLAY_SYM}			{ RETURN(tOVERLAY_SEARCHSYMBOL);          }
330 {FOR_OVERLAY_SYMS_1}		{ RETURN(tFOREACH_OVERLAY_SEARCHSYMBOLS); }
331 {FOR_OVERLAY_SYMS_2}		{ RETURN(tFOREACH_OVERLAY_SEARCHSYMBOLS); }
332 {END_OVERLAY_SYMS_1}		{ RETURN(tEND_OVERLAY_SEARCHSYMBOLS);  }
333 {END_OVERLAY_SYMS_2}		{ RETURN(tEND_OVERLAY_SEARCHSYMBOLS);  }
334 
335 \<LTDAUTOLOAD\.ID\>			{ RETURN(tLTDAUTOLOAD_ID);            }
336 \<LTDAUTOLOAD\.NAME\>		{ RETURN(tLTDAUTOLOAD_NAME);          }
337 \<LTDAUTOLOAD\.ADDRESS\>	{ RETURN(tLTDAUTOLOAD_ADDRESS);       }
338 \<NUMBER\.LTDAUTOLOADS\>	{ RETURN(tNUMBER_LTDAUTOLOADS);       }
339 
340 {FOR_LTDAUTOLOADS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOADS); }
341 {FOR_LTDAUTOLOADS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOADS); }
342 {END_LTDAUTOLOADS_1}		{ RETURN(tEND_LTDAUTOLOADS);          }
343 {END_LTDAUTOLOADS_2}		{ RETURN(tEND_LTDAUTOLOADS);          }
344 
345 {LTDAUTOLOAD_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDAUTOLOAD_OBJECT);          }
346 {FOR_LTDAUTOLOAD_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_OBJECTS); }
347 {FOR_LTDAUTOLOAD_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_OBJECTS); }
348 {END_LTDAUTOLOAD_OBJS_1}		{ RETURN(tEND_LTDAUTOLOAD_OBJECTS);   }
349 {END_LTDAUTOLOAD_OBJS_2}		{ RETURN(tEND_LTDAUTOLOAD_OBJECTS);   }
350 
351 {LTDAUTOLOAD_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDAUTOLOAD_LIBRARY);           }
352 {FOR_LTDAUTOLOAD_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_LIBRARIES); }
353 {FOR_LTDAUTOLOAD_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDAUTOLOAD_LIBRARIES); }
354 {END_LTDAUTOLOAD_LIBS_1}		{ RETURN(tEND_LTDAUTOLOAD_LIBRARIES); }
355 {END_LTDAUTOLOAD_LIBS_2}		{ RETURN(tEND_LTDAUTOLOAD_LIBRARIES); }
356 
357 {LTDAUTOLOAD_SYM}			{ RETURN(tLTDAUTOLOAD_SEARCHSYMBOL);          }
358 {FOR_LTDAUTOLOAD_SYMS_1}		{ RETURN(tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS); }
359 {FOR_LTDAUTOLOAD_SYMS_2}		{ RETURN(tFOREACH_LTDAUTOLOAD_SEARCHSYMBOLS); }
360 {END_LTDAUTOLOAD_SYMS_1}		{ RETURN(tEND_LTDAUTOLOAD_SEARCHSYMBOLS); }
361 {END_LTDAUTOLOAD_SYMS_2}		{ RETURN(tEND_LTDAUTOLOAD_SEARCHSYMBOLS); }
362 
363 \<LTDOVERLAY\.ID\>			{ RETURN(tLTDOVERLAY_ID);             }
364 \<LTDOVERLAY\.NAME\>		{ RETURN(tLTDOVERLAY_NAME);           }
365 \<LTDOVERLAY\.GROUP\>		{ RETURN(tLTDOVERLAY_GROUP);          }
366 \<LTDOVERLAY\.ADDRESS\>		{ RETURN(tLTDOVERLAY_ADDRESS);        }
367 \<NUMBER\.LTDOVERLAYS\>		{ RETURN(tNUMBER_LTDOVERLAYS);        }
368 \<NUMBER_LTDOVERLAYS\>		{ RETURN(tNUMBER_LTDOVERLAYS);        }
369 
370 {FOR_LTDOVERLAYS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAYS); }
371 {FOR_LTDOVERLAYS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAYS); }
372 {END_LTDOVERLAYS_1}		{ RETURN(tEND_LTDOVERLAYS);           }
373 {END_LTDOVERLAYS_2}		{ RETURN(tEND_LTDOVERLAYS);           }
374 
375 {LTDOVERLAY_OBJ}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDOVERLAY_OBJECT);          }
376 {FOR_LTDOVERLAY_OBJS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_OBJECTS); }
377 {FOR_LTDOVERLAY_OBJS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_OBJECTS); }
378 {END_LTDOVERLAY_OBJS_1}		{ RETURN(tEND_LTDOVERLAY_OBJECTS);    }
379 {END_LTDOVERLAY_OBJS_2}		{ RETURN(tEND_LTDOVERLAY_OBJECTS);    }
380 
381 {LTDOVERLAY_LIB}			{ tlcf_yylval.string = getSection(NULL); RETURN(tLTDOVERLAY_LIBRARY);           }
382 {FOR_LTDOVERLAY_LIBS_1}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_LIBRARIES); }
383 {FOR_LTDOVERLAY_LIBS_2}		{ tlcf_yylval.string = getSection("=*"); RETURN(tFOREACH_LTDOVERLAY_LIBRARIES); }
384 {END_LTDOVERLAY_LIBS_1}		{ RETURN(tEND_LTDOVERLAY_LIBRARIES);  }
385 {END_LTDOVERLAY_LIBS_2}		{ RETURN(tEND_LTDOVERLAY_LIBRARIES);  }
386 
387 {LTDOVERLAY_SYM}			{ RETURN(tLTDOVERLAY_SEARCHSYMBOL);          }
388 {FOR_LTDOVERLAY_SYMS_1}		{ RETURN(tFOREACH_LTDOVERLAY_SEARCHSYMBOLS); }
389 {FOR_LTDOVERLAY_SYMS_2}		{ RETURN(tFOREACH_LTDOVERLAY_SEARCHSYMBOLS); }
390 {END_LTDOVERLAY_SYMS_1}		{ RETURN(tEND_LTDOVERLAY_SEARCHSYMBOLS);  }
391 {END_LTDOVERLAY_SYMS_2}		{ RETURN(tEND_LTDOVERLAY_SEARCHSYMBOLS);  }
392 
393 \<PROPERTY\.OVERLAYDEFS\>	{ RETURN(tPROPERTY_OVERLAYDEFS);   }
394 \<PROPERTY\.OVERLAYTABLE\>	{ RETURN(tPROPERTY_OVERLAYTABLE);  }
395 \<PROPERTY\.LTDOVERLAYDEFS\>	{ RETURN(tPROPERTY_LTDOVERLAYDEFS); }
396 \<PROPERTY\.LTDOVERLAYTABLE\>	{ RETURN(tPROPERTY_LTDOVERLAYTABLE); }
397 \<PROPERTY\.SUR?FFIX\>		{ RETURN(tPROPERTY_SUFFIX);        }
398 \<PROPERTY\.FLXSUR?FFIX\>	{ RETURN(tPROPERTY_FLXSUFFIX); }
399 \<PROPERTY\.LTDSUR?FFIX\>	{ RETURN(tPROPERTY_LTDSUFFIX); }
400 
401 [^<\n]*\n?		|
402 \<			{
403 	tlcf_yylval.string = strdup(tlcf_yytext);
404 	RETURN(tSTRING);
405 }
406 
407 .   			{ RETURN(tlcf_yytext[0]); }
408 
409 %%
410 
411 /*============================================================================
412  *  PARSE TLCF FILE
413  */
414 int  ParseTlcfFile( const char* filename )
415 {
416     FILE *fp;
417     int   result;
418 
419     if ( NULL == ( fp = fopen( filename, "r" ) ) )
420     {
421 	fprintf( stderr, "Cannot open %s\n", filename );
422 	return 2;
423     }
424 
425     tlcf_yyin  = fp;
426     result = tlcf_yyparse();
427     fclose( fp );
428 
429     if ( GetLoopStackLevel( ) > 0 )
430     {
431 	tlcf_yyerror( "Unmatched foreach-end pair" );
432 	return 1;
433     }
434 
435     return result ? 1 : 0;
436 }
437