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