diff options
-rw-r--r-- | l10ntools/inc/tagtest.hxx | 38 | ||||
-rw-r--r-- | l10ntools/source/gsicheck.cxx | 307 | ||||
-rw-r--r-- | l10ntools/source/helper.hxx | 47 | ||||
-rw-r--r-- | l10ntools/source/makefile.mk | 2 | ||||
-rw-r--r-- | l10ntools/source/tagtest.cxx | 93 |
5 files changed, 269 insertions, 218 deletions
diff --git a/l10ntools/inc/tagtest.hxx b/l10ntools/inc/tagtest.hxx index b77e260d3a4f..b546be2bab1e 100644 --- a/l10ntools/inc/tagtest.hxx +++ b/l10ntools/inc/tagtest.hxx @@ -34,9 +34,9 @@ class GSILine; -typedef sal_uInt16 TokenId; +typedef sal_Int32 TokenId; -#define TOK_INVALIDPOS sal_uInt16( 0xFFFF ) +#define TOK_INVALIDPOS (-1) class ParserMessage; typedef ::std::vector< ParserMessage* > Impl_ParserMessageList; @@ -64,12 +64,12 @@ public: rtl::OUString aTokenString; TokenId nId; - sal_uInt16 nPos; // Position in String + sal_Int32 nPos; // Position in String TokenInfo():bClosed(sal_False),bCloseTag(sal_False),bIsBroken(sal_False),bHasBeenFixed(sal_False),bDone(sal_False),nId( 0 ){;} -explicit TokenInfo( TokenId pnId, sal_uInt16 nP ):bClosed(sal_False),bCloseTag(sal_False),bIsBroken(sal_False),bHasBeenFixed(sal_False),bDone(sal_False),nId( pnId ),nPos(nP){;} - explicit TokenInfo( TokenId pnId, sal_uInt16 nP, rtl::OUString const & paStr ):bClosed(sal_False),bCloseTag(sal_False),bIsBroken(sal_False),bHasBeenFixed(sal_False),bDone(sal_False),aTokenString( paStr ),nId( pnId ),nPos(nP) {;} - explicit TokenInfo( TokenId pnId, sal_uInt16 nP, rtl::OUString const & paStr, ParserMessageList &rErrorList ); +explicit TokenInfo( TokenId pnId, sal_Int32 nP ):bClosed(sal_False),bCloseTag(sal_False),bIsBroken(sal_False),bHasBeenFixed(sal_False),bDone(sal_False),nId( pnId ),nPos(nP){;} + explicit TokenInfo( TokenId pnId, sal_Int32 nP, rtl::OUString const & paStr ):bClosed(sal_False),bCloseTag(sal_False),bIsBroken(sal_False),bHasBeenFixed(sal_False),bDone(sal_False),aTokenString( paStr ),nId( pnId ),nPos(nP) {;} + explicit TokenInfo( TokenId pnId, sal_Int32 nP, rtl::OUString const & paStr, ParserMessageList &rErrorList ); rtl::OUString GetTagName() const; @@ -107,8 +107,8 @@ private: public: ~ParserMessageList() { clear(); } - void AddError( sal_uInt16 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ); - void AddWarning( sal_uInt16 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ); + void AddError( sal_Int32 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ); + void AddWarning( sal_Int32 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ); sal_Bool HasErrors(); bool empty() const { return maList.empty(); } @@ -242,19 +242,19 @@ public: class ParserMessage { - sal_uInt16 nErrorNr; + sal_Int32 nErrorNr; rtl::OString aErrorText; - sal_uInt16 nTagBegin,nTagLength; + sal_Int32 nTagBegin,nTagLength; protected: - ParserMessage( sal_uInt16 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); + ParserMessage( sal_Int32 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); public: - sal_uInt16 GetErrorNr() { return nErrorNr; } + sal_Int32 GetErrorNr() { return nErrorNr; } rtl::OString GetErrorText() { return aErrorText; } - sal_uInt16 GetTagBegin() { return nTagBegin; } - sal_uInt16 GetTagLength() { return nTagLength; } + sal_Int32 GetTagBegin() { return nTagBegin; } + sal_Int32 GetTagLength() { return nTagLength; } virtual ~ParserMessage() {} virtual sal_Bool IsError() =0; @@ -264,7 +264,7 @@ public: class ParserError : public ParserMessage { public: - ParserError( sal_uInt16 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); + ParserError( sal_Int32 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); virtual sal_Bool IsError() {return sal_True;} virtual rtl::OString Prefix() {return rtl::OString(RTL_CONSTASCII_STRINGPARAM("Error:")); } @@ -273,7 +273,7 @@ public: class ParserWarning : public ParserMessage { public: - ParserWarning( sal_uInt16 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); + ParserWarning( sal_Int32 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ); virtual sal_Bool IsError() {return sal_False;} virtual rtl::OString Prefix() {return rtl::OString(RTL_CONSTASCII_STRINGPARAM("Warning:")); } @@ -282,14 +282,14 @@ public: class SimpleParser { private: - sal_uInt16 nPos; + sal_Int32 nPos; rtl::OUString aSource; rtl::OUString aLastToken; TokenList aTokenList; TokenInfo aNextTag; // to store closetag in case of combined tags like <br/> - rtl::OUString GetNextTokenString( ParserMessageList &rErrorList, sal_uInt16 &rTokeStartPos ); + rtl::OUString GetNextTokenString( ParserMessageList &rErrorList, sal_Int32 &rTokeStartPos ); public: SimpleParser(); @@ -303,7 +303,7 @@ class TokenParser { sal_Bool match( const TokenInfo &aCurrentToken, const TokenId &aExpectedToken ); sal_Bool match( const TokenInfo &aCurrentToken, const TokenInfo &aExpectedToken ); - void ParseError( sal_uInt16 nErrNr, const rtl::OString &rErrMsg, const TokenInfo &rTag ); + void ParseError( sal_Int32 nErrNr, const rtl::OString &rErrMsg, const TokenInfo &rTag ); void Paragraph(); void PfCase(); void PfCaseBegin(); diff --git a/l10ntools/source/gsicheck.cxx b/l10ntools/source/gsicheck.cxx index 9fec6bf425e0..9405a9176896 100644 --- a/l10ntools/source/gsicheck.cxx +++ b/l10ntools/source/gsicheck.cxx @@ -28,23 +28,46 @@ #include "sal/config.h" +#include <algorithm> +#include <cassert> #include <cstddef> #include <fstream> #include <string> #include <stdio.h> -#include <tools/fsys.hxx> #include <rtl/strbuf.hxx> -#include <comphelper/string.hxx> #include "helper.hxx" #include "tagtest.hxx" #include "gsicheck.hxx" -using comphelper::string::getToken; -using comphelper::string::getTokenCount; +namespace { -#define MAX_GID_LID_LEN 250 +sal_Int32 const MAX_GID_LID_LEN = 250; + +rtl::OString copyUpTo( + rtl::OString const & text, sal_Int32 start, sal_Int32 maximumLength) +{ + assert(start >= 0 && start <= text.getLength()); + return text.copy(start, std::min(text.getLength() - start, maximumLength)); +} + +rtl::OString addSuffix( + rtl::OString const & pathname, rtl::OString const & suffix) +{ + sal_Int32 n = pathname.lastIndexOf('.'); + if (n == -1) { + fprintf( + stderr, + ("Error: pathname \"%s\" does not contain dot to add suffix in" + " front of\n"), + pathname.getStr()); + exit(EXIT_FAILURE); + } + return pathname.replaceAt(n, 0, suffix); +} + +} /*****************************************************************************/ void PrintMessage( rtl::OString const & aType, rtl::OString const & aMsg, rtl::OString const & aPrefix, @@ -69,30 +92,20 @@ void PrintError( rtl::OString const & aMsg, rtl::OString const & aPrefix, PrintMessage( "Error:", aMsg, aPrefix, aContext, bPrintContext, nLine, aUniqueId ); } -sal_Bool LanguageOK( rtl::OString const & aLang ) +bool LanguageOK( rtl::OString const & aLang ) { - if (aLang.isEmpty()) - return sal_False; - - using comphelper::string::isdigitAsciiString; - using comphelper::string::isupperAsciiString; - using comphelper::string::islowerAsciiString; - - if (isdigitAsciiString(aLang)) - return sal_True; - - if ( getTokenCount(aLang, '-') == 1 ) - return islowerAsciiString(aLang); - else if ( getTokenCount(aLang, '-') == 2 ) - { - rtl::OString aTok0( getToken(aLang, 0, '-') ); - rtl::OString aTok1( getToken(aLang, 1, '-') ); - return !aTok0.isEmpty() && islowerAsciiString(aTok0) - && !aTok1.isEmpty() && isupperAsciiString(aTok1) - && !aTok1.equalsIgnoreAsciiCase( aTok0 ); + sal_Int32 n = 0; + rtl::OString t0(aLang.getToken(0, '-', n)); + if (n == -1) { + return !t0.isEmpty() + && (helper::isAllAsciiDigits(t0) + || helper::isAllAsciiLowerCase(t0)); } - - return sal_False; + rtl::OString t1(aLang.getToken(0, '-', n)); + return n == -1 + && !t0.isEmpty() && helper::isAllAsciiLowerCase(t0) + && !t1.isEmpty() && helper::isAllAsciiUpperCase(t1) + && !t0.equalsIgnoreAsciiCase(t1); } class LazyStream: public std::ofstream @@ -144,51 +157,67 @@ GSILine::GSILine( const rtl::OString &rLine, std::size_t nLine ) , bFixed ( sal_False ) , data_( rLine ) { - if ( getTokenCount(rLine, '\t') == 15 ) - { - aFormat = FORMAT_SDF; - aUniqId = getToken(rLine, 0, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 1, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 3, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 4, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 5, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 6, '\t'); - aUniqId += "/"; - aUniqId += getToken(rLine, 7, '\t'); - aLineType = ""; - aLangId = getToken(rLine, 9, '\t'); - aText = getToken(rLine, 10, '\t'); - aQuickHelpText = getToken(rLine, 12, '\t'); - aTitle = getToken(rLine, 13, '\t'); - - // do some more format checks here - if (!comphelper::string::isdigitAsciiString(getToken(rLine, 8, '\t'))) - { - PrintError( "The length field does not contain a number!", "Line format", getToken(rLine, 8, '\t'), sal_True, GetLineNumber(), GetUniqId() ); - NotOK(); - } - if ( !LanguageOK( aLangId ) ) - { - PrintError( "The Language is invalid!", "Line format", aLangId, sal_True, GetLineNumber(), GetUniqId() ); - NotOK(); - } - // limit GID and LID to MAX_GID_LID_LEN chars each for database conformity, see #137575# - if ( getToken(rLine, 4, '\t').getLength() > MAX_GID_LID_LEN || getToken(rLine, 5, '\t').getLength() > MAX_GID_LID_LEN ) - { - PrintError(rtl::OStringBuffer(RTL_CONSTASCII_STRINGPARAM("GID and LID may only be ")) - .append(static_cast<sal_Int32>(MAX_GID_LID_LEN)) - .append(RTL_CONSTASCII_STRINGPARAM(" chars long each!" )).getStr(), - "Line format", aLangId, sal_True, GetLineNumber(), GetUniqId()); - NotOK(); - } + if (rLine.isEmpty()) { + NotOK(); + return; } - else + + aFormat = FORMAT_SDF; + sal_Int32 n = 0; + aUniqId = rLine.getToken(0, '\t', n); // token 0 + aUniqId += "/"; + aUniqId += rLine.getToken(0, '\t', n); // token 1 + aUniqId += "/"; + aUniqId += rLine.getToken(1, '\t', n); // token 3 + aUniqId += "/"; + rtl::OString gid(rLine.getToken(0, '\t', n)); // token 4 + aUniqId += gid; + aUniqId += "/"; + rtl::OString lid(rLine.getToken(0, '\t', n)); // token 5 + aUniqId += lid; + aUniqId += "/"; + aUniqId += rLine.getToken(0, '\t', n); // token 6 + aUniqId += "/"; + aUniqId += rLine.getToken(0, '\t', n); // token 7 + rtl::OString length(rLine.getToken(0, '\t', n)); // token 8 + aLineType = rtl::OString(); + aLangId = rLine.getToken(0, '\t', n); // token 9 + aText = rLine.getToken(0, '\t', n); // token 10 + aQuickHelpText = rLine.getToken(1, '\t', n); // token 12 + aTitle = rLine.getToken(0, '\t', n); // token 13 + if (n == -1) { + NotOK(); + return; + } + rLine.getToken(0, '\t', n); // token 14 + if (n != -1) { + NotOK(); + return; + } + + // do some more format checks here + if (!helper::isAllAsciiDigits(length)) { + PrintError( + "The length field does not contain a number!", "Line format", + length, true, GetLineNumber(), GetUniqId()); + NotOK(); + } + if (!LanguageOK(aLangId)) { + PrintError( + "The Language is invalid!", "Line format", aLangId, true, + GetLineNumber(), GetUniqId()); + NotOK(); + } + // Limit GID and LID to MAX_GID_LID_LEN chars each for database conformity, + // see #137575#: + if (gid.getLength() > MAX_GID_LID_LEN || lid.getLength() > MAX_GID_LID_LEN) { + PrintError( + (rtl::OString( + RTL_CONSTASCII_STRINGPARAM("GID and LID may only be ")) + + rtl::OString::valueOf(MAX_GID_LID_LEN) + + rtl::OString(RTL_CONSTASCII_STRINGPARAM(" chars long each"))), + "Line format", aLangId, true, GetLineNumber(), GetUniqId()); NotOK(); } } @@ -204,30 +233,31 @@ void GSILine::NotOK() void GSILine::ReassembleLine() /*****************************************************************************/ { - if ( GetLineFormat() == FORMAT_SDF ) - { - rtl::OStringBuffer aReassemble; - for (sal_Int32 i = 0; i < 10; ++i) - { - aReassemble.append( helper::getToken( data_, i, '\t' ) ); - aReassemble.append( "\t" ); - } - aReassemble.append( aText ); - aReassemble.append( "\t" ); - aReassemble.append( helper::getToken( data_, 11, '\t' ) ); // should be empty but there are some places in sc. Not reflected to sources!! - aReassemble.append( "\t" ); - aReassemble.append( aQuickHelpText ); - aReassemble.append( "\t" ); - aReassemble.append( aTitle ); - for (sal_Int32 i = 14; i < 15; ++i) - { - aReassemble.append( "\t" ); - aReassemble.append( helper::getToken( data_, i, '\t' ) ); - } - data_ = aReassemble.makeStringAndClear(); + if (GetLineFormat() != FORMAT_SDF) { + PrintError( + "Cannot reassemble line of unknown type (internal Error).", + "Line format", rtl::OString(), false, GetLineNumber(), + GetUniqId()); + return; } - else - PrintError( "Cannot reassemble line of unknown type (internal Error).", "Line format", "", sal_False, GetLineNumber(), GetUniqId() ); + rtl::OStringBuffer b; + sal_Int32 n = 0; + for (sal_Int32 i = 0; i != 10; ++i) { + b.append(data_.getToken(0, '\t', n)); // token 0--9 + b.append('\t'); + } + b.append(aText); + b.append('\t'); + b.append(data_.getToken(1, '\t', n)); + // token 11; should be empty but there are some places in sc not + // reflected to sources + b.append('\t'); + b.append(aQuickHelpText); + b.append('\t'); + b.append(aTitle); + b.append('\t'); + b.append(data_.getToken(2, '\t', n)); // token 14 + data_ = b.makeStringAndClear(); } // @@ -328,12 +358,11 @@ void GSIBlock::PrintList( ParserMessageList *pList, rtl::OString const & aPrefix rtl::OString aContext; if ( bPrintContext ) { - if ( pMsg->GetTagBegin() == STRING_NOTFOUND ) + if ( pMsg->GetTagBegin() == -1 ) aContext = pLine->GetText().copy( 0, 300 ); else aContext = pLine->data_.copy( pMsg->GetTagBegin()-150, 300 ); - aContext = comphelper::string::stripEnd(aContext, ' '); - aContext = comphelper::string::stripStart(aContext, ' '); + aContext = helper::trimAscii(aContext); } PrintMessage( pMsg->Prefix(), pMsg->GetErrorText(), aPrefix, aContext, pLine->GetLineNumber(), pLine->GetUniqId() ); @@ -346,12 +375,17 @@ sal_Bool GSIBlock::IsUTF8( const rtl::OString &aTestee, sal_Bool bFixTags, sal_I { rtl::OUString aUTF8Tester( rtl::OStringToOUString(aTestee, RTL_TEXTENCODING_UTF8)); - nErrorPos = rtl::OUStringToOString(aUTF8Tester, RTL_TEXTENCODING_UTF8). - indexOf(aTestee); - if (nErrorPos != -1) + rtl::OString aTestee2( + rtl::OUStringToOString(aUTF8Tester, RTL_TEXTENCODING_UTF8)); + sal_Int32 i = 0; + while (i != std::min(aTestee.getLength(), aTestee2.getLength()) + && aTestee[i] == aTestee2[i]) { - aUTF8Tester = rtl::OUString( - aTestee.getStr(), nErrorPos, RTL_TEXTENCODING_UTF8); + ++i; + } + if (i != aTestee.getLength() || i != aTestee2.getLength()) + { + aUTF8Tester = rtl::OUString(aTestee.getStr(), i, RTL_TEXTENCODING_UTF8); nErrorPos = aUTF8Tester.getLength(); aErrorMsg = "UTF8 Encoding seems to be broken"; return sal_False; @@ -388,7 +422,7 @@ sal_Bool GSIBlock::TestUTF8( GSILine* pTestee, sal_Bool bFixTags ) sal_Bool bHasBeenFixed = sal_False; if ( !IsUTF8( pTestee->GetText(), bFixTags, nErrorPos, aErrorMsg, bHasBeenFixed, aFixed ) ) { - rtl::OString aContext( pTestee->GetText().copy( nErrorPos, 20 ) ); + rtl::OString aContext(copyUpTo(pTestee->GetText(), nErrorPos, 20)); PrintError(rtl::OStringBuffer(aErrorMsg).append(RTL_CONSTASCII_STRINGPARAM(" in Text at Position ")) .append(nErrorPos).getStr(), "Text format", aContext, pTestee->GetLineNumber(), pTestee->GetUniqId()); @@ -401,7 +435,8 @@ sal_Bool GSIBlock::TestUTF8( GSILine* pTestee, sal_Bool bFixTags ) } if ( !IsUTF8( pTestee->GetQuickHelpText(), bFixTags, nErrorPos, aErrorMsg, bHasBeenFixed, aFixed ) ) { - rtl::OString aContext( pTestee->GetQuickHelpText().copy( nErrorPos, 20 ) ); + rtl::OString aContext( + copyUpTo(pTestee->GetQuickHelpText(), nErrorPos, 20)); PrintError(rtl::OStringBuffer(aErrorMsg).append(RTL_CONSTASCII_STRINGPARAM(" in QuickHelpText at Position ")) .append(nErrorPos).getStr(), "Text format", aContext, pTestee->GetLineNumber(), pTestee->GetUniqId()); @@ -667,15 +702,15 @@ int _cdecl main( int argc, char *argv[] ) sal_Bool bWriteFixed = sal_False; sal_Bool bFixTags = sal_False; sal_Bool bAllowSuspicious = sal_False; - rtl::OUString aErrorFilename; - rtl::OUString aCorrectFilename; - rtl::OUString aFixedFilename; + rtl::OString aErrorFilename; + rtl::OString aCorrectFilename; + rtl::OString aFixedFilename; sal_Bool bFileHasError = sal_False; rtl::OString aSourceLang( "en-US" ); // English is default rtl::OString aFilename; rtl::OString aReferenceFilename; sal_Bool bReferenceFile = sal_False; - for ( sal_uInt16 i = 1 ; i < argc ; i++ ) + for ( int i = 1 ; i < argc ; i++ ) { if ( *argv[ i ] == '-' ) { @@ -690,10 +725,7 @@ int _cdecl main( int argc, char *argv[] ) if ( (*(argv[ i ]+3)) == 'f' ) if ( (i+1) < argc ) { - aErrorFilename = rtl::OUString( - argv[i + 1], - rtl_str_getLength(argv[i + 1]), - RTL_TEXTENCODING_ASCII_US); + aErrorFilename = argv[i + 1]; bWriteError = sal_True; i++; } @@ -709,10 +741,7 @@ int _cdecl main( int argc, char *argv[] ) if ( (*(argv[ i ]+3)) == 'f' ) if ( (i+1) < argc ) { - aCorrectFilename = rtl::OUString( - argv[i + 1], - rtl_str_getLength(argv[i + 1]), - RTL_TEXTENCODING_ASCII_US); + aCorrectFilename = argv[i + 1]; bWriteCorrect = sal_True; i++; } @@ -727,10 +756,7 @@ int _cdecl main( int argc, char *argv[] ) if ( (*(argv[ i ]+3)) == 'f' ) if ( (i+1) < argc ) { - aFixedFilename = rtl::OUString( - argv[i + 1], - rtl_str_getLength(argv[i + 1]), - RTL_TEXTENCODING_ASCII_US); + aFixedFilename = argv[i + 1]; bWriteFixed = sal_True; bFixTags = sal_True; i++; @@ -837,12 +863,6 @@ int _cdecl main( int argc, char *argv[] ) - DirEntry aSource = DirEntry( rtl::OStringToOUString( aFilename, RTL_TEXTENCODING_ASCII_US )); - if ( !aSource.Exists()) { - fprintf( stderr, "\nERROR: GSI-File %s not found!\n\n", aFilename.getStr() ); - exit ( 2 ); - } - std::ifstream aGSI(aFilename.getStr()); if (!aGSI.is_open()) { fprintf( stderr, "\nERROR: Could not open GSI-File %s!\n\n", aFilename.getStr() ); @@ -852,12 +872,6 @@ int _cdecl main( int argc, char *argv[] ) std::ifstream aReferenceGSI; if ( bReferenceFile ) { - DirEntry aReferenceSource = DirEntry( rtl::OStringToOUString( aReferenceFilename, RTL_TEXTENCODING_ASCII_US )); - if ( !aReferenceSource.Exists()) { - fprintf( stderr, "\nERROR: GSI-File %s not found!\n\n", aFilename.getStr() ); - exit ( 2 ); - } - aReferenceGSI.open(aReferenceFilename.getStr()); if (!aReferenceGSI.is_open()) { fprintf( stderr, "\nERROR: Could not open Input-File %s!\n\n", aFilename.getStr() ); @@ -866,19 +880,14 @@ int _cdecl main( int argc, char *argv[] ) } LazyStream aOkOut; - rtl::OUString aBaseName(aSource.GetBase()); if ( bWriteCorrect ) { if (aCorrectFilename.isEmpty()) { - rtl::OUString sTmpBase(aBaseName); - sTmpBase += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_ok")); - aSource.SetBase( sTmpBase ); - aCorrectFilename = aSource.GetFull(); + aCorrectFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_ok"))); } - aOkOut.SetFileName( - rtl::OUStringToOString( - aCorrectFilename, osl_getThreadTextEncoding())); + aOkOut.SetFileName(aCorrectFilename); } LazyStream aErrOut; @@ -886,14 +895,10 @@ int _cdecl main( int argc, char *argv[] ) { if (aErrorFilename.isEmpty()) { - rtl::OUString sTmpBase(aBaseName); - sTmpBase += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_err")); - aSource.SetBase( sTmpBase ); - aErrorFilename = aSource.GetFull(); + aErrorFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_err"))); } - aErrOut.SetFileName( - rtl::OUStringToOString( - aErrorFilename, osl_getThreadTextEncoding())); + aErrOut.SetFileName(aErrorFilename); } LazyStream aFixOut; @@ -901,14 +906,10 @@ int _cdecl main( int argc, char *argv[] ) { if (aFixedFilename.isEmpty()) { - rtl::OUString sTmpBase(aBaseName); - sTmpBase += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_fix")); - aSource.SetBase( sTmpBase ); - aFixedFilename = aSource.GetFull(); + aFixedFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_fix"))); } - aFixOut.SetFileName( - rtl::OUStringToOString( - aFixedFilename, osl_getThreadTextEncoding())); + aFixOut.SetFileName(aFixedFilename); } diff --git a/l10ntools/source/helper.hxx b/l10ntools/source/helper.hxx index 27ee642dfd92..edd2d0fa3be1 100644 --- a/l10ntools/source/helper.hxx +++ b/l10ntools/source/helper.hxx @@ -35,15 +35,62 @@ #include <cassert> #include "rtl/string.hxx" +#include "rtl/ustring.hxx" #include "sal/types.h" namespace helper { +inline bool isAsciiWhitespace(char c) { + return (c >= 0x09 && c <= 0x0D) || c == ' '; // HT, LF, VT, FF, CR +} + +// cf. comphelper::string::isdigitAsciiString: +inline bool isAllAsciiDigits(rtl::OString const & text) { + for (sal_Int32 i = 0; i != text.getLength(); ++i) { + if (text[i] < '0' || text[i] > '9') { + return false; + } + } + return true; +} + +// cf. comphelper::string::isupperAsciiString: +inline bool isAllAsciiUpperCase(rtl::OString const & text) { + for (sal_Int32 i = 0; i != text.getLength(); ++i) { + if (text[i] < 'A' || text[i] > 'Z') { + return false; + } + } + return true; +} + +// cf. comphelper::string::islowerAsciiString: +inline bool isAllAsciiLowerCase(rtl::OString const & text) { + for (sal_Int32 i = 0; i != text.getLength(); ++i) { + if (text[i] < 'a' || text[i] > 'z') { + return false; + } + } + return true; +} + inline bool endsWith(rtl::OString const & text, rtl::OString const & search) { return text.getLength() >= search.getLength() && text.match(search, text.getLength() - search.getLength()); } +inline rtl::OString trimAscii(rtl::OString const & text) { + sal_Int32 i1 = 0; + while (i1 != text.getLength() && isAsciiWhitespace(text[i1])) { + ++i1; + } + sal_Int32 i2 = text.getLength(); + while (i2 != i1 && isAsciiWhitespace(text[i2 - 1])) { + --i2; + } + return text.copy(i1, i2 - i1); +} + inline sal_Int32 searchAndReplace( rtl::OString * text, rtl::OString const & search, rtl::OString const & replace) diff --git a/l10ntools/source/makefile.mk b/l10ntools/source/makefile.mk index 69110078bdca..597b614b0675 100644 --- a/l10ntools/source/makefile.mk +++ b/l10ntools/source/makefile.mk @@ -107,8 +107,6 @@ APP5TARGET= gsicheck APP5OBJS= $(OBJ)$/gsicheck.obj $(OBJ)$/tagtest.obj APP5RPATH= NONE APP5STDLIBS+= \ - $(TOOLSLIB) \ - $(COMPHELPERLIB) \ $(SALLIB) # extractor and merger for *.cfg diff --git a/l10ntools/source/tagtest.cxx b/l10ntools/source/tagtest.cxx index 5d7f1ab29334..8238308c5b35 100644 --- a/l10ntools/source/tagtest.cxx +++ b/l10ntools/source/tagtest.cxx @@ -26,8 +26,13 @@ * ************************************************************************/ -#include <tools/string.hxx> -#include <rtl/strbuf.hxx> +#include "sal/config.h" + +#include "rtl/strbuf.hxx" +#include "rtl/string.hxx" +#include "rtl/ustrbuf.hxx" +#include "rtl/ustring.hxx" + #include "tagtest.hxx" #if OSL_DEBUG_LEVEL > 1 @@ -43,7 +48,7 @@ -TokenInfo::TokenInfo( TokenId pnId, sal_uInt16 nP, rtl::OUString const & paStr, ParserMessageList &rErrorList ) +TokenInfo::TokenInfo( TokenId pnId, sal_Int32 nP, rtl::OUString const & paStr, ParserMessageList &rErrorList ) : bClosed(sal_False) , bCloseTag(sal_False) , bIsBroken(sal_False) @@ -94,8 +99,8 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) sal_Int32 nLastPos = 2; // skip initial \< sal_Int32 nCheckPos = nLastPos; static char const aDelims[] = " \\=>/"; - String aPortion; - String aValue; // store the value of a property + rtl::OUString aPortion; + rtl::OUString aValue; // store the value of a property rtl::OString aName; // store the name of a property/tag sal_Bool bCheckName = sal_False; sal_Bool bCheckEmpty = sal_False; @@ -132,7 +137,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) break; case '/': { - if ( aPortion.Len() == 0 ) + if (aPortion.isEmpty()) { aState = TC_CLOSETAG; } @@ -194,7 +199,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) break; case '\"': aState = TC_INSIDE_STRING; bCheckEmpty = sal_True; - aValue.Erase(); + aValue = rtl::OUString(); break; default: aState = TC_ERROR; } @@ -206,7 +211,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) { case '\"': aState = TC_INSIDE_STRING; bCheckEmpty = sal_True; - aValue.Erase(); + aValue = rtl::OUString(); break; default: aState = TC_ERROR; } @@ -241,7 +246,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) { aState = TC_INSIDE_STRING; aValue += aPortion; - aValue += cDelim; + aValue += rtl::OUString(cDelim); } } break; @@ -329,7 +334,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) if ( bCheckName ) { - if ( aPortion.Len() == 0 ) + if (aPortion.isEmpty()) { rErrorList.AddError( 25, "Tag/Property name missing ", *this ); bIsBroken = sal_True; @@ -363,7 +368,7 @@ void TokenInfo::SplitTag( ParserMessageList &rErrorList ) if ( bCheckEmpty ) { - if ( aPortion.Len() ) + if (!aPortion.isEmpty()) { rErrorList.AddError( 25, rtl::OStringBuffer(RTL_CONSTASCII_STRINGPARAM("Found displaced characters '")).append(rtl::OUStringToOString(aPortion, RTL_TEXTENCODING_UTF8)).append(RTL_CONSTASCII_STRINGPARAM("' in Tag ")).makeStringAndClear(), *this ); bIsBroken = sal_True; @@ -528,34 +533,34 @@ rtl::OUString TokenInfo::GetTagName() const rtl::OUString TokenInfo::MakeTag() const { - String aRet; - aRet.AppendAscii("\\<"); + rtl::OUStringBuffer aRet; + aRet.appendAscii("\\<"); if ( bCloseTag ) - aRet.AppendAscii("/"); - aRet.Append( GetTagName() ); + aRet.appendAscii("/"); + aRet.append( GetTagName() ); StringHashMap::const_iterator iProp; for( iProp = aProperties.begin() ; iProp != aProperties.end(); ++iProp ) { - aRet.AppendAscii(" "); - aRet.Append( String( iProp->first, RTL_TEXTENCODING_UTF8 ) ); - aRet.AppendAscii("=\\\""); - aRet.Append( iProp->second ); - aRet.AppendAscii("\\\""); + aRet.appendAscii(" "); + aRet.append( rtl::OStringToOUString( iProp->first, RTL_TEXTENCODING_UTF8 ) ); + aRet.appendAscii("=\\\""); + aRet.append( iProp->second ); + aRet.appendAscii("\\\""); } if ( bClosed ) - aRet.AppendAscii("/"); - aRet.AppendAscii("\\>"); - return aRet; + aRet.appendAscii("/"); + aRet.appendAscii("\\>"); + return aRet.makeStringAndClear(); } -void ParserMessageList::AddError( sal_uInt16 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ) +void ParserMessageList::AddError( sal_Int32 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ) { maList.push_back( new ParserError( nErrorNr, rErrorText, rTag ) ); } -void ParserMessageList::AddWarning( sal_uInt16 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ) +void ParserMessageList::AddWarning( sal_Int32 nErrorNr, const rtl::OString& rErrorText, const TokenInfo &rTag ) { maList.push_back( new ParserWarning( nErrorNr, rErrorText, rTag ) ); } @@ -677,7 +682,7 @@ void SimpleParser::Parse( rtl::OUString const & PaSource ) TokenInfo SimpleParser::GetNextToken( ParserMessageList &rErrorList ) { TokenInfo aResult; - sal_uInt16 nTokenStartPos = 0; + sal_Int32 nTokenStartPos = 0; if ( aNextTag.nId != TAG_NOMORETAGS ) { aResult = aNextTag; @@ -733,12 +738,12 @@ TokenInfo SimpleParser::GetNextToken( ParserMessageList &rErrorList ) while (aLastToken[nNonBlankEndPos] == ' ') nNonBlankEndPos--; if (aLastToken[nNonBlankEndPos] == '/') - aNextTag = TokenInfo( TAG_COMMONEND, nTokenStartPos, String::CreateFromAscii("\\</").Append(aResult.GetTagName()).AppendAscii("\\>"), rErrorList ); + aNextTag = TokenInfo( TAG_COMMONEND, nTokenStartPos, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\\</")) + aResult.GetTagName() + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\\>")), rErrorList ); } } else { - sal_uInt16 i = 0; + sal_Int32 i = 0; while ( aKnownTags[i].nTag != TAG_UNKNOWN_TAG && aLastToken != aKnownTags[i].GetName() ) i++; @@ -752,7 +757,7 @@ TokenInfo SimpleParser::GetNextToken( ParserMessageList &rErrorList ) return aResult; } -rtl::OUString SimpleParser::GetNextTokenString( ParserMessageList &rErrorList, sal_uInt16 &rTagStartPos ) +rtl::OUString SimpleParser::GetNextTokenString( ParserMessageList &rErrorList, sal_Int32 &rTagStartPos ) { sal_Int32 nStyle2StartPos = aSource.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM("$["), nPos ); @@ -765,7 +770,7 @@ rtl::OUString SimpleParser::GetNextTokenString( ParserMessageList &rErrorList, s rTagStartPos = 0; if (nStyle2StartPos == -1 && nStyle3StartPos == -1) - return String(); // no more tokens + return rtl::OUString(); // no more tokens if ( nStyle4StartPos < nStyle2StartPos && nStyle4StartPos <= nStyle3StartPos ) // <= to make sure \\ is always handled first { // Skip quoted Backslash @@ -820,7 +825,7 @@ rtl::OUString SimpleParser::GetLexem( TokenInfo const &aToken ) return aToken.aTokenString; else { - sal_uInt16 i = 0; + sal_Int32 i = 0; while ( aKnownTags[i].nTag != TAG_UNKNOWN_TAG && aKnownTags[i].nTag != aToken.nId ) i++; @@ -1349,7 +1354,7 @@ sal_Bool TokenParser::match( const TokenInfo &aCurrentToken, const TokenInfo &rE return sal_False; } -void TokenParser::ParseError( sal_uInt16 nErrNr, const rtl::OString &rErrMsg, const TokenInfo &rTag ) +void TokenParser::ParseError( sal_Int32 nErrNr, const rtl::OString &rErrMsg, const TokenInfo &rTag ) { pErrorList->AddError( nErrNr, rErrMsg, rTag); @@ -1358,12 +1363,12 @@ void TokenParser::ParseError( sal_uInt16 nErrNr, const rtl::OString &rErrMsg, co } -ParserMessage::ParserMessage( sal_uInt16 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ) +ParserMessage::ParserMessage( sal_Int32 PnErrorNr, const rtl::OString &rPaErrorText, const TokenInfo &rTag ) : nErrorNr( PnErrorNr ) , nTagBegin( 0 ) , nTagLength( 0 ) { - String aLexem( SimpleParser::GetLexem( rTag ) ); + rtl::OUString aLexem( SimpleParser::GetLexem( rTag ) ); rtl::OStringBuffer aErrorBuffer(rPaErrorText); aErrorBuffer.append(RTL_CONSTASCII_STRINGPARAM(": ")); aErrorBuffer.append(rtl::OUStringToOString(aLexem, RTL_TEXTENCODING_UTF8)); @@ -1376,14 +1381,14 @@ ParserMessage::ParserMessage( sal_uInt16 PnErrorNr, const rtl::OString &rPaError } aErrorText = aErrorBuffer.makeStringAndClear(); nTagBegin = rTag.nPos; - nTagLength = aLexem.Len(); + nTagLength = aLexem.getLength(); } -ParserError::ParserError( sal_uInt16 ErrorNr, const rtl::OString &rErrorText, const TokenInfo &rTag ) +ParserError::ParserError( sal_Int32 ErrorNr, const rtl::OString &rErrorText, const TokenInfo &rTag ) : ParserMessage( ErrorNr, rErrorText, rTag ) {} -ParserWarning::ParserWarning( sal_uInt16 ErrorNr, const rtl::OString &rErrorText, const TokenInfo &rTag ) +ParserWarning::ParserWarning( sal_Int32 ErrorNr, const rtl::OString &rErrorText, const TokenInfo &rTag ) : ParserMessage( ErrorNr, rErrorText, rTag ) {} @@ -1409,12 +1414,12 @@ sal_Bool LingTest::IsTagMandatory( TokenInfo const &aToken, TokenId &aMetaTokens else if ( TAG_COMMONSTART == aTokenId || TAG_COMMONEND == aTokenId ) { - String aTagName = aToken.GetTagName(); - return !(aTagName.EqualsIgnoreCaseAscii( "comment" ) - || aTagName.EqualsIgnoreCaseAscii( "bookmark_value" ) - || aTagName.EqualsIgnoreCaseAscii( "emph" ) - || aTagName.EqualsIgnoreCaseAscii( "item" ) - || aTagName.EqualsIgnoreCaseAscii( "br" ) ); + rtl::OUString aTagName = aToken.GetTagName(); + return !(aTagName.equalsIgnoreAsciiCaseAscii( "comment" ) + || aTagName.equalsIgnoreAsciiCaseAscii( "bookmark_value" ) + || aTagName.equalsIgnoreAsciiCaseAscii( "emph" ) + || aTagName.equalsIgnoreAsciiCaseAscii( "item" ) + || aTagName.equalsIgnoreAsciiCaseAscii( "br" ) ); } return sal_False; } @@ -1474,7 +1479,7 @@ void LingTest::CheckTags( TokenList &aReference, TokenList &aTestee, sal_Bool bF if ( bFixTags ) { // we fix only if its a really simple case - sal_uInt16 nTagCount = 0; + sal_Int32 nTagCount = 0; for ( i=0 ; i < aReference.size() ; i++ ) if ( !aReference[ i ].IsDone() ) nTagCount++; |