diff options
Diffstat (limited to 'rsc/source/prj/start.cxx')
-rw-r--r-- | rsc/source/prj/start.cxx | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/rsc/source/prj/start.cxx b/rsc/source/prj/start.cxx new file mode 100644 index 000000000000..fda87c6a407a --- /dev/null +++ b/rsc/source/prj/start.cxx @@ -0,0 +1,495 @@ +/************************************************************************* + * + * $RCSfile: start.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 16:42:55 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#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 +#ifndef MAC +#include <io.h> +#include <process.h> +#if defined ( OS2 ) && !defined ( GCC ) +#include <direct.h> +#endif +#ifndef CSET +#include <dos.h> +#endif +#endif +#endif + +#ifndef _RSCTOOLS_HXX +#include <rsctools.hxx> +#endif +#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; + /* + union wait rc; + rc.w_status = 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; + short i, nExit; + FILE* fRspFile = NULL; + ByteString aRspFileName; + + if( bResponse ) + { + aRspFileName = ::GetTmpFileName(); + fRspFile = fopen( aRspFileName.GetBuffer(), "w" ); + } + + if( !fRspFile ) + aNewCmdL.Append( RscMem::Assignsw( rPrePro.GetBuffer(), 0 ) ); + for( i = 1; i < (short)(pCmdLine->GetCount() -1); i++ ){ + 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( + RscMem::Assignsw( (char *)pCmdLine->GetEntry( i ), 0 ) ); + } + }; + aNewCmdL.Append( RscMem::Assignsw( rInput.GetBuffer(), 0 ) ); + aNewCmdL.Append( RscMem::Assignsw( rOutput.GetBuffer(), 0 ) ); + aNewCmdL.Append( (void *)0 ); + + printf( "Preprocessor commandline: " ); + for( i = 0; i < (short)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); + + if( fRspFile ) + { + aRespCmdL.Append( RscMem::Assignsw( rPrePro.GetBuffer(), 0 ) ); + ByteString aTmpStr( '@' ); + aTmpStr += aRspFileName; + aRespCmdL.Append( RscMem::Assignsw( aTmpStr.GetBuffer(), 0 ) ); + aRespCmdL.Append( (void *)0 ); + + pCmdL = &aRespCmdL; + for( i = 0; i < (short)(aNewCmdL.GetCount() -1); i++ ) + { + fprintf( fRspFile, "%s ", (const char *)aNewCmdL.GetEntry( i ) ); + } + fclose( fRspFile ); + + printf( "Preprocessor startline: " ); + for( i = 0; i < (short)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); + } + +#if ((defined PM2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX + nExit = spawnvp( P_WAIT, rPrePro.GetBuffer(), (char* const*)pCmdL->GetBlock() ); +#elif defined CSET + nExit = spawnvp( P_WAIT, (char*)rPrePro.GetBuffer(), char **) (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 ) + unlink( aRspFileName.GetBuffer() ); + if ( nExit ) + return FALSE; + + return TRUE; +} + + +/************************************************************************* +|* CallRsc2 +|* +|* Beschreibung +*************************************************************************/ +static BOOL CallRsc2( ByteString aRsc2Name, + RscStrList * pInputList, + ByteString aSrsName, + ByteString aRcName, + RscPtrPtr * pCmdLine ) +{ + RscPtrPtr aNewCmdL; // Kommandozeile + short i, nExit; + ByteString* pString; + ByteString aRspFileName; // Response-Datei + FILE * fRspFile; // Response-Datei + + aRspFileName = ::GetTmpFileName(); + fRspFile = fopen( aRspFileName.GetBuffer(), "w" ); + + printf( "Rsc2 commandline: " ); + aNewCmdL.Append( RscMem::Assignsw( aRsc2Name.GetBuffer(), 0 ) ); + printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); + printf( " " ); + ByteString aTmpStr( '@' ); + aTmpStr += aRspFileName; + aNewCmdL.Append( RscMem::Assignsw( aTmpStr.GetBuffer(), 0 ) ); + printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); + aNewCmdL.Append( (void *)0 ); + printf( "\n" ); + + if( fRspFile ) + { + for( i = 1; i < (short)(pCmdLine->GetCount() -1); i++ ) + { + if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fp", 3 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fo", 3 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fs", 3 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-pp", 3 ) + || !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" ) + || ( '-' != *(char *)pCmdLine->GetEntry( i ) ) ) + { + } + else + fprintf( fRspFile, "%s ", + (const char *)pCmdLine->GetEntry( i ) ); + }; + + fprintf( fRspFile, "%s -fs%s", + aSrsName.GetBuffer(), aRcName.GetBuffer() ); + + pString = pInputList->First(); + while( pString ) + { + fprintf( fRspFile, " %s", pString->GetBuffer() ); + pString = pInputList->Next(); + }; + + fclose( fRspFile ); + }; + +#if ((defined PM2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX + 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 ) + unlink( aRspFileName.GetBuffer() ); + if( nExit ) + return( FALSE ); + return( TRUE ); +} + +/************************************************************************* +|* CallRes +|* +|* Beschreibung +*************************************************************************/ +static BOOL CallRes( ByteString aRcName, ByteString aResName ) +{ + short nExit; + + unlink( aResName.GetBuffer() ); // Zieldatei loeschen + printf( "Copy %s to %s\n", aRcName.GetBuffer(), aResName.GetBuffer() ); + if( !Append( aResName, aRcName ) ) + { + printf( "Cannot open file <%s or %s>\n", + aResName.GetBuffer(), aRcName.GetBuffer() ); + nExit = 1; + } + else + nExit = 0; + return( nExit == 0 ); +} + +/************************************************************************* +|* +|* main() +|* +|* Beschreibung +|* Ersterstellung MM 05.09.91 +|* Letzte Aenderung MM 05.09.91 +|* +*************************************************************************/ +#if defined UNX || (defined PM2 && (defined CSET || defined GCC )) || defined WTC || defined MTW || defined ICC +int main ( int argc, char ** argv) +{ +#else +int cdecl main ( int argc, char ** argv) +{ +#endif + + BOOL bPrePro = TRUE; + BOOL bResFile = TRUE; + BOOL bHelp = FALSE; + BOOL bError = FALSE; + BOOL bResponse = FALSE; + ByteString aPrePro( "rscpp" ); + ByteString aRsc2Name( "rsc2" ); + ByteString aSrsName; + ByteString aRcName; + ByteString aResName; + RscStrList aInputList; + RscStrList aTmpList; + char * pStr; + char ** ppStr; + RscPtrPtr aCmdLine; // Kommandozeile + USHORT i; + ByteString* pString; + + printf( "VCL Resource Compiler 3.0\n" ); + + 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 < (USHORT)(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", 2 ) ) + { // anderer Name fuer den Preprozessor + aPrePro = (*ppStr) + 3; + } + else if( !rsc_strnicmp( (*ppStr) + 1, "fo", 2 ) ) + { // anderer Name fuer .res-file + aResName = (*ppStr) + 3; + } + else if( !rsc_strnicmp( (*ppStr) + 1, "fs", 2 ) ) + { // anderer Name fuer .rc-file + aRcName = (*ppStr) + 3; + } + else if( !rsc_strnicmp( (*ppStr) + 1, "fp", 2 ) ) + { // 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( ! aRcName.Len() ) + aRcName = OutputFile( *aInputList.First(), "rc" ); + 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, aRcName, &aCmdLine ) ) + { + if( !bHelp ) + { + printf( "Error starting rsc2 compiler\n" ); + bError = TRUE; + } + }; + }; + + pString = aTmpList.First(); + while( pString ) + { + unlink( pString->GetBuffer() ); + pString = aTmpList.Next(); + }; + + if( !bError && bResFile ) + { + if( !CallRes( aRcName, aResName ) ) + { + printf( "Error in system resource compiler\n" ); + bError = TRUE; + } + else + unlink( aRcName.GetBuffer() ); + }; + + return( bError ); +} + +void RscExit( USHORT nExit ) +{ + if( nExit ) + printf( "Program exit is %d\n", nExit ); + exit( nExit ); +} |