xref: /AOO41X/main/l10ntools/source/helpex.cxx (revision 3cd96b95fb0ad23ccdd883f9b15a685c459d45ca)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_l10ntools.hxx"
26 #include <stdio.h>
27 #include <stdlib.h>
28 
29 // local includes
30 #include "helpmerge.hxx"
31 
32 // defines to parse command line
33 #define STATE_NON               0x0001
34 #define STATE_INPUT             0x0002
35 #define STATE_OUTPUT            0x0003
36 #define STATE_PRJ               0x0004
37 #define STATE_ROOT              0x0005
38 #define STATE_SDFFILE           0x0006
39 #define STATE_ERRORLOG          0x0007
40 #define STATE_BREAKHELP         0x0008
41 #define STATE_UNMERGE           0x0009
42 #define STATE_UTF8              0x000A
43 #define STATE_LANGUAGES         0x000B
44 #define STATE_FORCE_LANGUAGES   0x000C
45 #define STATE_OUTPUTX           0xfe
46 #define STATE_OUTPUTY           0xff
47 
48 // set of global variables
49 ByteString sInputFile;
50 sal_Bool bEnableExport;
51 sal_Bool bMergeMode;
52 sal_Bool bErrorLog;
53 sal_Bool bUTF8;
54 ByteString sPrj;
55 ByteString sPrjRoot;
56 ByteString sOutputFile;
57 ByteString sOutputFileX;
58 ByteString sOutputFileY;
59 ByteString sSDFFile;
60 
61 /*****************************************************************************/
ParseCommandLine(int argc,char * argv[])62 sal_Bool ParseCommandLine( int argc, char* argv[])
63 /*****************************************************************************/
64 {
65     bEnableExport = sal_False;
66     bMergeMode = sal_False;
67     bErrorLog = sal_True;
68     bUTF8 = sal_True;
69     sPrj = "";
70     sPrjRoot = "";
71     Export::sLanguages = "";
72     Export::sForcedLanguages = "";
73 
74     sal_uInt16 nState = STATE_NON;
75     sal_Bool bInput = sal_False;
76 
77     // parse command line
78     for( int i = 1; i < argc; i++ ) {
79         if ( ByteString( argv[ i ]).ToUpperAscii() == "-I" ) {
80             nState = STATE_INPUT; // next tokens specifies source files
81         }
82         else if ( ByteString( argv[ i ]).ToUpperAscii()  == "-O" ) {
83             nState = STATE_OUTPUT; // next token specifies the dest file
84         }
85         else if ( ByteString( argv[ i ]).ToUpperAscii()  == "-X" ) {
86             nState = STATE_OUTPUTX; // next token specifies the dest file
87         }
88         else if ( ByteString( argv[ i ]).ToUpperAscii()  == "-Y" ) {
89             nState = STATE_OUTPUTY; // next token specifies the dest file
90         }
91         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-P" ) {
92             nState = STATE_PRJ; // next token specifies the cur. project
93         }
94         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-LF" ) {
95             nState = STATE_FORCE_LANGUAGES;
96         }
97 
98         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-R" ) {
99             nState = STATE_ROOT; // next token specifies path to project root
100         }
101         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-M" ) {
102             nState = STATE_SDFFILE; // next token specifies the merge database
103         }
104         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-E" ) {
105             nState = STATE_ERRORLOG;
106             bErrorLog = sal_False;
107         }
108         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-UTF8" ) {
109             nState = STATE_UTF8;
110             bUTF8 = sal_True;
111         }
112         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-NOUTF8" ) {
113             nState = STATE_UTF8;
114             bUTF8 = sal_False;
115         }
116         else if ( ByteString( argv[ i ]).ToUpperAscii() == "-L" ) {
117             nState = STATE_LANGUAGES;
118         }
119         else {
120             switch ( nState ) {
121                 case STATE_NON: {
122                     return sal_False;   // no valid command line
123                 }
124                 //break;
125                 case STATE_INPUT: {
126                     sInputFile = argv[ i ];
127                     bInput = sal_True; // source file found
128                 }
129                 break;
130                 case STATE_OUTPUT: {
131                     sOutputFile = argv[ i ]; // the dest. file
132                 }
133                 break;
134                 case STATE_OUTPUTX: {
135                     sOutputFileX = argv[ i ]; // the dest. file
136                 }
137                 break;
138                 case STATE_OUTPUTY: {
139                     sOutputFileY = argv[ i ]; // the dest. file
140                 }
141                 break;
142                 case STATE_PRJ: {
143                     sPrj = argv[ i ];
144 //                  sPrj.ToLowerAscii(); // the project
145                 }
146                 break;
147                 case STATE_ROOT: {
148                     sPrjRoot = argv[ i ]; // path to project root
149                 }
150                 break;
151                 case STATE_SDFFILE: {
152                     sSDFFile = argv[ i ];
153                     bMergeMode = sal_True; // activate merge mode, cause merge database found
154                 }
155                 break;
156                 case STATE_LANGUAGES: {
157                     Export::sLanguages = argv[ i ];
158                 }
159                 case STATE_FORCE_LANGUAGES:{
160                     Export::sForcedLanguages = argv[ i ];
161                 }
162                 break;
163             }
164         }
165     }
166 
167     if ( bInput ) {
168         // command line is valid
169         bEnableExport = sal_True;
170         return sal_True;
171     }
172 
173     // command line is not valid
174     return sal_False;
175 }
176 
177 
178 /*****************************************************************************/
Help()179 void Help()
180 /*****************************************************************************/
181 {
182     fprintf( stdout, "Syntax: HELPEX[-p Prj][-r PrjRoot]-i FileIn ( -o FileOut | -x path -y relfile )[-m DataBase][-e][-b][-u][-L l1,l2,...] -LF l1,l2 \n" );
183     fprintf( stdout, " Prj:      Project\n" );
184     fprintf( stdout, " PrjRoot:  Path to project root (..\\.. etc.)\n" );
185     fprintf( stdout, " FileIn:   Source file (*.lng)\n" );
186     fprintf( stdout, " FileOut:  Destination file (*.*)\n" );
187     fprintf( stdout, " DataBase: Mergedata (*.sdf)\n" );
188     fprintf( stdout, " -L: Restrict the handled languages. l1,l2,... are elements of (en-US,fr,de...)\n" );
189     fprintf( stdout, "     A fallback language can be defined like this: l1=f1.\n" );
190     fprintf( stdout, "     f1, f2,... are also elements of (en-US,fr,de...)\n" );
191     fprintf( stdout, "     Example: -L fr=en-US\n" );
192     fprintf( stdout, "              Restriction to fr, en-US will be fallback for fr\n" );
193     fprintf( stdout, " -LF: Force the creation of that languages\n" );
194 
195 }
196 
197 /*****************************************************************************/
198 #ifndef TESTDRIVER
199 
200 #if defined(UNX) || defined(OS2)
main(int argc,char * argv[])201 int main( int argc, char *argv[] )
202 #else
203 int _cdecl main( int argc, char *argv[] )
204 #endif
205 /*****************************************************************************/
206 {
207 
208     if ( !ParseCommandLine( argc, argv )) {
209         Help();
210         return 1;
211     }
212     //sal_uInt32 startfull = Export::startMessure();
213 
214     bool hasInputList = sInputFile.GetBuffer()[0]=='@';
215 //    printf("x = %s , y = %s , o = %s\n", sOutputFileX.GetBuffer(),  sOutputFileY.GetBuffer() , sOutputFile.GetBuffer() );
216     bool hasNoError = true;
217 
218     if ( sOutputFile.Len() ){                                               // Merge single file ?
219         //printf("DBG: Inputfile = %s\n",sInputFile.GetBuffer());
220         HelpParser aParser( sInputFile, bUTF8 , false );
221 
222         if ( bMergeMode )
223         {
224 
225             //sal_uInt64 startreadloc = Export::startMessure();
226             MergeDataFile aMergeDataFile( sSDFFile, sInputFile , sal_False, RTL_TEXTENCODING_MS_1252 );
227             //MergeDataFile aMergeDataFile( sSDFFile, sInputFile , sal_False, RTL_TEXTENCODING_MS_1252, false );
228             //Export::stopMessure( ByteString("read localize.sdf") , startreadloc );
229 
230             hasNoError = aParser.Merge( sSDFFile, sOutputFile , Export::sLanguages , aMergeDataFile );
231         }
232         else
233             hasNoError = aParser.CreateSDF( sOutputFile, sPrj, sPrjRoot, sInputFile, new XMLFile( '0' ), "help" );
234     }else if ( sOutputFileX.Len() && sOutputFileY.Len() && hasInputList ) {  // Merge multiple files ?
235         if ( bMergeMode ){
236 
237             ifstream aFStream( sInputFile.Copy( 1 , sInputFile.Len() ).GetBuffer() , ios::in );
238 
239             if( !aFStream ){
240                 cerr << "ERROR: - helpex - Can't open the file " << sInputFile.Copy( 1 , sInputFile.Len() ).GetBuffer() << "\n";
241                 exit(-1);
242             }
243 
244             vector<ByteString> filelist;
245             rtl::OStringBuffer filename;
246             sal_Char aChar;
247             while( aFStream.get( aChar ) )
248             {
249                 if( aChar == ' ' || aChar == '\n')
250                     filelist.push_back( ByteString( filename.makeStringAndClear().getStr() ) );
251                 else
252                     filename.append( aChar );
253             }
254             if( filename.getLength() > 0 )
255                 filelist.push_back( ByteString ( filename.makeStringAndClear().getStr() ) );
256 
257             aFStream.close();
258             ByteString sHelpFile(""); // dummy
259             //MergeDataFile aMergeDataFile( sSDFFile, sHelpFile , sal_False, RTL_TEXTENCODING_MS_1252, false );
260             MergeDataFile aMergeDataFile( sSDFFile, sHelpFile , sal_False, RTL_TEXTENCODING_MS_1252 );
261 
262             //aMergeDataFile.Dump();
263             std::vector<ByteString> aLanguages;
264             HelpParser::parse_languages( aLanguages , aMergeDataFile );
265 
266             bool bCreateDir = true;
267             for( vector<ByteString>::iterator pos = filelist.begin() ; pos != filelist.end() ; ++pos )
268             {
269                 sHelpFile = *pos;
270                 cout << ".";cout.flush();
271 
272                 HelpParser aParser( sHelpFile , bUTF8 , true );
273                 hasNoError = aParser.Merge( sSDFFile , sOutputFileX , sOutputFileY , true , aLanguages , aMergeDataFile , bCreateDir );
274                 bCreateDir = false;
275             }
276         }
277     } else
278         cerr << "helpex ERROR: Wrong input parameters!\n";
279 
280     //Export::stopMessure( ByteString("full cycle") , startfull );
281     if( hasNoError )
282         return 0;
283     else
284         return 1;
285 }
286 #endif
287