office-gobmx/transex3/source/wrdtrans.cxx
Jens-Heiner Rechtien c5f5378466 INTEGRATION: CWS rcmerge (1.2.6); FILE MERGED
2003/06/11 09:57:38 nf 1.2.6.1: #i13369# removed warnings
2003-06-13 10:40:56 +00:00

275 lines
8.1 KiB
C++

/*************************************************************************
*
* $RCSfile: wrdtrans.cxx,v $
*
* $Revision: 1.3 $
*
* last change: $Author: hr $ $Date: 2003-06-13 11:40:56 $
*
* 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 "wrdtrans.hxx"
// NOT FULLY DECLARED SERVICES
#include <vector>
#include <vos/macros.hxx>
#include <tools/stream.hxx>
#include "wtratree.hxx"
#include <tools/string.hxx>
//************** Declaration WordTrans_ErrorList ******************//
typedef NAMESPACE_STD(vector)<ByteString> Stl_ByteStringList;
class WordTrans_ErrorList
{
public:
// OPERATIONS
void AddError(
WordTransformer::E_Error
i_eType,
const char * i_sErrorDescription );
void Clear(); /// Empties the list.
// INQUIRY
USHORT NrOfErrors() const;
WordTransformer::E_Error
GetError(
USHORT i_nNr, /// [0 .. NrOfErrors()-1], other values return an empty error.
ByteString * o_pErrorText ) const; /// If o_pErrorText != 0, the String is filled with the description of the error.
private:
// DATA
Stl_ByteStringList aErrors;
};
//************** Implementation WordTransformer ******************//
WordTransformer::WordTransformer()
: dpTransformer(0),
dpErrors(new WordTrans_ErrorList)
{
}
WordTransformer::~WordTransformer()
{
if (dpTransformer != 0)
delete dpTransformer;
delete dpErrors;
}
BOOL
WordTransformer::LoadWordlist( const ByteString & i_sWordlist_Filepath,
CharSet i_nWorkingCharSet,
CharSet i_nFileCharSet )
{
if (dpTransformer != 0)
return FALSE;
SvFileStream aFile(String(i_sWordlist_Filepath,RTL_TEXTENCODING_ASCII_US),STREAM_STD_READ);
if (! aFile.IsOpen())
return FALSE;
aFile.SetStreamCharSet( i_nFileCharSet ) ;
// aFile.SetTargetCharSet( i_nWorkingCharSet );
dpTransformer = new WordTransTree;
ByteString sTrans;
while ( aFile.ReadLine(sTrans) )
{
dpTransformer->AddWordPair(sTrans.GetToken(0,';'),sTrans.GetToken(1,';'));
}
aFile.Close();
return TRUE;
}
USHORT
WordTransformer::Transform(ByteString & io_sText)
{
// Initialization and precondition testing:
dpErrors->Clear();
if (dpTransformer == 0)
{
dpErrors->AddError(ERROR_NO_WORDLIST,"Error: No wordlist was loaded.");
return dpErrors->NrOfErrors();
}
else if (io_sText.Len() > 63 * 1024)
{
dpErrors->AddError(ERROR_OUTPUTSTRING_TOO_LONG,"Error: Inputstring was too long (bigger than 63 KB).");
return dpErrors->NrOfErrors();
}
else if (io_sText.Len() == 0)
{
return 0;
}
// Transform:
dpTransformer->InitTransformation(
io_sText.GetBuffer(),
io_sText.Len() );
for ( ; !dpTransformer->TextEndReached(); )
{
if (dpTransformer->TransformNextToken() != WordTransTree::OK)
{
CreateError();
}
}
io_sText = dpTransformer->Output();
return dpErrors->NrOfErrors();
}
USHORT
WordTransformer::NrOfErrors() const
{
return dpErrors->NrOfErrors();
}
WordTransformer::E_Error
WordTransformer::GetError( USHORT i_nNr,
ByteString * o_pErrorText) const
{
return dpErrors->GetError(i_nNr,o_pErrorText);
}
void
WordTransformer::CreateError()
{
ByteString sErr;
switch (dpTransformer->CurResult())
{
case WordTransTree::OK:
break;
case WordTransTree::HOTKEY_LOST:
sErr = ByteString("Error: By replacement of string ");
sErr += dpTransformer->CurReplacedString();
sErr += " by ";
sErr += dpTransformer->CurReplacingString();
sErr += "the hotkey at char '";
sErr += dpTransformer->CurHotkey();
sErr += "' was lost.";
dpErrors->AddError( ERROR_HOTKEY,sErr.GetBufferAccess());
sErr.ReleaseBufferAccess();
break;
case WordTransTree::OUTPUT_OVERFLOW:
dpErrors->AddError(ERROR_OUTPUTSTRING_TOO_LONG,"Error: Output buffer overflow.");
break;
default:
dpErrors->AddError(OTHER_ERROR,"Error: Unknown error.");
}
}
//************** Implementation WordTrans_ErrorList ******************//
void
WordTrans_ErrorList::AddError( WordTransformer::E_Error i_eType,
const char * i_sErrorDescription )
{
ByteString sErrorType = "xxx";
char * pErrorChars = sErrorType.GetBufferAccess();
pErrorChars[0] = char(i_eType / 100 + '0');
pErrorChars[1] = char( (i_eType % 100) / 10 + '0');
pErrorChars[2] = char(i_eType % 10 + '0');
sErrorType += i_sErrorDescription;
aErrors.push_back(sErrorType);
sErrorType.ReleaseBufferAccess();
}
void
WordTrans_ErrorList::Clear()
{
aErrors.erase(aErrors.begin(),aErrors.end());
}
USHORT
WordTrans_ErrorList::NrOfErrors() const
{
return aErrors.size();
}
WordTransformer::E_Error
WordTrans_ErrorList::GetError( USHORT i_nNr,
ByteString * o_pErrorText ) const
{
if ( i_nNr < aErrors.size() )
{
const ByteString & rError = aErrors[i_nNr];
const char * pErrorChars = rError.GetBuffer();
USHORT nError = USHORT( (pErrorChars[0] - '0') ) * 100
+ (pErrorChars[1] - '0') * 10
+ pErrorChars[2] - '0';
if (o_pErrorText != 0)
*o_pErrorText = pErrorChars+3;
return WordTransformer::E_Error(nError);
}
else
{
if (o_pErrorText != 0)
*o_pErrorText = "";
return WordTransformer::OK;
}
}