Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <stdlib.h>
22 : #include <stdio.h>
23 : #include <fcntl.h>
24 : #include <string.h>
25 :
26 : #ifdef UNX
27 : #include <unistd.h>
28 : #include <sys/wait.h>
29 : #else // UNX
30 :
31 : #include <io.h>
32 : #include <process.h>
33 : #include <dos.h>
34 :
35 : #endif // UNX
36 : #include <rsctools.hxx>
37 : #include <rscerror.h>
38 : #include <sal/main.h>
39 : #include <rtl/strbuf.hxx>
40 : #include <tools/fsys.hxx>
41 :
42 : /*************** C O D E ************************************************/
43 :
44 : // Entry point declaration for modules rscpp and rsc2
45 : extern "C"
46 : {
47 : int rscpp_main(int, char**);
48 : }
49 : int rsc2_main(int, char**);
50 :
51 : /*************************************************************************
52 : |* CallPrePro()
53 : |*
54 : |* Beschreibung
55 : *************************************************************************/
56 630 : static sal_Bool CallPrePro( const rtl::OString& rInput,
57 : const rtl::OString& rOutput, RscPtrPtr * pCmdLine,
58 : sal_Bool bResponse )
59 : {
60 630 : RscPtrPtr aNewCmdL; // Kommandozeile
61 630 : RscPtrPtr aRespCmdL; // Kommandozeile
62 630 : RscPtrPtr * pCmdL = &aNewCmdL;
63 : int i, nRet;
64 630 : FILE* fRspFile = NULL;
65 630 : rtl::OString aRspFileName;
66 :
67 630 : if( bResponse )
68 : {
69 630 : aRspFileName = ::GetTmpFileName();
70 630 : fRspFile = fopen( aRspFileName.getStr(), "w" );
71 : }
72 :
73 630 : if( !fRspFile )
74 0 : aNewCmdL.Append( rsc_strdup( "rscpp" ) );
75 :
76 630 : bool bVerbose = false;
77 21923 : for( i = 1; i < int(pCmdLine->GetCount() -1); i++ )
78 : {
79 21293 : if ( 0 == rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) )
80 : {
81 0 : bVerbose = true;
82 0 : continue;
83 : }
84 54556 : if ( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 )
85 21293 : || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 )
86 11970 : || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 )
87 : )
88 : {
89 18773 : aNewCmdL.Append( rsc_strdup( (char *)pCmdLine->GetEntry( i ) ) );
90 : }
91 : }
92 :
93 630 : aNewCmdL.Append( rsc_strdup( rInput.getStr() ) );
94 630 : aNewCmdL.Append( rsc_strdup( rOutput.getStr() ) );
95 630 : aNewCmdL.Append( (void *)0 );
96 :
97 630 : if ( bVerbose )
98 : {
99 0 : printf( "Preprocessor commandline: " );
100 0 : for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ )
101 : {
102 0 : printf( " " );
103 0 : printf( "%s", (const char *)pCmdL->GetEntry( i ) );
104 : }
105 0 : printf( "\n" );
106 : }
107 :
108 630 : if( fRspFile )
109 : {
110 630 : aRespCmdL.Append( rsc_strdup( "rscpp" ) );
111 630 : rtl::OStringBuffer aTmpStr;
112 630 : aTmpStr.append('@').append(aRspFileName);
113 630 : aRespCmdL.Append( rsc_strdup( aTmpStr.getStr() ) );
114 630 : aRespCmdL.Append( (void *)0 );
115 :
116 630 : pCmdL = &aRespCmdL;
117 20663 : for( i = 0; i < (int)(aNewCmdL.GetCount() -1); i++ )
118 : {
119 20033 : fprintf( fRspFile, "%s ", (const char *)aNewCmdL.GetEntry( i ) );
120 : }
121 630 : fclose( fRspFile );
122 :
123 630 : if ( bVerbose )
124 : {
125 0 : printf( "Preprocessor startline: " );
126 0 : for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ )
127 : {
128 0 : printf( " " );
129 0 : printf( "%s", (const char *)pCmdL->GetEntry( i ) );
130 : }
131 0 : printf( "\n" );
132 630 : }
133 : }
134 :
135 630 : nRet = rscpp_main( pCmdL->GetCount()-1, (char**)pCmdL->GetBlock() );
136 :
137 630 : if ( fRspFile )
138 : {
139 : #if OSL_DEBUG_LEVEL > 5
140 : fprintf( stderr, "leaving response file %s\n", aRspFileName.getStr() );
141 : #else
142 630 : unlink( aRspFileName.getStr() );
143 : #endif
144 : }
145 630 : if ( nRet )
146 0 : return sal_False;
147 :
148 630 : return sal_True;
149 : }
150 :
151 :
152 : /*************************************************************************
153 : |* CallRsc2
154 : |*
155 : |* Beschreibung
156 : *************************************************************************/
157 691 : static sal_Bool CallRsc2( RscStrList * pInputList,
158 : const rtl::OString &rSrsName, RscPtrPtr * pCmdLine )
159 : {
160 : int nRet;
161 : rtl::OString* pString;
162 691 : RscVerbosity eVerbosity = RscVerbosityNormal;
163 :
164 691 : RscPtrPtr aNewCmdL;
165 691 : aNewCmdL.Append( rsc_strdup( "rsc2" ) );
166 :
167 22961 : for (int i = 1; i < (int)(pCmdLine->GetCount() -1); ++i)
168 : {
169 22270 : if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) )
170 : {
171 0 : eVerbosity = RscVerbosityVerbose;
172 0 : continue;
173 : }
174 22270 : if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-quiet" ) )
175 : {
176 0 : eVerbosity = RscVerbositySilent;
177 0 : continue;
178 : }
179 191549 : if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fp=", 4 )
180 21640 : || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fo=", 4 )
181 21640 : || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-presponse", 9 )
182 21010 : || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-rc", 3 )
183 21010 : || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-+" )
184 21010 : || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-br" )
185 21010 : || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-bz" )
186 21010 : || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-r" )
187 20949 : || ( '-' != *(char *)pCmdLine->GetEntry( i ) ) )
188 : {
189 : }
190 : else
191 20257 : aNewCmdL.Append( rsc_strdup( (char *)pCmdLine->GetEntry( i ) ) );
192 : };
193 :
194 691 : aNewCmdL.Append( rsc_strdup( rSrsName.getStr() ) );
195 :
196 1383 : for ( size_t i = 0, n = pInputList->size(); i < n; ++i )
197 : {
198 692 : pString = (*pInputList)[ i ];
199 692 : aNewCmdL.Append( rsc_strdup( pString->getStr() ) );
200 : };
201 :
202 691 : if ( eVerbosity >= RscVerbosityVerbose )
203 : {
204 0 : printf( "Rsc2 commandline: " );
205 0 : for( size_t i = 0; i < (unsigned int)(aNewCmdL.GetCount() -1); i++ )
206 : {
207 0 : printf( " %s", (const char *)aNewCmdL.GetEntry( i ) );
208 : }
209 0 : printf( "\n" );
210 : }
211 :
212 691 : nRet = rsc2_main( aNewCmdL.GetCount(), (char**)aNewCmdL.GetBlock() );
213 :
214 691 : if( nRet )
215 0 : return( sal_False );
216 691 : return( sal_True );
217 : }
218 :
219 : /*************************************************************************
220 : |*
221 : |* main()
222 : |*
223 : *************************************************************************/
224 1382 : SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
225 : {
226 691 : sal_Bool bPrePro = sal_True;
227 691 : sal_Bool bHelp = sal_False;
228 691 : sal_Bool bError = sal_False;
229 691 : sal_Bool bResponse = sal_False;
230 691 : rtl::OString aSrsName;
231 691 : rtl::OString aResName;
232 691 : RscStrList aInputList;
233 691 : RscStrList aTmpList;
234 : char * pStr;
235 : char ** ppStr;
236 691 : RscPtrPtr aCmdLine; // Kommandozeile
237 : sal_uInt32 i;
238 : rtl::OString* pString;
239 :
240 691 : pStr = ::ResponseFile( &aCmdLine, argv, argc );
241 691 : if( pStr )
242 : {
243 0 : printf( "Cannot open response file <%s>\n", pStr );
244 0 : return( 1 );
245 : };
246 :
247 691 : ppStr = (char **)aCmdLine.GetBlock();
248 691 : ppStr++;
249 691 : i = 1;
250 691 : sal_Bool bSetSrs = sal_False;
251 23652 : while( ppStr && i < (aCmdLine.GetCount() -1) )
252 : {
253 22270 : if( '-' == **ppStr )
254 : {
255 43095 : if( !rsc_stricmp( (*ppStr) + 1, "p" )
256 21517 : || !rsc_stricmp( (*ppStr) + 1, "l" ) )
257 : { // kein Preprozessor
258 61 : bPrePro = sal_False;
259 : }
260 21517 : else if( !rsc_stricmp( (*ppStr) + 1, "h" ) )
261 : { // Hilfe anzeigen
262 0 : bHelp = sal_True;
263 : }
264 21517 : else if( !rsc_strnicmp( (*ppStr) + 1, "presponse", 9 ) )
265 : { // whether to use response file when parameterising preprocessor
266 630 : bResponse = sal_True;
267 : }
268 20887 : else if( !rsc_strnicmp( (*ppStr) + 1, "fo=", 3 ) )
269 : { // anderer Name fuer .res-file
270 0 : aResName = (*ppStr) + 4;
271 : }
272 20887 : else if( !rsc_strnicmp( (*ppStr) + 1, "fp=", 3 ) )
273 : { // anderer Name fuer .srs-file
274 630 : bSetSrs = sal_True;
275 630 : aSrsName = (*ppStr);
276 : }
277 : }
278 : else
279 : {
280 : // Eingabedatei
281 692 : aInputList.push_back( new rtl::OString(*ppStr) );
282 : }
283 22270 : ppStr++;
284 22270 : i++;
285 : }
286 :
287 691 : if( !aInputList.empty() )
288 : {
289 : /* build the output file names */
290 691 : if (!aResName.getLength())
291 691 : aResName = OutputFile( *aInputList[ 0 ], "res" );
292 691 : if( ! bSetSrs )
293 : {
294 122 : aSrsName = rtl::OStringBuffer("-fp=").append(OutputFile(*aInputList[0], "srs")).
295 61 : makeStringAndClear();
296 : }
297 : };
298 :
299 691 : if( bHelp )
300 0 : bPrePro = sal_False;
301 691 : if( bPrePro && !aInputList.empty() )
302 : {
303 630 : rtl::OString aTmpName;
304 :
305 1260 : for ( size_t k = 0, n = aInputList.size(); k < n; ++k )
306 : {
307 630 : pString = aInputList[ k ];
308 630 : aTmpName = ::GetTmpFileName();
309 630 : if( !CallPrePro( *pString, aTmpName, &aCmdLine, bResponse ) )
310 : {
311 0 : printf( "Error starting preprocessor\n" );
312 0 : bError = sal_True;
313 0 : break;
314 : }
315 630 : aTmpList.push_back( new rtl::OString(aTmpName) );
316 630 : };
317 : };
318 :
319 691 : if( !bError )
320 : {
321 691 : if( !CallRsc2( bPrePro ? &aTmpList : &aInputList, aSrsName, &aCmdLine ) )
322 : {
323 0 : if( !bHelp )
324 : {
325 0 : printf( "Error starting rsc2 compiler\n" );
326 0 : bError = sal_True;
327 : }
328 : };
329 : };
330 :
331 1321 : for ( size_t k = 0, n = aTmpList.size(); k < n; ++k )
332 630 : unlink( aTmpList[ k ]->getStr() );
333 :
334 691 : return( bError );
335 : }
336 :
337 0 : void RscExit( sal_uInt32 nExit )
338 : {
339 0 : if( nExit )
340 0 : printf( "Program exit is %d\n", (int)nExit );
341 0 : exit( nExit );
342 : }
343 :
344 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|