1 %{ 2 /* 3 * lexer for parsing xml-property source files (*.xml) 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 Argument( char * ); 36 extern int InitXrmExport( char * , char * ); 37 extern int EndXrmExport(); 38 extern int GetError(); 39 extern int SetError(); 40 extern char *GetOutputFile( int argc, char* argv[]); 41 extern FILE *GetXrmFile(); 42 extern int isQuiet(); 43 extern void removeTempFile(); 44 extern char* getFilename(); 45 46 /* forwards */ 47 void YYWarning(); 48 49 int bText=0; 50 %} 51 52 %p 24000 53 %e 1200 54 %n 500 55 56 %% 57 58 "<p "[^\>]*xml:lang[^\>]*\> { 59 WorkOnTokenSet( XRM_TEXT_START , yytext ); 60 } 61 62 "</p>" { 63 WorkOnTokenSet( XRM_TEXT_END, yytext ); 64 } 65 66 "<h1 "[^\>]*xml:lang[^\>]*\> { 67 WorkOnTokenSet( XRM_TEXT_START , yytext ); 68 } 69 70 "</h1>" { 71 WorkOnTokenSet( XRM_TEXT_END, yytext ); 72 } 73 "<h2 "[^\>]*xml:lang[^\>]*\> { 74 WorkOnTokenSet( XRM_TEXT_START , yytext ); 75 } 76 77 "</h2>" { 78 WorkOnTokenSet( XRM_TEXT_END, yytext ); 79 } 80 "<h3 "[^\>]*xml:lang[^\>]*\> { 81 WorkOnTokenSet( XRM_TEXT_START , yytext ); 82 } 83 84 "</h3>" { 85 WorkOnTokenSet( XRM_TEXT_END, yytext ); 86 } 87 "<h4 "[^\>]*xml:lang[^\>]*\> { 88 WorkOnTokenSet( XRM_TEXT_START , yytext ); 89 } 90 91 "</h4>" { 92 WorkOnTokenSet( XRM_TEXT_END, yytext ); 93 } 94 "<h5 "[^\>]*xml:lang[^\>]*\> { 95 WorkOnTokenSet( XRM_TEXT_START , yytext ); 96 } 97 98 "</h5>" { 99 WorkOnTokenSet( XRM_TEXT_END, yytext ); 100 } 101 102 103 104 105 106 107 "<!--" { 108 char c1 = 0, c2 = 0, c3 = input(); 109 char pChar[2]; 110 pChar[1] = 0x00; 111 pChar[0] = c3; 112 113 WorkOnTokenSet( COMMEND, yytext ); 114 WorkOnTokenSet( COMMEND, pChar ); 115 116 for(;;) { 117 if ( c3 == EOF ) 118 break; 119 if ( c1 == '-' && c2 == '-' && c3 == '>' ) 120 break; 121 c1 = c2; 122 c2 = c3; 123 c3 = input(); 124 pChar[0] = c3; 125 WorkOnTokenSet( COMMEND, pChar ); 126 } 127 } 128 129 .|\n { 130 if ( bText == 1 ) 131 WorkOnTokenSet( XML_TEXTCHAR, yytext ); 132 else 133 WorkOnTokenSet( UNKNOWNCHAR, yytext ); 134 } 135 136 137 %% 138 139 /*****************************************************************************/ 140 int yywrap(void) 141 /*****************************************************************************/ 142 { 143 return 1; 144 } 145 146 /*****************************************************************************/ 147 void YYWarning( char *s ) 148 /*****************************************************************************/ 149 { 150 /* write warning to stderr */ 151 fprintf( stderr, 152 "Warning: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext ); 153 } 154 155 /*****************************************************************************/ 156 #ifdef GCC 157 void yyerror ( char *s, ... ) 158 #else 159 void yyerror ( char *s ) 160 #endif 161 /*****************************************************************************/ 162 { 163 /* write error to stderr */ 164 fprintf( stderr, 165 "Error: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext ); 166 SetError(); 167 } 168 169 /*****************************************************************************/ 170 int 171 #ifdef WNT 172 _cdecl 173 #endif 174 main( int argc, char* argv[]) 175 /*****************************************************************************/ 176 { 177 /* error level */ 178 int nRetValue = 0; 179 char *pOutput; 180 FILE *pFile; 181 182 pOutput = GetOutputFile( argc, argv ); 183 184 if ( !pOutput ) { 185 fprintf( stdout, "Syntax: XRMEX[-p Prj][-r PrjRoot]-i FileIn [-o FileOut][-m DataBase][-e][-b][-u][-NOUTF8][-L l1,l2,...]\n" ); 186 fprintf( stdout, " Prj: Project\n" ); 187 fprintf( stdout, " PrjRoot: Path to project root (..\\.. etc.)\n" ); 188 fprintf( stdout, " FileIn: Source files (*.src)\n" ); 189 fprintf( stdout, " FileOut: Destination file (*.*)\n" ); 190 fprintf( stdout, " DataBase: Mergedata (*.sdf)\n" ); 191 fprintf( stdout, " -e: Disable writing errorlog\n" ); 192 fprintf( stdout, " -b: Break when Token \"HelpText\" found in source\n" ); 193 fprintf( stdout, " -u: [english] and [german] are allowed, Id is Taken from DataBase \n" ); 194 fprintf( stdout, " -NOUTF8: disable UTF8 as language independent encoding\n" ); 195 fprintf( stdout, " -L: Restrict the handled languages. l1,l2,... are elements of (de,en-US,es...)\n" ); 196 fprintf( stdout, " A fallback language can be defined like this: l1=f1.\n" ); 197 fprintf( stdout, " f1, f2,... are also elements of (de,en-US,es...)\n" ); 198 fprintf( stdout, " Example: -L en-US,es=de\n" ); 199 fprintf( stdout, " Restriction to es and en-US, de will be fallback for 99\n" ); 200 // fprintf( stdout, " -ISO99: IsoCode is the full qualified ISO language code for language 99" ); 201 return 1; 202 } 203 pFile = GetXrmFile(); 204 InitXrmExport( pOutput , getFilename() ); 205 206 if ( !pFile ) 207 return 1; 208 209 yyin = pFile; 210 211 /* create global instance of class XmlExport */ 212 //InitXrmExport( pOutput ); 213 214 /* start parser */ 215 yylex(); 216 217 /* get error info. and end export */ 218 nRetValue = GetError(); 219 EndXrmExport(); 220 221 removeTempFile(); 222 /* return error level */ 223 return nRetValue; 224 } 225