summaryrefslogtreecommitdiff
path: root/rsc/source/prj/start.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'rsc/source/prj/start.cxx')
-rw-r--r--rsc/source/prj/start.cxx486
1 files changed, 486 insertions, 0 deletions
diff --git a/rsc/source/prj/start.cxx b/rsc/source/prj/start.cxx
new file mode 100644
index 000000000000..0517af73b0f7
--- /dev/null
+++ b/rsc/source/prj/start.cxx
@@ -0,0 +1,486 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_rsc.hxx"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#if defined (WNT) && defined (tcpp)
+#define _spawnvp spawnvp
+#define _P_WAIT P_WAIT
+#endif
+
+#ifdef UNX
+#include <unistd.h>
+#include <sys/wait.h>
+#else // UNX
+
+#include <io.h>
+#include <process.h>
+#if defined ( OS2 ) && !defined ( GCC )
+#include <direct.h>
+#endif
+#if !defined ( CSET ) && !defined ( OS2 )
+#include <dos.h>
+#endif
+
+#endif // UNX
+#include <rsctools.hxx>
+#include <rscerror.h>
+#include <sal/main.h>
+#include <tools/fsys.hxx>
+
+/*************** C O D E ************************************************/
+/****************************************************************/
+/* */
+/* Function : fuer Ansi kompatibilitaet */
+/* */
+/****************************************************************/
+#ifdef UNX
+#define P_WAIT 0
+ int spawnvp( int, const char * cmdname, char *const* argv ){
+ int rc(0);
+
+ switch( fork() ){
+ case -1:
+ return( -1 );
+ case 0:
+ if( execvp( cmdname, argv ) == -1 )
+ // an error occurs
+ return( -1 );
+ break;
+ default:
+ if( -1 == wait( &rc ) )
+ return( -1 );
+ }
+ return( WEXITSTATUS( rc ) );
+ }
+#endif
+
+/*************************************************************************
+|* CallPrePro()
+|*
+|* Beschreibung
+*************************************************************************/
+static BOOL CallPrePro( const ByteString& rPrePro,
+ const ByteString& rInput,
+ const ByteString& rOutput,
+ RscPtrPtr * pCmdLine,
+ BOOL bResponse )
+{
+ RscPtrPtr aNewCmdL; // Kommandozeile
+ RscPtrPtr aRespCmdL; // Kommandozeile
+ RscPtrPtr * pCmdL = &aNewCmdL;
+ int i, nExit;
+ FILE* fRspFile = NULL;
+ ByteString aRspFileName;
+
+ if( bResponse )
+ {
+ aRspFileName = ::GetTmpFileName();
+ fRspFile = fopen( aRspFileName.GetBuffer(), "w" );
+ }
+
+ if( !fRspFile )
+ aNewCmdL.Append( rsc_strdup( rPrePro.GetBuffer() ) );
+
+ bool bVerbose = false;
+ for( i = 1; i < int(pCmdLine->GetCount() -1); i++ )
+ {
+ if ( 0 == rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) )
+ {
+ bVerbose = true;
+ continue;
+ }
+ if ( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 )
+ )
+ {
+ aNewCmdL.Append( rsc_strdup( (char *)pCmdLine->GetEntry( i ) ) );
+ }
+ }
+
+ aNewCmdL.Append( rsc_strdup( rInput.GetBuffer() ) );
+ aNewCmdL.Append( rsc_strdup( rOutput.GetBuffer() ) );
+ aNewCmdL.Append( (void *)0 );
+
+ if ( bVerbose )
+ {
+ printf( "Preprocessor commandline: " );
+ for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ )
+ {
+ printf( " " );
+ printf( "%s", (const char *)pCmdL->GetEntry( i ) );
+ }
+ printf( "\n" );
+ }
+
+ if( fRspFile )
+ {
+ aRespCmdL.Append( rsc_strdup( rPrePro.GetBuffer() ) );
+ ByteString aTmpStr( '@' );
+ aTmpStr += aRspFileName;
+ aRespCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) );
+ aRespCmdL.Append( (void *)0 );
+
+ pCmdL = &aRespCmdL;
+ for( i = 0; i < (int)(aNewCmdL.GetCount() -1); i++ )
+ {
+#ifdef OS2
+ fprintf( fRspFile, "%s\n", (const char *)aNewCmdL.GetEntry( i ) );
+#else
+ fprintf( fRspFile, "%s ", (const char *)aNewCmdL.GetEntry( i ) );
+#endif
+ }
+ fclose( fRspFile );
+
+ if ( bVerbose )
+ {
+ printf( "Preprocessor startline: " );
+ for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ )
+ {
+ printf( " " );
+ printf( "%s", (const char *)pCmdL->GetEntry( i ) );
+ }
+ printf( "\n" );
+ }
+ }
+
+#if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2
+ nExit = spawnvp( P_WAIT, rPrePro.GetBuffer(), (char* const*)pCmdL->GetBlock() );
+#elif defined CSET
+ nExit = spawnvp( P_WAIT, (char*)rPrePro.GetBuffer(), (const char**)pCmdL->GetBlock() );
+#elif defined WTC
+ nExit = spawnvp( P_WAIT, (char*)rPrePro.GetBuffer(), (const char* const*)pCmdL->GetBlock() );
+#elif defined MTW
+ nExit = spawnvp( P_WAIT, (char*)rPrePro.GetBuffer(), (char**)pCmdL->GetBlock() );
+#else
+ nExit = spawnvp( P_WAIT, (char*)rPrePro.GetBuffer(), (const char**)pCmdL->GetBlock() );
+#endif
+
+ if ( fRspFile )
+ #if OSL_DEBUG_LEVEL > 5
+ fprintf( stderr, "leaving response file %s\n", aRspFileName.GetBuffer() );
+ #else
+ unlink( aRspFileName.GetBuffer() );
+ #endif
+ if ( nExit )
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*************************************************************************
+|* CallRsc2
+|*
+|* Beschreibung
+*************************************************************************/
+static BOOL CallRsc2( ByteString aRsc2Name,
+ RscStrList * pInputList,
+ ByteString aSrsName,
+ RscPtrPtr * pCmdLine )
+{
+ int i, nExit;
+ ByteString* pString;
+ ByteString aRspFileName; // Response-Datei
+ FILE * fRspFile; // Response-Datei
+
+ aRspFileName = ::GetTmpFileName();
+ fRspFile = fopen( aRspFileName.GetBuffer(), "w" );
+
+ RscVerbosity eVerbosity = RscVerbosityNormal;
+ if( fRspFile )
+ {
+ for( i = 1; i < (int)(pCmdLine->GetCount() -1); i++ )
+ {
+ if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) )
+ {
+ eVerbosity = RscVerbosityVerbose;
+ continue;
+ }
+ if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-quiet" ) )
+ {
+ eVerbosity = RscVerbositySilent;
+ continue;
+ }
+ if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fp=", 4 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fo=", 4 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-pp=", 4 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-rsc2=", 6 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-presponse", 9 )
+ || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-rc", 3 )
+ || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-+" )
+ || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-br" )
+ || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-bz" )
+ || !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-r" )
+ // Am I the only one that thinks the following line inludes all the tests before?
+ || ( '-' != *(char *)pCmdLine->GetEntry( i ) ) )
+ {
+ }
+ else
+#ifdef OS2
+ fprintf( fRspFile, "%s\n",
+#else
+ fprintf( fRspFile, "%s ",
+#endif
+ (const char *)pCmdLine->GetEntry( i ) );
+ };
+
+#ifdef OS2
+ fprintf( fRspFile, "%s\n", aSrsName.GetBuffer() );
+#else
+ fprintf( fRspFile, "%s", aSrsName.GetBuffer() );
+#endif
+
+ pString = pInputList->First();
+ while( pString )
+ {
+#ifdef OS2
+ fprintf( fRspFile, "%s\n", pString->GetBuffer() );
+#else
+ fprintf( fRspFile, " %s", pString->GetBuffer() );
+#endif
+ pString = pInputList->Next();
+ };
+
+ fclose( fRspFile );
+ };
+
+ RscPtrPtr aNewCmdL; // Kommandozeile
+ aNewCmdL.Append( rsc_strdup( aRsc2Name.GetBuffer() ) );
+ ByteString aTmpStr( '@' );
+ aTmpStr += aRspFileName;
+ aNewCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) );
+ aNewCmdL.Append( (void *)0 );
+
+ if ( eVerbosity >= RscVerbosityVerbose )
+ {
+ printf( "Rsc2 commandline: " );
+ printf( "%s", (const char *)aNewCmdL.GetEntry( 0 ) );
+ printf( " " );
+ printf( "%s", (const char *)aNewCmdL.GetEntry( 1 ) );
+ printf( "\n" );
+ }
+
+#if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2
+ nExit = spawnvp( P_WAIT, aRsc2Name.GetBuffer(), (char* const*)aNewCmdL.GetBlock() );
+#elif defined CSET
+ nExit = spawnvp( P_WAIT, (char*)aRsc2Name.GetBuffer(), (char **)(const char**)aNewCmdL.GetBlock() );
+#elif defined WTC
+ nExit = spawnvp( P_WAIT, (char*)aRsc2Name.GetBuffer(), (const char* const*)aNewCmdL.GetBlock() );
+#elif defined MTW
+ nExit = spawnvp( P_WAIT, (char*)aRsc2Name.GetBuffer(), (char**)aNewCmdL.GetBlock() );
+#else
+ nExit = spawnvp( P_WAIT, (char*)aRsc2Name.GetBuffer(), (const char**)aNewCmdL.GetBlock() );
+#endif
+
+ if( fRspFile )
+ #if OSL_DEBUG_LEVEL > 5
+ fprintf( stderr, "leaving response file %s\n", aRspFileName.GetBuffer() );
+ #else
+ unlink( aRspFileName.GetBuffer() );
+ #endif
+ if( nExit )
+ return( FALSE );
+ return( TRUE );
+}
+
+/*************************************************************************
+|*
+|* main()
+|*
+|* Beschreibung
+|* Ersterstellung MM 05.09.91
+|* Letzte Aenderung MM 05.09.91
+|*
+*************************************************************************/
+SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+{
+ BOOL bPrePro = TRUE;
+ BOOL bResFile = TRUE;
+ BOOL bHelp = FALSE;
+ BOOL bError = FALSE;
+ BOOL bResponse = FALSE;
+ ByteString aSolarbin(getenv("SOLARBINDIR"));
+ ByteString aDelim("/");
+ ByteString aPrePro; //( aSolarbin + aDelim + ByteString("rscpp"));
+ ByteString aRsc2Name; //( aSolarbin + aDelim + ByteString("rsc2"));
+ ByteString aSrsName;
+ ByteString aResName;
+ RscStrList aInputList;
+ RscStrList aTmpList;
+ char * pStr;
+ char ** ppStr;
+ RscPtrPtr aCmdLine; // Kommandozeile
+ sal_uInt32 i;
+ ByteString* pString;
+
+ aPrePro = aSolarbin;
+ aPrePro += aDelim;
+ aPrePro += ByteString("rscpp");
+
+ aRsc2Name = aSolarbin;
+ aRsc2Name += aDelim;
+ aRsc2Name += ByteString("rsc2");
+
+ pStr = ::ResponseFile( &aCmdLine, argv, argc );
+ if( pStr )
+ {
+ printf( "Cannot open response file <%s>\n", pStr );
+ return( 1 );
+ };
+
+ ppStr = (char **)aCmdLine.GetBlock();
+ ppStr++;
+ i = 1;
+ BOOL bSetSrs = FALSE;
+ while( ppStr && i < (aCmdLine.GetCount() -1) )
+ {
+ if( '-' == **ppStr )
+ {
+ if( !rsc_stricmp( (*ppStr) + 1, "p" )
+ || !rsc_stricmp( (*ppStr) + 1, "l" ) )
+ { // kein Preprozessor
+ bPrePro = FALSE;
+ }
+ else if( !rsc_stricmp( (*ppStr) + 1, "r" )
+ || !rsc_stricmp( (*ppStr) + 1, "s" ) )
+ { // erzeugt kein .res-file
+ bResFile = FALSE;
+ }
+ else if( !rsc_stricmp( (*ppStr) + 1, "h" ) )
+ { // Hilfe anzeigen
+ bHelp = TRUE;
+ }
+ else if( !rsc_strnicmp( (*ppStr) + 1, "presponse", 9 ) )
+ { // anderer Name fuer den Preprozessor
+ bResponse = TRUE;
+ }
+ else if( !rsc_strnicmp( (*ppStr) + 1, "pp=", 3 ) )
+ { // anderer Name fuer den Preprozessor
+ aPrePro = (*ppStr) + 4;
+ }
+ else if( !rsc_strnicmp( (*ppStr) + 1, "rsc2=", 5 ) )
+ { // Accept alternate name for the rsc2 compiler
+ aRsc2Name = (*ppStr) + 6;
+ }
+ else if( !rsc_strnicmp( (*ppStr) + 1, "fo=", 3 ) )
+ { // anderer Name fuer .res-file
+ aResName = (*ppStr) + 4;
+ }
+ else if( !rsc_strnicmp( (*ppStr) + 1, "fp=", 3 ) )
+ { // anderer Name fuer .srs-file
+ bSetSrs = TRUE;
+ aSrsName = (*ppStr);
+ }
+ }
+ else
+ {
+ // Eingabedatei
+ aInputList.Insert( new ByteString( *ppStr ), CONTAINER_APPEND );
+ }
+ ppStr++;
+ i++;
+ }
+
+ if( aInputList.Count() )
+ {
+ /* build the output file names */
+ if( ! aResName.Len() )
+ aResName = OutputFile( *aInputList.First(), "res" );
+ if( ! bSetSrs )
+ {
+ aSrsName = "-fp=";
+ aSrsName += OutputFile( *aInputList.First(), "srs" );
+ }
+ };
+
+ if( bHelp )
+ {
+ bPrePro = FALSE;
+ bResFile = FALSE;
+ };
+ if( bPrePro && aInputList.Count() )
+ {
+ ByteString aTmpName;
+
+ pString = aInputList.First();
+ while( pString )
+ {
+ aTmpName = ::GetTmpFileName();
+ if( !CallPrePro( aPrePro, *pString, aTmpName, &aCmdLine, bResponse ) )
+ {
+ printf( "Error starting preprocessor\n" );
+ bError = TRUE;
+ break;
+ }
+ aTmpList.Insert( new ByteString( aTmpName ), CONTAINER_APPEND );
+ pString = aInputList.Next();
+ };
+ };
+
+ if( !bError )
+ {
+ if( !CallRsc2( aRsc2Name, bPrePro ? &aTmpList : &aInputList,
+ aSrsName, &aCmdLine ) )
+ {
+ if( !bHelp )
+ {
+ printf( "Error starting rsc2 compiler\n" );
+ bError = TRUE;
+ }
+ };
+ };
+
+ pString = aTmpList.First();
+ while( pString )
+ {
+ #if OSL_DEBUG_LEVEL > 5
+ fprintf( stderr, "leaving temp file %s\n", pString->GetBuffer() );
+ #else
+ unlink( pString->GetBuffer() );
+ #endif
+ pString = aTmpList.Next();
+ };
+
+ return( bError );
+}
+
+void RscExit( sal_uInt32 nExit )
+{
+ if( nExit )
+ printf( "Program exit is %d\n", (int)nExit );
+ exit( nExit );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */