xref: /trunk/main/l10ntools/source/cfglex.l (revision 27b2fc91b67b282ef25e5c8fc07f05afd8a62640)
1 %{
2 /*
3  * lexer for parsing cfg source files
4  *
5  */
6 
7 
8 /* enlarge token buffer to tokenize whole strings */
9 #undef YYLMAX
10 #define YYLMAX 64000
11 
12 /* to enable debug output define LEXDEBUG */
13 #define LEXDEBUG        1
14 #ifdef LEXDEBUG
15 #define OUTPUT  fprintf
16 #else
17 #define OUTPUT(Par1,Par2);
18 #endif
19 
20 /* table of possible token ids */
21 #include "tokens.h"
22 #include <stdlib.h>
23 #include <stdio.h>
24 
25 #if defined __GNUC__
26 #pragma GCC system_header
27 #elif defined __SINPRO_CC
28 #pragma disable_warn
29 #elif defined _MSC_VER
30 #pragma warning(push, 1)
31 #endif
32 
33 /* external functions (C++ code, declared as extren "C" */
34 extern int WorkOnTokenSet( int, char* );
35 extern int InitCfgExport( char * , char *);
36 extern int EndCfgExport();
37 extern int GetError();
38 extern int SetError();
39 extern char *GetOutputFile( int argc, char* argv[]);
40 extern FILE *GetCfgFile();
41 extern int isQuiet();
42 extern void removeTempFile();
43 extern char* getFilename();
44 /* forwards */
45 void YYWarning();
46 
47 int bText=0;
48 %}
49 
50 %p 24000
51 %e 1200
52 %n 500
53 
54 %%
55 
56 \<[^\>]*"xml:lang="\""x-no-translate"\"[^\<]*\/\>   {
57     bText = 0;
58     WorkOnTokenSet( CFG_TOKEN_NO_TRANSLATE, yytext );
59 }
60 
61 \<.*\/\> {
62     bText = 0;
63     WorkOnTokenSet( ANYTOKEN, yytext );
64 }
65 
66 \<[^\>]*"xml:lang="\".*\"[^\<]*\>   {
67     bText = 1;
68     WorkOnTokenSet( CFG_TEXT_START, yytext );
69 }
70 
71 
72 \<[^\/\!][^\>]*\>   {
73     bText = 0;
74     WorkOnTokenSet( CFG_TAG, yytext );
75 }
76 
77 "<!"DOCTYPE[^\>]*\> {
78     bText = 0;
79     WorkOnTokenSet( CFG_TAG, yytext );
80 }
81 
82 
83 \<\!\-\-    {
84     char c1 = 0, c2 = 0, c3 = input();
85     char pChar[2];
86     pChar[1] = 0x00;
87     pChar[0] = c3;
88 
89     WorkOnTokenSet( COMMEND, yytext );
90     WorkOnTokenSet( COMMEND, pChar );
91 
92     for(;;) {
93         if ( c3 == EOF )
94             break;
95         if ( c1 == '-' && c2 == '-' && c3 == '>' )
96             break;
97         c1 = c2;
98         c2 = c3;
99         c3 = input();
100         pChar[0] = c3;
101         WorkOnTokenSet( COMMEND, pChar );
102     }
103 }
104 
105 \<\/[^\>]*\> {
106     bText = 0;
107     WorkOnTokenSet( CFG_CLOSETAG, yytext );
108 }
109 
110 \<[^\>\!]*\> {
111     bText = 0;
112     if ( yytext[ 1 ] == '!' && yytext[ 2 ] == '-' && yytext[ 3 ] == '-' )
113         WorkOnTokenSet( COMMEND, yytext );
114     else
115         WorkOnTokenSet( CFG_UNKNOWNTAG, yytext );
116 }
117 
118 .|\n {
119     if ( bText == 1 )
120         WorkOnTokenSet( CFG_TEXTCHAR, yytext );
121     else
122         WorkOnTokenSet( UNKNOWNCHAR, yytext );
123 }
124 
125 
126 %%
127 
128 /*****************************************************************************/
129 int yywrap(void)
130 /*****************************************************************************/
131 {
132     return 1;
133 }
134 
135 /*****************************************************************************/
136 void YYWarning( char *s )
137 /*****************************************************************************/
138 {
139     /* write warning to stderr */
140     fprintf( stderr,
141         "Warning: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext  );
142 }
143 
144 /*****************************************************************************/
145 #ifdef GCC
146 void yyerror ( char *s, ... )
147 #else
148 void yyerror ( char *s )
149 #endif
150 /*****************************************************************************/
151 {
152     /* write error to stderr */
153     fprintf( stderr,
154         "Error: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext  );
155     SetError();
156 }
157 
158 /*****************************************************************************/
159 int
160 #ifdef WNT
161 _cdecl
162 #endif
163 main( int argc, char* argv[])
164 /*****************************************************************************/
165 {
166     /* error level */
167     int nRetValue = 0;
168     char *pOutput;
169     FILE *pFile;
170 
171     pOutput = GetOutputFile( argc, argv );
172 
173     if ( !pOutput ) {
174         fprintf( stdout, "Syntax: CFGEX[-p Prj][-r PrjRoot]-i FileIn [-o FileOut][-m DataBase][-e][-b][-u][-f][-d DoneFile][-g[:dtd] ][-L l1,l2,...]\n" );
175         fprintf( stdout, " Prj:      Project\n" );
176         fprintf( stdout, " PrjRoot:  Path to project root (..\\.. etc.)\n" );
177         fprintf( stdout, " FileIn:   Source files (*.src)\n" );
178         fprintf( stdout, " FileOut:  Destination file (*.*)\n" );
179         fprintf( stdout, " DataBase: Mergedata (*.sdf)\n" );
180         fprintf( stdout, " -e: Disable writing errorlog\n" );
181         fprintf( stdout, " -b: Break when Token \"HelpText\" found in source\n" );
182         fprintf( stdout, " -u: [english] and [german] are allowed, Id is Taken from DataBase \n" );
183         fprintf( stdout, " -f: force extraction and merge even if only one language is existent\n" );
184         fprintf( stdout, " -g[:dtd]: enables generation of properties (dtds if :dtd is set) - in this case FileOut is the output path\n" );
185         fprintf( stdout, " -d: enables generation of *.don if work is done\n" );
186         fprintf( stdout, " -L: Restrict the handled languages. l1,l2,... are elements of (de,en-US...)\n" );
187         fprintf( stdout, "     A fallback language can be defined like this: l1=f1.\n" );
188         fprintf( stdout, "     f1, f2,... are also elements of (de,en-US...)\n" );
189         fprintf( stdout, "     Example: -L de,es=en-US\n" );
190         fprintf( stdout, "              Restriction to de and es, en-US will be fallback for es\n" );
191         return 1;
192     }
193 
194     pFile = GetCfgFile();
195     InitCfgExport( pOutput , getFilename() );
196     if ( !pFile )
197         return 1;
198 
199     yyin = pFile;
200 
201     /* create global instance of class CfgExport */
202     //InitCfgExport( pOutput );
203 
204     /* start parser */
205     yylex();
206 
207     /* get error info. and end export */
208     nRetValue = GetError();
209     EndCfgExport();
210 
211 
212     removeTempFile();
213 /* return error level */
214     return nRetValue;
215 }
216 
217 
218