summaryrefslogtreecommitdiff
path: root/l10ntools/source/merge.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'l10ntools/source/merge.cxx')
-rw-r--r--l10ntools/source/merge.cxx445
1 files changed, 445 insertions, 0 deletions
diff --git a/l10ntools/source/merge.cxx b/l10ntools/source/merge.cxx
new file mode 100644
index 000000000000..42f539065651
--- /dev/null
+++ b/l10ntools/source/merge.cxx
@@ -0,0 +1,445 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: merge.cxx,v $
+ * $Revision: 1.27.36.3 $
+ *
+ * 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_l10ntools.hxx"
+#include <stdio.h>
+#include <tools/fsys.hxx>
+#include "export.hxx"
+#include "utf8conv.hxx"
+#include <iostream>
+
+using namespace std;
+
+extern void ConvertHalfwitdhToFullwidth( String& rString );
+
+//
+// class PFormEntrys
+//
+
+ByteString PFormEntrys::Dump(){
+ ByteString sRet( "PFormEntrys\n" );
+ //sRet.Append( Export::DumpMap( ByteString("sText") , sText ) );
+ //sRet.Append("\n");
+ ByteString a("sText");
+ if ( sText.size() ) Export::DumpMap( a , sText );
+ return sRet;
+}
+
+/*****************************************************************************/
+BOOL PFormEntrys::GetText( ByteString &rReturn,
+ USHORT nTyp, const ByteString &nLangIndex, BOOL bDel )
+/*****************************************************************************/
+{
+
+ /*printf("DBG: PFormEntrys::GetText(nId=%s)\n",nLangIndex.GetBuffer() );
+
+ // DEBUG******************
+ ByteStringHashMap::const_iterator idbg;
+ std::cout << "HASHKEYS : \n";
+ for( idbg = sText.begin() ; idbg != sText.end(); ++idbg )
+ std::cout << (idbg->first).GetBuffer() << "\n";
+ std::cout << "\n\n";
+ std::cout << "String sText[ nLangIndex ] = " << sText[ nLangIndex ].GetBuffer() << "\n";
+ // DEBUG******************
+*/
+
+ BOOL bReturn=TRUE;
+ switch ( nTyp ) {
+ case STRING_TYP_TEXT :
+ rReturn = sText[ nLangIndex ];
+ if ( bDel )
+ sText[ nLangIndex ] = "";
+ bReturn = bTextFirst[ nLangIndex ];
+ bTextFirst[ nLangIndex ] = FALSE;
+ break;
+ case STRING_TYP_HELPTEXT :
+ rReturn = sHelpText;
+ break;
+ case STRING_TYP_QUICKHELPTEXT :
+ rReturn = sQuickHelpText[ nLangIndex ];
+ if ( bDel )
+ sQuickHelpText[ nLangIndex ] = "";
+ bReturn = bQuickHelpTextFirst[ nLangIndex ];
+ bQuickHelpTextFirst[ nLangIndex ] = FALSE;
+ break;
+ case STRING_TYP_TITLE :
+ rReturn = sTitle[ nLangIndex ];
+ if ( bDel )
+ sTitle[ nLangIndex ] = "";
+ bReturn = bTitleFirst[ nLangIndex ];
+ bTitleFirst[ nLangIndex ] = FALSE;
+ break;
+ }
+ //printf("Returning '%s'\n",rReturn.GetBuffer());
+ return bReturn;
+}
+
+
+//
+// class MergeData
+//
+
+/*****************************************************************************/
+MergeData::~MergeData()
+/*****************************************************************************/
+{
+}
+
+/*****************************************************************************/
+PFormEntrys* MergeData::GetPFormEntrys( ResData *pResData )
+/*****************************************************************************/
+{
+
+ (void) pResData; // FIXME
+ if( aMap.find( ByteString("HACK") ) != aMap.end() ){
+ return aMap[ ByteString("HACK") ];
+ }
+ else{
+ return 0;
+ }
+}
+
+void MergeData::Insert( const ByteString& rPFO , PFormEntrys* pfEntrys ){
+ (void) rPFO; // FIXME
+ aMap.insert( PFormEntrysHashMap::value_type( ByteString("HACK") , pfEntrys ) );
+
+}
+ByteString MergeData::Dump(){
+ ByteString sRet( "MergeData\n" );
+
+ printf("MergeData sTyp = %s , sGid = %s , sLid =%s , sFilename = %s\n",sTyp.GetBuffer(),sGID.GetBuffer(),sLID.GetBuffer(), sFilename.GetBuffer() );
+
+ PFormEntrysHashMap::const_iterator idbg;
+ for( idbg = aMap.begin() ; idbg != aMap.end(); ++idbg ){
+ printf("aMap[ %s ] = " ,idbg->first.GetBuffer());
+ ( (PFormEntrys*)(idbg->second) )->Dump();
+ printf("\n") ;
+ }
+ printf("\n") ;
+ return sRet;
+}
+
+PFormEntrys* MergeData::GetPFObject( const ByteString& rPFO ){
+ if( aMap.find( ByteString("HACK") ) != aMap.end() ){
+ return aMap[ rPFO ];
+ }
+ else{
+ return 0;
+ }
+}
+
+
+/*****************************************************************************/
+PFormEntrys *MergeData::InsertEntry( const ByteString &rPForm )
+/*****************************************************************************/
+{
+ PFormEntrys* pFEntrys = new PFormEntrys( rPForm );
+ aMap.insert( PFormEntrysHashMap::value_type( rPForm , pFEntrys ) );
+ return pFEntrys;
+}
+
+/*****************************************************************************/
+BOOL MergeData::operator==( ResData *pData )
+/*****************************************************************************/
+{
+ ByteString sResTyp_upper( pData->sResTyp );
+ sResTyp_upper.ToUpperAscii();
+ ByteString sTyp_upper( sTyp );
+ sTyp_upper.ToUpperAscii();
+
+ return (( pData->sId == sLID ) &&
+ ( pData->sGId == sGID ) &&
+ ( sResTyp_upper == sTyp_upper )
+ );
+}
+
+//
+// class MergeDataFile
+//
+
+#define FFORMAT_UNKNOWN 0x0000
+#define FFORMAT_NEW 0x0001
+#define FFORMAT_OLD 0x0002
+
+/*****************************************************************************/
+MergeDataFile::MergeDataFile( const ByteString &rFileName, const ByteString& sFile ,BOOL bErrLog,
+// CharSet aCharSet, BOOL bUTF8 , bool bCaseSensitive )
+ CharSet aCharSet, bool bCaseSensitive )
+
+/*****************************************************************************/
+ : bErrorLog( bErrLog )
+{
+
+ SvFileStream aInputStream( String( rFileName, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_READ );
+ aInputStream.SetStreamCharSet( aCharSet );
+ ByteString sLine;
+// printf("\nReading localize.sdf ...\n");
+ ByteString sTYP;
+ ByteString sGID;
+ ByteString sLID;
+ ByteString sPFO;
+ ByteString nLANG;
+ ByteString sTEXT;
+ ByteString sQHTEXT;
+ ByteString sTITLE;
+ ByteString sHACK("HACK");
+
+ const ByteString sEmpty("");
+
+ if( !aInputStream.IsOpen() ) {
+ printf("Warning : Can't open %s\n", rFileName.GetBuffer());
+ //exit( -1 );
+ return;
+ }
+ while ( !aInputStream.IsEof()) {
+ xub_StrLen nToks;
+ aInputStream.ReadLine( sLine );
+ sLine = sLine.Convert( RTL_TEXTENCODING_MS_1252, aCharSet );
+
+ nToks = sLine.GetTokenCount( '\t' );
+ if ( nToks == 15 ) {
+ // Skip all wrong filenames
+ ByteString filename = sLine.GetToken( 1 , '\t' );
+ filename = filename.Copy( filename.SearchCharBackward( "\\" )+1 , filename.Len() );
+
+ if( sFile.Equals( sEmpty ) || ( !sFile.Equals( sEmpty ) && filename.Equals( sFile ) ) )
+ {
+ xub_StrLen rIdx = 0;
+ sTYP = sLine.GetToken( 3, '\t', rIdx );
+ sGID = sLine.GetToken( 0, '\t', rIdx ); // 4
+ sLID = sLine.GetToken( 0, '\t', rIdx ); // 5
+ sPFO = sLine.GetToken( 1, '\t', rIdx ); // 7
+ sPFO = sHACK;
+ nLANG = sLine.GetToken( 1, '\t', rIdx ); // 9
+ sTEXT = sLine.GetToken( 0, '\t', rIdx ); // 10
+
+ sQHTEXT = sLine.GetToken( 1, '\t', rIdx ); // 12
+ sTITLE = sLine.GetToken( 0, '\t', rIdx ); // 13
+
+ nLANG.EraseLeadingAndTrailingChars();
+
+#ifdef MERGE_SOURCE_LANGUAGES
+ if( true ){
+#else
+ if ( !nLANG.EqualsIgnoreCaseAscii("en-US") ){
+#endif
+ ByteStringHashMap::const_iterator lit;
+ lit = aLanguageMap.find (nLANG);
+ ByteString aLANG;
+ if (lit == aLanguageMap.end()) {
+ aLANG = nLANG;
+ aLanguageMap.insert( ByteStringHashMap::value_type( aLANG, aLANG ) );
+ // Remember read languages for -l all switch
+ aLanguageList.push_back( nLANG );
+ } else
+ aLANG = lit->first;
+
+ InsertEntry( sTYP, sGID, sLID, sPFO, aLANG, sTEXT, sQHTEXT, sTITLE , filename , bCaseSensitive );
+ }
+ }
+ }
+ else if ( nToks == 10 ) {
+ printf("ERROR: File format is obsolete and no longer supported!\n");
+ }
+ }
+ aInputStream.Close();
+}
+/*****************************************************************************/
+MergeDataFile::~MergeDataFile()
+/*****************************************************************************/
+{
+}
+
+/*****************************************************************************/
+//void MergeDataFile::WriteErrorLog( const ByteString &rFileName )
+/*****************************************************************************/
+//{
+// DEAD
+//}
+
+ByteString MergeDataFile::Dump(){
+ ByteString sRet( "MergeDataFile\n" );
+
+ //sRet.Append( Export::DumpMap( "aLanguageSet" , aLanguageSet ) );
+ //sRet.Append( Export::DumpMap( "aLanguageList" , aLanguageList ) );
+ printf("MergeDataFile\n");
+ MergeDataHashMap::const_iterator idbg;
+ for( idbg = aMap.begin() ; idbg != aMap.end(); ++idbg ){
+ /*sRet.Append( "aMap[" );
+ sRet.Append( idbg->first );
+ sRet.Append( "]= " );
+ sRet.Append( ((MergeData*) (idbg->second))->Dump() );
+ sRet.Append("\n");*/
+
+ printf("aMap[ %s ] = ",idbg->first.GetBuffer());
+ ((MergeData*) (idbg->second))->Dump();
+ printf("\n");
+ }
+ printf("\n");
+ //sRet.Append("\n");
+ return sRet;
+}
+
+/*****************************************************************************/
+void MergeDataFile::WriteError( const ByteString &rLine )
+/*****************************************************************************/
+{
+ if ( bErrorLog ) {
+ if ( !aErrLog.IsOpen())
+ aErrLog.Open( String( sErrorLog, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC );
+ aErrLog.WriteLine( rLine );
+ }
+ else
+ fprintf( stderr, "%s\n", rLine.GetBuffer());
+}
+std::vector<ByteString> MergeDataFile::GetLanguages(){
+ return aLanguageList;
+}
+
+/*****************************************************************************/
+MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive )
+/*****************************************************************************/
+{
+ ByteString sOldG = pResData->sGId;
+ ByteString sOldL = pResData->sId;
+ ByteString sGID = pResData->sGId;
+ ByteString sLID;
+ if ( !sGID.Len())
+ sGID = pResData->sId;
+ else
+ sLID = pResData->sId;
+ pResData->sGId = sGID;
+ pResData->sId = sLID;
+
+ ByteString sKey = CreateKey( pResData->sResTyp , pResData->sGId , pResData->sId , pResData->sFilename , bCaseSensitive );
+
+ //printf("DBG: Searching [%s]\n",sKey.GetBuffer());
+ if( aMap.find( sKey ) != aMap.end() ){
+ pResData->sGId = sOldG;
+ pResData->sId = sOldL;
+ //printf("DBG: Found[%s]\n",sKey.GetBuffer());
+ return aMap[ sKey ];
+ }
+ pResData->sGId = sOldG;
+ pResData->sId = sOldL;
+ //printf("DBG: Found[%s]\n",sKey.GetBuffer());
+ return NULL;
+}
+
+
+/*****************************************************************************/
+PFormEntrys *MergeDataFile::GetPFormEntrys( ResData *pResData )
+/*****************************************************************************/
+{
+ // search for requested PFormEntrys
+ MergeData *pData = GetMergeData( pResData );
+ if ( pData )
+ return pData->GetPFormEntrys( pResData );
+ return NULL;
+}
+
+/*****************************************************************************/
+PFormEntrys *MergeDataFile::GetPFormEntrysCaseSensitive( ResData *pResData )
+/*****************************************************************************/
+{
+ // search for requested PFormEntrys
+ MergeData *pData = GetMergeData( pResData , true );
+ if ( pData )
+ return pData->GetPFormEntrys( pResData );
+ return NULL;
+}
+/*****************************************************************************/
+void MergeDataFile::InsertEntry(
+ const ByteString &rTYP, const ByteString &rGID,
+ const ByteString &rLID, const ByteString &rPFO,
+ const ByteString &nLANG, const ByteString &rTEXT,
+ const ByteString &rQHTEXT, const ByteString &rTITLE ,
+ const ByteString &rInFilename , bool bCaseSensitive
+ )
+/*****************************************************************************/
+{
+ MergeData *pData;
+ BOOL bFound = FALSE;
+
+ // uniquify the filename to save memory.
+ ByteStringHashMap::const_iterator fit = aFilenames.find (rInFilename);
+ ByteString aFilename;
+ if (fit == aFilenames.end()) {
+ aFilename = rInFilename;
+ aFilenames.insert (ByteStringHashMap::value_type (aFilename, aFilename));
+ } else
+ aFilename = fit->first;
+
+ // search for MergeData
+
+ ByteString sKey = CreateKey( rTYP , rGID , rLID , aFilename , bCaseSensitive );
+ MergeDataHashMap::const_iterator mit;
+ mit = aMap.find( sKey );
+ if( mit != aMap.end() ){
+ pData = mit->second;
+ }else{
+ pData = new MergeData( rTYP, rGID, rLID, aFilename );
+ aMap.insert( MergeDataHashMap::value_type( sKey, pData ) );
+ }
+
+ bFound = FALSE;
+ PFormEntrys *pFEntrys = 0;
+
+ // search for PFormEntrys
+
+ pFEntrys = pData->GetPFObject( rPFO );
+ if( !pFEntrys ){
+ // create new PFormEntrys, cause no one exists with current properties
+ pFEntrys = new PFormEntrys( rPFO );
+ pData->Insert( rPFO , pFEntrys );
+ }
+
+ // finaly insert the cur string
+
+ pFEntrys->InsertEntry( nLANG , rTEXT, rQHTEXT, rTITLE );
+
+ //printf("DBG: MergeDataFile::Insert[]=( sKey=%s,nLang=%s,rTEXT=%s)\n",sKey2.GetBuffer(),nLANG.GetBuffer(),rTEXT.GetBuffer());
+}
+ByteString MergeDataFile::CreateKey( const ByteString& rTYP , const ByteString& rGID , const ByteString& rLID , const ByteString& rFilename , bool bCaseSensitive ){
+
+ ByteString sKey( rTYP );
+ sKey.Append( '-' );
+ sKey.Append( rGID );
+ sKey.Append( '-' );
+ sKey.Append( rLID );
+ sKey.Append( '-' );
+ sKey.Append( rFilename );
+
+ if( bCaseSensitive ) return sKey; // officecfg case sensitive identifier
+ else return sKey.ToUpperAscii();
+}
+
+