diff options
-rw-r--r-- | rsc/source/parser/rscibas.cxx | 4 | ||||
-rw-r--r-- | rsc/source/prj/start.cxx | 2 | ||||
-rw-r--r-- | rsc/source/rsc/rsc.cxx | 165 |
3 files changed, 78 insertions, 93 deletions
diff --git a/rsc/source/parser/rscibas.cxx b/rsc/source/parser/rscibas.cxx index 75f558398bb5..f1324e922805 100644 --- a/rsc/source/parser/rscibas.cxx +++ b/rsc/source/parser/rscibas.cxx @@ -105,7 +105,7 @@ void RscLangEnum::Init( RscNameTable& rNames ) while ( NULL != ( pLangEntry = MsLangId::getIsoLangEntry( nIndex )) && ( pLangEntry->mnLang != LANGUAGE_DONTKNOW )) { #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "ISO Language in : %d %d %s\n", + fprintf( stderr, "ISO Language in : %d\n", (int)nIndex, pLangEntry->mnLang, MsLangId::convertLanguageToIsoByteString( pLangEntry->mnLang ).getStr() ); @@ -203,7 +203,7 @@ Atom RscLangEnum::AddLanguage( const char* pLang, RscNameTable& rNames ) mnLangId++; } #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "AddLanguage( %s ) = 0x%lx\n", pLang, nResult ); + fprintf( stderr, "AddLanguage( %s ) = %d\n", pLang, nResult ); #endif return nResult; } diff --git a/rsc/source/prj/start.cxx b/rsc/source/prj/start.cxx index df4ce12200c5..f4e80515c596 100644 --- a/rsc/source/prj/start.cxx +++ b/rsc/source/prj/start.cxx @@ -179,7 +179,7 @@ static BOOL CallPrePro( const ByteString& rPrePro, #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(), char **) (const char**)pCmdL->GetBlock() ); + 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 diff --git a/rsc/source/rsc/rsc.cxx b/rsc/source/rsc/rsc.cxx index 934c41d5e9a9..67b9436ca49f 100644 --- a/rsc/source/rsc/rsc.cxx +++ b/rsc/source/rsc/rsc.cxx @@ -69,12 +69,14 @@ #include <rschash.hxx> #include <osl/file.h> +#include <osl/file.hxx> #include <osl/process.h> #include <rtl/strbuf.hxx> #include <rtl/tencinfo.h> #include <rtl/textenc.h> #include <vector> +#include <algorithm> using namespace rtl; @@ -729,7 +731,7 @@ ERRTYPE RscCompiler :: IncludeParser( ULONG lFileKey ) *************************************************************************/ ERRTYPE RscCompiler :: ParseOneFile( ULONG lFileKey, const RscCmdLine::OutputFile* pOutputFile, - const WriteRcContext* pContext ) + const WriteRcContext* pContext ) { FILE * finput = NULL; ERRTYPE aError; @@ -807,13 +809,36 @@ ERRTYPE RscCompiler :: ParseOneFile( ULONG lFileKey, |* *************************************************************************/ -static OString do_prefix( const char* pPrefix, const OUString& rFile ) +namespace { - OStringBuffer aBuf(256); - aBuf.append( pPrefix ); - aBuf.append( ":" ); - aBuf.append( OUStringToOString( rFile, RTL_TEXTENCODING_MS_1252 ) ); - return aBuf.makeStringAndClear(); + using namespace ::osl; + class RscIoError { }; + static inline OUString lcl_getAbsoluteUrl(const OUString& i_sBaseUrl, const OString& i_sPath) + { + OUString sRelUrl, sAbsUrl; + if(FileBase::getFileURLFromSystemPath(OStringToOUString(i_sPath, RTL_TEXTENCODING_MS_1252), sRelUrl) != FileBase::E_None) + throw RscIoError(); + if(FileBase::getAbsoluteFileURL(i_sBaseUrl, sRelUrl, sAbsUrl) != FileBase::E_None) + throw RscIoError(); + return sAbsUrl; + }; + static inline OString lcl_getSystemPath(const OUString& i_sUrl) + { + OUString sSys; + if(FileBase::getSystemPathFromFileURL(i_sUrl, sSys) != FileBase::E_None) + throw RscIoError(); + OSL_TRACE("temporary file: %s", OUStringToOString(sSys, RTL_TEXTENCODING_UTF8).getStr()); + return OUStringToOString(sSys, RTL_TEXTENCODING_MS_1252); + }; + static inline OString lcl_getTempFile(OUString& sTempDirUrl) + { + // get a temp file name for the rc file + OUString sTempUrl; + if(FileBase::createTempFile(&sTempDirUrl, NULL, &sTempUrl) != FileBase::E_None) + throw RscIoError(); + OSL_TRACE("temporary url: %s", OUStringToOString(sTempUrl, RTL_TEXTENCODING_UTF8).getStr()); + return lcl_getSystemPath(sTempUrl); + }; } ERRTYPE RscCompiler::Link() @@ -822,12 +847,6 @@ ERRTYPE RscCompiler::Link() ERRTYPE aError; RscFile* pFName; -#ifdef UNX -#define PATHSEP '/' -#else -#define PATHSEP '\\' -#endif - if( !(pCL->nCommands & NOLINK_FLAG) ) { ::std::list<RscCmdLine::OutputFile>::const_iterator it; @@ -845,87 +864,55 @@ ERRTYPE RscCompiler::Link() } } - // rc-Datei schreiben - ByteString aDir( it->aOutputRc ); - aDir.SetToken( aDir.GetTokenCount( PATHSEP )-1, PATHSEP, ByteString() ); - if( ! aDir.Len() ) - { - char aBuf[1024]; - if( getcwd( aBuf, sizeof( aBuf ) ) ) - { - aDir = aBuf; - aDir.Append( PATHSEP ); - } - } - // work dir for absolute Urls - OUString aCWD, aTmpUrl; - osl_getProcessWorkingDir( &aCWD.pData ); - // get two temp file urls OString aRcTmp, aSysListTmp, aSysList; - OUString aSysPath, aUrlDir; - aSysPath = OStringToOUString( aDir, RTL_TEXTENCODING_MS_1252 ); - if( osl_getFileURLFromSystemPath( aSysPath.pData, &aUrlDir.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "url conversion", aUrlDir ) ); - - if( osl_getAbsoluteFileURL( aCWD.pData, aUrlDir.pData, &aTmpUrl.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "absolute url", aUrlDir ) ); - aUrlDir = aTmpUrl; - - // create temp file for rc target - if( osl_createTempFile( aUrlDir.pData, NULL, &aTmpUrl.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "temp file creation", aUrlDir ) ); + try + { + OUString sPwdUrl; + osl_getProcessWorkingDir( &sPwdUrl.pData ); + OUString sRcUrl = lcl_getAbsoluteUrl(sPwdUrl, it->aOutputRc); + // TempDir is either the directory where the rc file is located or pwd + OUString sTempDirUrl = sRcUrl.copy(0,sRcUrl.lastIndexOf('/')); + OSL_TRACE("rc directory URL: %s", OUStringToOString(sTempDirUrl, RTL_TEXTENCODING_UTF8).getStr()); + + aRcTmp = lcl_getTempFile(sTempDirUrl); + OSL_TRACE("temporary rc file: %s", aRcTmp.getStr()); + + OUString sOilDirUrl; + if(pCL->aILDir.Len()) + sOilDirUrl = lcl_getAbsoluteUrl(sPwdUrl, pCL->aILDir); + else + sOilDirUrl = sTempDirUrl; + OSL_TRACE("ilst directory URL: %s", OUStringToOString(sOilDirUrl, RTL_TEXTENCODING_UTF8).getStr()); - if( osl_getSystemPathFromFileURL( aTmpUrl.pData, &aSysPath.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "sys path conversion", aTmpUrl ) ); - aRcTmp = OUStringToOString( aSysPath, RTL_TEXTENCODING_MS_1252 ); + aSysListTmp = lcl_getTempFile(sOilDirUrl); + OSL_TRACE("temporary ilst file: %s", aSysListTmp.getStr()); - if ( NULL == (fExitFile = foutput = fopen( aRcTmp.getStr(), "wb" )) ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), aRcTmp.getStr() ); + OUString sIlstUrl, sIlstSys; + sIlstUrl = sRcUrl.copy(sRcUrl.lastIndexOf('/')+1); + sIlstUrl = sIlstUrl.copy(0,sIlstUrl.lastIndexOf('.')); + sIlstUrl += OUString::createFromAscii(".ilst"); + sIlstUrl = lcl_getAbsoluteUrl(sOilDirUrl, OUStringToOString(sIlstUrl, RTL_TEXTENCODING_UTF8)); - // make absolute path from IL dir (-oil switch) - // if no -oil was given, use the same dir as for rc file - if( pCL->aILDir.Len() ) + aSysList = lcl_getSystemPath(sIlstUrl); + OSL_TRACE("ilst file: %s", aSysList.getStr()); + } + catch (RscIoError&) { - aSysPath = OStringToOUString( pCL->aILDir, RTL_TEXTENCODING_MS_1252 ); - if( osl_getFileURLFromSystemPath( aSysPath.pData, &aTmpUrl.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "url conversion", aSysPath ) ); - if( osl_getAbsoluteFileURL( aCWD.pData, aTmpUrl.pData, &aUrlDir.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "absolute url", aTmpUrl ) ); + OString sMsg("Error with paths:\n"); + sMsg += "temporary rc file: " + aRcTmp + "\n"; + sMsg += "temporary ilst file: " + aSysListTmp + "\n"; + sMsg += "ilst file: " + aSysList + "\n"; + pTC->pEH->FatalError(ERR_OPENFILE, RscId(), sMsg); } - - if( osl_getSystemPathFromFileURL( aUrlDir.pData, &aSysPath.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "sys path conversion", aUrlDir ) ); - - aSysList = OUStringToOString( aSysPath, RTL_TEXTENCODING_MS_1252 ); - aSysList = aSysList + "/"; - xub_StrLen nLastSep = it->aOutputRc.SearchBackward( PATHSEP ); - if( nLastSep == STRING_NOTFOUND ) - nLastSep = 0; - xub_StrLen nLastPt = it->aOutputRc.Search( '.', nLastSep ); - if( nLastPt == STRING_NOTFOUND ) - nLastPt = it->aOutputRc.Len()+1; - aSysList = aSysList + it->aOutputRc.Copy( nLastSep+1, nLastPt - nLastSep-1 ); - aSysList = aSysList + ".ilst"; - // create temp file for sys list target - if( osl_createTempFile( aUrlDir.pData, NULL, &aTmpUrl.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "temp file creation", aUrlDir ) ); - - if( osl_getSystemPathFromFileURL( aTmpUrl.pData, &aSysPath.pData ) != osl_File_E_None ) - pTC->pEH->FatalError( ERR_OPENFILE, RscId(), do_prefix( "sys path conversion", aTmpUrl ) ); - aSysListTmp = OUStringToOString( aSysPath, RTL_TEXTENCODING_MS_1252 ); - - pTC->pEH->StdOut( "Generating .rc file\n" ); - - rtl_TextEncoding aEnc = RTL_TEXTENCODING_UTF8; - //if( it->aLangName.CompareIgnoreCaseToAscii( "de", 2 ) == COMPARE_EQUAL ) - // aEnc = RTL_TEXTENCODING_MS_1252; + if ( NULL == (fExitFile = foutput = fopen( aRcTmp.getStr(), "wb" )) ) + pTC->pEH->FatalError( ERR_OPENFILE, RscId(), aRcTmp.getStr() ); // Schreibe Datei sal_Char cSearchDelim = ByteString( DirEntry::GetSearchDelimiter(), RTL_TEXTENCODING_ASCII_US ).GetChar( 0 ); sal_Char cAccessDelim = ByteString( DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US ).GetChar( 0 ); pTC->ChangeLanguage( it->aLangName ); - pTC->SetSourceCharSet( aEnc ); + pTC->SetSourceCharSet( RTL_TEXTENCODING_UTF8 ); pTC->ClearSysNames(); ByteString aSysSearchPath( it->aLangSearchPath ); xub_StrLen nIndex = 0; @@ -941,9 +928,7 @@ ERRTYPE RscCompiler::Link() aSysSearchPath.Append( cSearchDelim ); aSysSearchPath.Append( aToken ); } -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "setting search path for language %s: %s\n", it->aLangName.GetBuffer(), aSysSearchPath.GetBuffer() ); -#endif + OSL_TRACE( "setting search path for language %s: %s\n", it->aLangName.GetBuffer(), aSysSearchPath.GetBuffer() ); pTC->SetSysSearchPath( aSysSearchPath ); WriteRcContext aContext; @@ -1158,7 +1143,7 @@ void RscCompiler::OpenInput( const ByteString& rInput ) |*************************************************************************/ bool RscCompiler::GetImageFilePath( const RscCmdLine::OutputFile& rOutputFile, - const WriteRcContext& rContext, + const WriteRcContext& rContext, const ByteString& rBaseFileName, ByteString& rImagePath, FILE* pSysListFile ) @@ -1248,9 +1233,9 @@ bool RscCompiler::GetImageFilePath( const RscCmdLine::OutputFile& rOutputFile, // ------------------------------------------------------------------------------ void RscCompiler::PreprocessSrsFile( const RscCmdLine::OutputFile& rOutputFile, - const WriteRcContext& rContext, - const DirEntry& rSrsInPath, - const DirEntry& rSrsOutPath ) + const WriteRcContext& rContext, + const DirEntry& rSrsInPath, + const DirEntry& rSrsOutPath ) { SvFileStream aIStm( rSrsInPath.GetFull(), STREAM_READ ); SvFileStream aOStm( rSrsOutPath.GetFull(), STREAM_WRITE | STREAM_TRUNC ); @@ -1358,7 +1343,7 @@ void RscCompiler::PreprocessSrsFile( const RscCmdLine::OutputFile& rOutputFile, } aOStm.WriteLine( "};" ); - } + } else aOStm.WriteLine( aLine ); } |