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