1 %{
2 /*---------------------------------------------------------------------------*
3   Project:  TwlSDK - tools - makelcf
4   File:     spec.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:: 2009-11-11#$
15   $Rev: 11140 $
16   $Author: kitase_hirotake $
17  *---------------------------------------------------------------------------*/
18 #include	<stdio.h>
19 #include	<string.h>
20 #include	"makelcf.h"
21 #include	"defval.h"
22 #include	"spec.tab.h"
23 
24 #define	RETURN(x) { debug_printf( "%s [%s]\n", #x, spec_yytext ); return(x); }
25 
26 static void  YYText_ResolveDevVal( void );
27 static char* getSection( void );
28 
29 
30 %}
31 
32 ws			[ \t]
33 nl			\r?\n
34 identifier		[A-Za-z_][A-Za-z_0-9]*
35 decnum			-?[1-9][0-9]*
36 octnum			-?0[0-7]*
37 hexnum			-?0[xX][0-9A-Fa-f]+
38 qstring			\"[^\"\n\r]*\"
39 string_wo_ws		[^ \t\n\r]+
40 
41 %s START
42 %s PARAM
43 %s PARAM_CONTINUE
44 %option pointer
45 %option yylineno
46 %option noyywrap
47 %%
48 
49  //======================================================================
50  //    SPEC TOKENS
51  //======================================================================
52 
53 #.*			;					/* Comment */
54 \/\/.*			;					/* Comment */
55 
56 <INITIAL>.*	{
57 	YYText_ResolveDevVal();
58 	BEGIN START;
59 }
60 
61 <PARAM_CONTINUE>.*	{
62 	YYText_ResolveDevVal();
63 	BEGIN PARAM;
64 }
65 
66 <START>(Static|STATIC|static)	 		{ BEGIN PARAM; RETURN(tSTATIC);       }
67 <START>(Autoload|AUTOLOAD|autoload) 		{ BEGIN PARAM; RETURN(tAUTOLOAD);     }
68 <START>(Overlay|OVERLAY|overlay) 		{ BEGIN PARAM; RETURN(tOVERLAY);      }
69 <START>(Ltd|LTD|ltd)(Autoload|AUTOLOAD|autoload)	{ BEGIN PARAM; RETURN(tLTDAUTOLOAD); }
70 <START>(Ltd|LTD|ltd)(Overlay|OVERLAY|overlay)	{ BEGIN PARAM; RETURN(tLTDOVERLAY); }
71 <START>(Property|PROPERTY|property)		{ BEGIN PARAM; RETURN(tPROPERTY);     }
72 <START>(Properties|PROPERTIES|properties)	{ BEGIN PARAM; RETURN(tPROPERTY);     }
73 
74 <START>(Group|GROUP|group)			{ BEGIN PARAM; RETURN(tGROUP);        }
75 <START>(Address|ADDRESS|address)		{ BEGIN PARAM; RETURN(tADDRESS);      }
76 <START>(After|AFTER|after)			{ BEGIN PARAM; RETURN(tAFTER);        }
77 <START>(Object|OBJECT|object)[sS]?		{ BEGIN PARAM; RETURN(tOBJECT);       }
78 <START>(Librar|LIBRAR|librar)(y|Y|ies|IES)?	{ BEGIN PARAM; RETURN(tLIBRARY);      }
79 <START>(Search|SEARCH|search)_?(Symbol|SYMBOL|symbol)[sS]? { BEGIN PARAM; RETURN(tSEARCHSYMBOL); }
80 <START>(Force|FORCE|force)			{ BEGIN PARAM; RETURN(tFORCE);        }
81 <START>(StackSize|STACKSIZE|stacksize)		{ BEGIN PARAM; RETURN(tSTACKSIZE);    }
82 <START>(Compress|COMPRESS|compress)		{ BEGIN PARAM; RETURN(tCOMPRESS);    }
83 
84 <START>(OverlayDefs|OVERLAYDEFS|overlaydefs)	{ BEGIN PARAM; RETURN(tOVERLAYDEFS);  }
85 <START>(OverlayTable|OVERLAYTABLE|overlaytable)	{ BEGIN PARAM; RETURN(tOVERLAYTABLE); }
86 <START>(Ltd|LTD|ltd)(OverlayDefs|OVERLAYDEFS|overlaydefs)	{ BEGIN PARAM; RETURN(tLTDOVERLAYDEFS); }
87 <START>(Ltd|LTD|ltd)(OverlayTable|OVERLAYTABLE|overlaytable)	{ BEGIN PARAM; RETURN(tLTDOVERLAYTABLE); }
88 <START>(Sur?ffix|SUR?FFIX|sur?ffix)		{ BEGIN PARAM; RETURN(tSUFFIX);       }
89 <START>(Flx|FLX|flx)(Sur?ffix|SUR?FFIX|sur?ffix)	{ BEGIN PARAM; RETURN(tFLXSUFFIX); }
90 <START>(Ltd|LTD|ltd)(Sur?ffix|SUR?FFIX|sur?ffix)	{ BEGIN PARAM; RETURN(tLTDSUFFIX); }
91 
92 <PARAM>(ITCM|itcm|Itcm)		{
93 	spec_yylval.string = strdup("ITCM");
94 	RETURN(tSTRING_ID);
95 }
96 
97 <PARAM>(DTCM|dtcm|Dtcm)		{
98 	spec_yylval.string = strdup("DTCM");
99 	RETURN(tSTRING_ID);
100 }
101 
102 <PARAM>(WRAM|wram|Wram)		{
103 	spec_yylval.string = strdup("WRAM");
104 	RETURN(tSTRING_ID);
105 }
106 
107 <PARAM>(SMART|smart|Smart)		{
108 	spec_yylval.string = strdup("SMART");
109 	RETURN(tSTRING_ID);
110 }
111 
112 <PARAM>(EXCLUSION|exclusion|Exclusion)		{
113 	spec_yylval.string = strdup("EXCLUSION");
114 	RETURN(tSTRING_ID);
115 }
116 
117 <START>\{		{ BEGIN PARAM; RETURN(tBEGIN);        }
118 <START>\}		{ BEGIN PARAM; RETURN(tEND);          }
119 
120 <PARAM>{ws}*\\{ws}*{nl}	{ BEGIN PARAM_CONTINUE; }     	/* Continue to next line */
121 
122 <PARAM>\({identifier}*\,{ws}{identifier}.[oa]\)	{
123 	spec_yylval.string = strdup(spec_yytext);
124 	RETURN(tSTRING_FORCE);
125 }
126 
127 <PARAM>\({ws}*\.[a-z]*{ws}*\)	{
128 	spec_yylval.string = getSection();
129 	RETURN(tSECTIONNAME);
130 }
131 
132 <PARAM>\({ws}*\.[a-z]*\.[a-z]*{ws}*\)	{
133 	spec_yylval.string = getSection();
134 	RETURN(tSECTIONNAME);
135 }
136 
137 <PARAM>\*		{
138 	spec_yylval.string = strdup(spec_yytext);
139 	RETURN(tSTRING_STAR);
140 }
141 
142 <PARAM>GROUP\([^\)]*\)	{
143 	spec_yylval.string = strdup(spec_yytext);
144 	RETURN(tSTRING_GROUP);
145 }
146 
147 <PARAM>OBJECT\([^\)]*\)	{
148 	spec_yylval.string = strdup(spec_yytext);
149 	RETURN(tSTRING_FUNCTION);
150 }
151 
152 {decnum}		|
153 {octnum}		|
154 {hexnum}		{			/* Integer Value */
155 	spec_yylval.integer = strtol((char*)spec_yytext, (char**)NULL, 0);
156 	RETURN(tNUMBER);
157 }
158 
159 {identifier}		{		       	/* String for identifier */
160 	spec_yylval.string = strdup(spec_yytext);
161 	RETURN(tSTRING_ID);
162 }
163 
164 {qstring}		{		       	/* String quated by "" */
165 	spec_yytext[spec_yyleng-1] = '\0';
166 	spec_yylval.string = strdup(spec_yytext+1);
167 	RETURN(tSTRING_QUATED);
168 }
169 
170 {string_wo_ws}		{			/* String without white space */
171 	spec_yylval.string = strdup(spec_yytext);
172 	RETURN(tSTRING_NOSPACE);
173 }
174 
175 <PARAM><<EOF>>		{ BEGIN INITIAL; RETURN(tNL); }	/* End of File */
176 
177 {nl}			{ BEGIN INITIAL; RETURN(tNL); }	/* Newline     */
178 {ws}+			;	       			/* White space */
179 .			{ RETURN(spec_yytext[0]);     }	/* Default     */
180 
181 %%
182 
183 /*============================================================================
184  *  Utilities
185  */
186 void  spec_yyerror( const char* str )
187 {
188     int  line = spec_yylineno;
189     if ( spec_yytext[0] == '\n' ) line --;
190     fprintf( stderr, "makelcf: line %d: %s\n", line, str );
191 }
192 
193 static char* getSection( void )
194 {
195     char*  p;
196     char*  head = NULL;
197 
198     for ( p = spec_yytext; *p; p ++ )
199     {
200 	switch ( *p )
201 	{
202 	case '(':
203 	    while ( *p == ' ' ) p ++;
204 	    head = p + 1;
205 	    break;
206 
207 	case ')':
208 	case ' ':
209 	    if ( head )
210             {
211 	        *p = '\0';
212 		return strdup( head );
213             }
214 	    break;
215 
216 	default:
217 	    break;
218 	}
219     }
220     return strdup( "*" );
221 }
222 
223 static void  YYText_ResolveDevVal( void )
224 {
225     int   i;
226     char* s = ResolveDefVal( spec_yytext );
227 
228     for ( i = strlen(s)-1; i >= 0; i -- )
229     {
230     	unput( s[i] );
231     }
232     free(s);
233     return;
234 }
235 
236 /*============================================================================
237  *  PARSE SPEC FILE
238  */
239 int  ParseSpecFile( const char* filename )
240 {
241     FILE *fp;
242     int   result;
243 
244     if ( NULL == ( fp = fopen( filename, "r" ) ) )
245     {
246 	fprintf( stderr, "makelcf: cannot open %s\n", filename );
247 	return 2;
248     }
249 
250     spec_yyin = fp;
251     result = spec_yyparse();
252     fclose( fp );
253     if ( result ) return 1;
254 
255     return CheckSpec() ? 0 : 1;
256 }
257