From 8b97644bab0e9106b798a5b8969aa796e558ef3f Mon Sep 17 00:00:00 2001 From: Andras Timar Date: Fri, 28 Sep 2012 13:57:36 +0200 Subject: Revert "fdo#52246 let helpex use gsicheck's tag checker" This reverts commit e3b927787f3643f9e584cc80c974d5f907a94858. There will be a better solution in feature/killsdf soon. Conflicts: l10ntools/inc/gsicheck.hxx l10ntools/source/gsicheck.cxx l10ntools/source/gsimain.cxx Change-Id: I5d12f4ee069d7024345d78c45fb1587cb006c922 --- l10ntools/Executable_gsicheck.mk | 6 +- l10ntools/StaticLibrary_transex.mk | 2 - l10ntools/inc/export.hxx | 23 +- l10ntools/inc/gsicheck.hxx | 34 --- l10ntools/source/gsicheck.cxx | 454 ++++++++++++++++++++++++++++++++++-- l10ntools/source/gsimain.cxx | 456 ------------------------------------- l10ntools/source/helpmerge.cxx | 10 +- l10ntools/source/merge.cxx | 9 +- 8 files changed, 443 insertions(+), 551 deletions(-) delete mode 100644 l10ntools/source/gsimain.cxx diff --git a/l10ntools/Executable_gsicheck.mk b/l10ntools/Executable_gsicheck.mk index fceb61a1554e..917c00fc5866 100644 --- a/l10ntools/Executable_gsicheck.mk +++ b/l10ntools/Executable_gsicheck.mk @@ -34,12 +34,10 @@ $(eval $(call gb_Executable_set_include,gsicheck,\ $(eval $(call gb_Executable_use_libraries,gsicheck,\ sal \ )) -$(eval $(call gb_Executable_use_static_libraries,gsicheck,\ - transex \ -)) $(eval $(call gb_Executable_add_exception_objects,gsicheck,\ - l10ntools/source/gsimain \ + l10ntools/source/gsicheck \ + l10ntools/source/tagtest \ )) # vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/l10ntools/StaticLibrary_transex.mk b/l10ntools/StaticLibrary_transex.mk index f9dd1650d591..e8c84b7d3662 100644 --- a/l10ntools/StaticLibrary_transex.mk +++ b/l10ntools/StaticLibrary_transex.mk @@ -37,8 +37,6 @@ $(eval $(call gb_StaticLibrary_add_exception_objects,transex,\ l10ntools/source/merge \ l10ntools/source/file \ l10ntools/source/directory \ - l10ntools/source/tagtest \ - l10ntools/source/gsicheck \ )) # vim: set noet sw=4 ts=4: diff --git a/l10ntools/inc/export.hxx b/l10ntools/inc/export.hxx index d11d06f0e4e1..be243600d6a6 100644 --- a/l10ntools/inc/export.hxx +++ b/l10ntools/inc/export.hxx @@ -71,9 +71,6 @@ typedef boost::unordered_map typedef boost::unordered_map MergeDataHashMap; -typedef boost::unordered_map - LineNumberHashMap; - #define SOURCE_LANGUAGE rtl::OString(RTL_CONSTASCII_STRINGPARAM("en-US")) #define X_COMMENT rtl::OString(RTL_CONSTASCII_STRINGPARAM("x-comment")) #define LIST_REFID "LIST_REFID" @@ -377,36 +374,23 @@ private: OStringBoolHashMap bQuickHelpTextFirst; OStringHashMap sTitle; OStringBoolHashMap bTitleFirst; - OStringHashMap sSDFLine; - LineNumberHashMap nLine; public: PFormEntrys( const rtl::OString &rPForm ) : data_( rPForm ) {}; void InsertEntry(const rtl::OString &rId, const rtl::OString &rText, - const rtl::OString &rQuickHelpText, const rtl::OString &rTitle, - const rtl::OString &rSDFLine, const std::size_t nLineIn) + const rtl::OString &rQuickHelpText, const rtl::OString &rTitle) { + sText[ rId ] = rText; bTextFirst[ rId ] = true; sQuickHelpText[ rId ] = rQuickHelpText; bQuickHelpTextFirst[ rId ] = true; sTitle[ rId ] = rTitle; bTitleFirst[ rId ] = true; - sSDFLine[ rId ] = rSDFLine; - nLine[ rId ] = nLineIn; } sal_Bool GetText( rtl::OString &rReturn, sal_uInt16 nTyp, const rtl::OString &nLangIndex, sal_Bool bDel = sal_False ); sal_Bool GetTransex3Text( rtl::OString &rReturn, sal_uInt16 nTyp, const rtl::OString &nLangIndex, sal_Bool bDel = sal_False ); - rtl::OString & GetSDF(const rtl::OString &nLangIndex) - { - return sSDFLine[nLangIndex]; - } - - std::size_t GetNLine(const rtl::OString &nLangIndex) - { - return nLine[nLangIndex]; - } }; // @@ -459,8 +443,7 @@ class MergeDataFile const rtl::OString &rLID, const rtl::OString &rPFO, const rtl::OString &nLang, const rtl::OString &rTEXT, const rtl::OString &rQHTEXT, const rtl::OString &rTITLE, - const rtl::OString &sFilename, bool bCaseSensitive, - const rtl::OString &rSDF, std::size_t nLine); + const rtl::OString &sFilename, bool bCaseSensitive); public: explicit MergeDataFile(const rtl::OString &rFileName, const rtl::OString& rFile, bool bCaseSensitive); diff --git a/l10ntools/inc/gsicheck.hxx b/l10ntools/inc/gsicheck.hxx index a33796c0073a..467925e46767 100644 --- a/l10ntools/inc/gsicheck.hxx +++ b/l10ntools/inc/gsicheck.hxx @@ -33,7 +33,6 @@ #include #include -#include #include "tagtest.hxx" @@ -132,39 +131,6 @@ public: void WriteFixed( LazyStream &aFixOut ); }; -sal_Bool check(rtl::OString s,std::size_t nLine); - -void PrintMessage( rtl::OString const & aType, rtl::OString const & aMsg, rtl::OString const & aPrefix, - rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString aUniqueId = rtl::OString() ); - -void PrintError( rtl::OString const & aMsg, rtl::OString const & aPrefix, - rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString const & aUniqueId = rtl::OString() ); - -bool LanguageOK( rtl::OString const & aLang ); - -class LazyStream: public std::ofstream -{ - -private: - rtl::OString aFileName; - bool bOpened; - -public: - LazyStream() - : aFileName() - , bOpened(false) - {}; - - void SetFileName( const rtl::OString& rFileName ) - { - aFileName = rFileName; - }; - - void LazyOpen(); -}; - -sal_Int32 const MAX_GID_LID_LEN = 250; - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/gsicheck.cxx b/l10ntools/source/gsicheck.cxx index 082f9ef94087..1abc00d17ac9 100644 --- a/l10ntools/source/gsicheck.cxx +++ b/l10ntools/source/gsicheck.cxx @@ -42,6 +42,8 @@ #include "tagtest.hxx" #include "gsicheck.hxx" +sal_Int32 const MAX_GID_LID_LEN = 250; + namespace { rtl::OString copyUpTo( @@ -51,11 +53,26 @@ rtl::OString copyUpTo( 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, - rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString aUniqueId ) + rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString aUniqueId = rtl::OString() ) /*****************************************************************************/ { fprintf( stdout, "%s %s, Line %u", aType.getStr(), aPrefix.getStr(), static_cast( nLine ) ); @@ -70,7 +87,7 @@ void PrintMessage( rtl::OString const & aType, rtl::OString const & aMsg, rtl::O /*****************************************************************************/ void PrintError( rtl::OString const & aMsg, rtl::OString const & aPrefix, - rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString const & aUniqueId ) + rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString const & aUniqueId = rtl::OString() ) /*****************************************************************************/ { PrintMessage( "Error:", aMsg, aPrefix, aContext, bPrintContext, nLine, aUniqueId ); @@ -92,6 +109,27 @@ bool LanguageOK( rtl::OString const & aLang ) && !t0.equalsIgnoreAsciiCase(t1); } +class LazyStream: public std::ofstream +{ + +private: + rtl::OString aFileName; + bool bOpened; + +public: + LazyStream() + : aFileName() + , bOpened(false) + {}; + + void SetFileName( const rtl::OString& rFileName ) + { + aFileName = rFileName; + }; + + void LazyOpen(); +}; + void LazyStream::LazyOpen() { if ( !bOpened ) @@ -603,39 +641,411 @@ void GSIBlock::WriteFixed( LazyStream &aFixOut ) } } -sal_Bool check(rtl::OString s, std::size_t nLine) + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +void Help() +/*****************************************************************************/ { + fprintf( stdout, "\n" ); + fprintf( stdout, "gsicheck checks the syntax of tags in SDF-Files\n" ); + fprintf( stdout, " checks for inconsistencies and malicious UTF8 encoding\n" ); + fprintf( stdout, " checks tags in Online Help\n" ); + fprintf( stdout, " relax GID/LID length to %s\n", + rtl::OString::valueOf(static_cast(MAX_GID_LID_LEN)).getStr() ); + fprintf( stdout, "\n" ); + fprintf( stdout, "Syntax: gsicheck [ -c ] [-f] [ -we ] [ -wef ErrorFilename ] [ -wc ]\n" ); + fprintf( stdout, " [ -wcf CorrectFilename ] [ -s | -t ] [ -l LanguageID ]\n" ); + fprintf( stdout, " [ -r ReferenceFile ] filename\n" ); + fprintf( stdout, "\n" ); + fprintf( stdout, "-c Add context to error message (Print the line containing the error)\n" ); + fprintf( stdout, "-f try to fix errors. See also -wf -wff \n" ); + fprintf( stdout, "-wf Write File containing all fixed parts\n" ); + fprintf( stdout, "-wff Same as above but give own filename\n" ); + fprintf( stdout, "-we Write File containing all errors\n" ); + fprintf( stdout, "-wef Same as above but give own filename\n" ); + fprintf( stdout, "-wc Write File containing all correct parts\n" ); + fprintf( stdout, "-wcf Same as above but give own filename\n" ); + fprintf( stdout, "-s Check only source language. Should be used before handing out to vendor.\n" ); + fprintf( stdout, "-t Check only Translation language(s). Should be used before merging.\n" ); + fprintf( stdout, "-e disable encoding checks. E.g.: double questionmark \'??\' which may be the\n" ); + fprintf( stdout, " result of false conversions\n" ); + fprintf( stdout, "-l ISO language code of the source language.\n" ); + fprintf( stdout, " Default is en-US. Use \"\" (empty string) or 'none'\n" ); + fprintf( stdout, " to disable source language dependent checks\n" ); + fprintf( stdout, "-r Reference filename to check that source language entries\n" ); + fprintf( stdout, " have not been changed\n" ); + fprintf( stdout, "\n" ); +} + +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { + sal_Bool bError = sal_False; + sal_Bool bPrintContext = sal_False; + sal_Bool bCheckSourceLang = sal_False; + sal_Bool bCheckTranslationLang = sal_False; + sal_Bool bWriteError = sal_False; + sal_Bool bWriteCorrect = sal_False; + sal_Bool bWriteFixed = sal_False; + sal_Bool bFixTags = sal_False; + sal_Bool bAllowSuspicious = sal_False; + rtl::OString aErrorFilename; + rtl::OString aCorrectFilename; + rtl::OString aFixedFilename; sal_Bool bFileHasError = sal_False; - GSILine* pGSILine = NULL; - GSIBlock *pBlock = NULL; - pGSILine = new GSILine(s, nLine ); + rtl::OString aSourceLang( "en-US" ); // English is default + rtl::OString aFilename; + rtl::OString aReferenceFilename; + sal_Bool bReferenceFile = sal_False; + for ( int i = 1 ; i < argc ; i++ ) + { + if ( *argv[ i ] == '-' ) + { + switch (*(argv[ i ]+1)) + { + case 'c':bPrintContext = sal_True; + break; + case 'w': + { + if ( (*(argv[ i ]+2)) == 'e' ) + { + if ( (*(argv[ i ]+3)) == 'f' ) + if ( (i+1) < argc ) + { + aErrorFilename = argv[i + 1]; + bWriteError = sal_True; + i++; + } + else + { + fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); + bError = sal_True; + } + else + bWriteError = sal_True; + } + else if ( (*(argv[ i ]+2)) == 'c' ) + if ( (*(argv[ i ]+3)) == 'f' ) + if ( (i+1) < argc ) + { + aCorrectFilename = argv[i + 1]; + bWriteCorrect = sal_True; + i++; + } + else + { + fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); + bError = sal_True; + } + else + bWriteCorrect = sal_True; + else if ( (*(argv[ i ]+2)) == 'f' ) + if ( (*(argv[ i ]+3)) == 'f' ) + if ( (i+1) < argc ) + { + aFixedFilename = argv[i + 1]; + bWriteFixed = sal_True; + bFixTags = sal_True; + i++; + } + else + { + fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); + bError = sal_True; + } + else + { + bWriteFixed = sal_True; + bFixTags = sal_True; + } + else + { + fprintf( stderr, "\nERROR: Unknown Switch %s!\n\n", argv[ i ] ); + bError = sal_True; + } + } + break; + case 's':bCheckSourceLang = sal_True; + break; + case 't':bCheckTranslationLang = sal_True; + break; + case 'l': + { + if ( (i+1) < argc ) + { + aSourceLang = argv[ i+1 ]; + if ( aSourceLang.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("none")) ) + aSourceLang = rtl::OString(); + i++; + } + else + { + fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); + bError = sal_True; + } + } + break; + case 'r': + { + if ( (i+1) < argc ) + { + aReferenceFilename = argv[ i+1 ]; + bReferenceFile = sal_True; + i++; + } + else + { + fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); + bError = sal_True; + } + } + break; + case 'f': + { + bFixTags = sal_True; + } + break; + case 'e': + { + bAllowSuspicious = sal_True; + } + break; + default: + fprintf( stderr, "\nERROR: Unknown Switch %s!\n\n", argv[ i ] ); + bError = sal_True; + } + } + else + { + if (aFilename.isEmpty()) + aFilename = argv[i]; + else + { + fprintf( stderr, "\nERROR: Only one filename may be specified!\n\n"); + bError = sal_True; + } + } + } + + + if (aFilename.isEmpty() || bError) + { + Help(); + exit ( 0 ); + } + + if ( !aSourceLang.isEmpty() && !LanguageOK( aSourceLang ) ) + { + fprintf( stderr, "\nERROR: The Language '%s' is invalid!\n\n", aSourceLang.getStr() ); + Help(); + exit ( 1 ); + } - if ( !pGSILine->data_.isEmpty() ) + if ( bCheckSourceLang && bCheckTranslationLang ) { - if ( FORMAT_UNKNOWN == pGSILine->GetLineFormat() ) + fprintf( stderr, "\nERROR: The Options -s and -t are mutually exclusive.\nUse only one of them.\n\n" ); + Help(); + exit ( 1 ); + } + + + + std::ifstream aGSI(aFilename.getStr()); + if (!aGSI.is_open()) { + fprintf( stderr, "\nERROR: Could not open GSI-File %s!\n\n", aFilename.getStr() ); + exit ( 3 ); + } + + std::ifstream aReferenceGSI; + if ( bReferenceFile ) + { + aReferenceGSI.open(aReferenceFilename.getStr()); + if (!aReferenceGSI.is_open()) { + fprintf( stderr, "\nERROR: Could not open Input-File %s!\n\n", aFilename.getStr() ); + exit ( 3 ); + } + } + + LazyStream aOkOut; + if ( bWriteCorrect ) + { + if (aCorrectFilename.isEmpty()) { - PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), sal_True, pGSILine->GetLineNumber() ); - bFileHasError = sal_True; - pGSILine->NotOK(); + aCorrectFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_ok"))); } - else if ( !(pGSILine->GetLineType().equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("res-comment"))) ) + aOkOut.SetFileName(aCorrectFilename); + } + + LazyStream aErrOut; + if ( bWriteError ) + { + if (aErrorFilename.isEmpty()) + { + aErrorFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_err"))); + } + aErrOut.SetFileName(aErrorFilename); + } + + LazyStream aFixOut; + if ( bWriteFixed ) + { + if (aFixedFilename.isEmpty()) + { + aFixedFilename = addSuffix( + aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_fix"))); + } + aFixOut.SetFileName(aFixedFilename); + } + + + GSILine* pReferenceLine = NULL; + std::size_t nReferenceLine = 0; + + GSILine* pGSILine = NULL; + rtl::OString aOldId("No Valid ID"); // just set to something which can never be an ID + GSIBlock *pBlock = NULL; + std::size_t nLine = 0; + + while (!aGSI.eof()) + { + std::string s; + std::getline(aGSI, s); + nLine++; + pGSILine = new GSILine(rtl::OString(s.data(), s.length()), nLine ); + sal_Bool bDelete = sal_True; + + + if ( !pGSILine->data_.isEmpty() ) { - pBlock = new GSIBlock( sal_True, sal_False, sal_False, sal_False, sal_False ); - pBlock->InsertLine( pGSILine, rtl::OString() ); - bFileHasError |= pBlock->CheckSyntax( nLine, sal_False, sal_False ); - if (pBlock!=NULL) + if ( FORMAT_UNKNOWN == pGSILine->GetLineFormat() ) { - delete pBlock; - pBlock=NULL; - pGSILine=NULL; + PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), bPrintContext, pGSILine->GetLineNumber() ); + pGSILine->NotOK(); + if ( bWriteError ) + { + bFileHasError = sal_True; + aErrOut.LazyOpen(); + aErrOut << pGSILine->data_.getStr(); + } + } + else if ( pGSILine->GetLineType().equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("res-comment")) ) + { // ignore comment lines, but write them to Correct Items File + if ( bWriteCorrect ) + { + aOkOut.LazyOpen(); + aOkOut << pGSILine->data_.getStr() << '\n'; + } + } + else + { + rtl::OString aId = pGSILine->GetUniqId(); + if ( aId != aOldId ) + { + if ( pBlock ) + { + bFileHasError |= pBlock->CheckSyntax( nLine, !aSourceLang.isEmpty(), bFixTags ); + + if ( bWriteError ) + pBlock->WriteError( aErrOut, !aSourceLang.isEmpty() ); + if ( bWriteCorrect ) + pBlock->WriteCorrect( aOkOut, !aSourceLang.isEmpty() ); + if ( bWriteFixed ) + pBlock->WriteFixed( aFixOut ); + + delete pBlock; + } + pBlock = new GSIBlock( bPrintContext, bCheckSourceLang, bCheckTranslationLang, bReferenceFile, bAllowSuspicious ); + + aOldId = aId; + + + // find corresponding line in reference file + if ( bReferenceFile ) + { + sal_Bool bContinueSearching = sal_True; + while ( ( !aReferenceGSI.eof() || pReferenceLine ) && bContinueSearching ) + { + if ( !pReferenceLine ) + { + std::string s2; + std::getline(aReferenceGSI, s2); + nReferenceLine++; + pReferenceLine = new GSILine( + rtl::OString(s2.data(), s2.length()), + nReferenceLine); + } + if ( pReferenceLine->GetLineFormat() != FORMAT_UNKNOWN ) + { + if ( pReferenceLine->GetUniqId() == aId && pReferenceLine->GetLanguageId() == aSourceLang ) + { + pBlock->SetReferenceLine( pReferenceLine ); + pReferenceLine = NULL; + } + else if ( pReferenceLine->GetUniqId() > aId ) + { + bContinueSearching = sal_False; + } + else + { + if ( pReferenceLine->GetUniqId() < aId && pReferenceLine->GetLanguageId() == aSourceLang ) + PrintError( "No Entry in source file found. Entry has been removed from source file", "File format", "", bPrintContext, pGSILine->GetLineNumber(), pReferenceLine->GetUniqId() ); + delete pReferenceLine; + pReferenceLine = NULL; + } + } + else + { + delete pReferenceLine; + pReferenceLine = NULL; + } + + } + } + + } + + pBlock->InsertLine( pGSILine, aSourceLang ); + bDelete = sal_False; } } + if ( bDelete ) + delete pGSILine; + } - delete pGSILine; + if ( pBlock ) + { + bFileHasError |= pBlock->CheckSyntax( nLine, !aSourceLang.isEmpty(), bFixTags ); + + if ( bWriteError ) + pBlock->WriteError( aErrOut, !aSourceLang.isEmpty() ); + if ( bWriteCorrect ) + pBlock->WriteCorrect( aOkOut, !aSourceLang.isEmpty() ); + if ( bWriteFixed ) + pBlock->WriteFixed( aFixOut ); + + delete pBlock; + } + aGSI.close(); + + if ( bWriteError ) + aErrOut.close(); + if ( bWriteCorrect ) + aOkOut.close(); + if ( bWriteFixed ) + aFixOut.close(); + if ( bFileHasError ) - return false; + return 55; else - return true; + return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/gsimain.cxx b/l10ntools/source/gsimain.cxx deleted file mode 100644 index 7558731ee4c3..000000000000 --- a/l10ntools/source/gsimain.cxx +++ /dev/null @@ -1,456 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "sal/config.h" - -#include -#include -#include -#include -#include - -#include - -#include -#include "sal/main.h" -#include "helper.hxx" -#include "tagtest.hxx" -#include "gsicheck.hxx" - -namespace { - -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 Help() -{ - fprintf( stdout, "\n" ); - fprintf( stdout, "gsicheck checks the syntax of tags in SDF-Files\n" ); - fprintf( stdout, " checks for inconsistencies and malicious UTF8 encoding\n" ); - fprintf( stdout, " checks tags in Online Help\n" ); - fprintf( stdout, " relax GID/LID length to %s\n", - rtl::OString::valueOf(static_cast(MAX_GID_LID_LEN)).getStr() ); - fprintf( stdout, "\n" ); - fprintf( stdout, "Syntax: gsicheck [ -c ] [-f] [ -we ] [ -wef ErrorFilename ] [ -wc ]\n" ); - fprintf( stdout, " [ -wcf CorrectFilename ] [ -s | -t ] [ -l LanguageID ]\n" ); - fprintf( stdout, " [ -r ReferenceFile ] filename\n" ); - fprintf( stdout, "\n" ); - fprintf( stdout, "-c Add context to error message (Print the line containing the error)\n" ); - fprintf( stdout, "-f try to fix errors. See also -wf -wff \n" ); - fprintf( stdout, "-wf Write File containing all fixed parts\n" ); - fprintf( stdout, "-wff Same as above but give own filename\n" ); - fprintf( stdout, "-we Write File containing all errors\n" ); - fprintf( stdout, "-wef Same as above but give own filename\n" ); - fprintf( stdout, "-wc Write File containing all correct parts\n" ); - fprintf( stdout, "-wcf Same as above but give own filename\n" ); - fprintf( stdout, "-s Check only source language. Should be used before handing out to vendor.\n" ); - fprintf( stdout, "-t Check only Translation language(s). Should be used before merging.\n" ); - fprintf( stdout, "-e disable encoding checks. E.g.: double questionmark \'??\' which may be the\n" ); - fprintf( stdout, " result of false conversions\n" ); - fprintf( stdout, "-l ISO language code of the source language.\n" ); - fprintf( stdout, " Default is en-US. Use \"\" (empty string) or 'none'\n" ); - fprintf( stdout, " to disable source language dependent checks\n" ); - fprintf( stdout, "-r Reference filename to check that source language entries\n" ); - fprintf( stdout, " have not been changed\n" ); - fprintf( stdout, "\n" ); -} - -SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { - sal_Bool bError = sal_False; - sal_Bool bPrintContext = sal_False; - sal_Bool bCheckSourceLang = sal_False; - sal_Bool bCheckTranslationLang = sal_False; - sal_Bool bWriteError = sal_False; - sal_Bool bWriteCorrect = sal_False; - sal_Bool bWriteFixed = sal_False; - sal_Bool bFixTags = sal_False; - sal_Bool bAllowSuspicious = sal_False; - 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 ( int i = 1 ; i < argc ; i++ ) - { - if ( *argv[ i ] == '-' ) - { - switch (*(argv[ i ]+1)) - { - case 'c':bPrintContext = sal_True; - break; - case 'w': - { - if ( (*(argv[ i ]+2)) == 'e' ) - { - if ( (*(argv[ i ]+3)) == 'f' ) - if ( (i+1) < argc ) - { - aErrorFilename = argv[i + 1]; - bWriteError = sal_True; - i++; - } - else - { - fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); - bError = sal_True; - } - else - bWriteError = sal_True; - } - else if ( (*(argv[ i ]+2)) == 'c' ) - if ( (*(argv[ i ]+3)) == 'f' ) - if ( (i+1) < argc ) - { - aCorrectFilename = argv[i + 1]; - bWriteCorrect = sal_True; - i++; - } - else - { - fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); - bError = sal_True; - } - else - bWriteCorrect = sal_True; - else if ( (*(argv[ i ]+2)) == 'f' ) - if ( (*(argv[ i ]+3)) == 'f' ) - if ( (i+1) < argc ) - { - aFixedFilename = argv[i + 1]; - bWriteFixed = sal_True; - bFixTags = sal_True; - i++; - } - else - { - fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); - bError = sal_True; - } - else - { - bWriteFixed = sal_True; - bFixTags = sal_True; - } - else - { - fprintf( stderr, "\nERROR: Unknown Switch %s!\n\n", argv[ i ] ); - bError = sal_True; - } - } - break; - case 's':bCheckSourceLang = sal_True; - break; - case 't':bCheckTranslationLang = sal_True; - break; - case 'l': - { - if ( (i+1) < argc ) - { - aSourceLang = argv[ i+1 ]; - if ( aSourceLang.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("none")) ) - aSourceLang = rtl::OString(); - i++; - } - else - { - fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); - bError = sal_True; - } - } - break; - case 'r': - { - if ( (i+1) < argc ) - { - aReferenceFilename = argv[ i+1 ]; - bReferenceFile = sal_True; - i++; - } - else - { - fprintf( stderr, "\nERROR: Switch %s requires parameter!\n\n", argv[ i ] ); - bError = sal_True; - } - } - break; - case 'f': - { - bFixTags = sal_True; - } - break; - case 'e': - { - bAllowSuspicious = sal_True; - } - break; - default: - fprintf( stderr, "\nERROR: Unknown Switch %s!\n\n", argv[ i ] ); - bError = sal_True; - } - } - else - { - if (aFilename.isEmpty()) - aFilename = argv[i]; - else - { - fprintf( stderr, "\nERROR: Only one filename may be specified!\n\n"); - bError = sal_True; - } - } - } - - - if (aFilename.isEmpty() || bError) - { - Help(); - exit ( 0 ); - } - - if ( !aSourceLang.isEmpty() && !LanguageOK( aSourceLang ) ) - { - fprintf( stderr, "\nERROR: The Language '%s' is invalid!\n\n", aSourceLang.getStr() ); - Help(); - exit ( 1 ); - } - - if ( bCheckSourceLang && bCheckTranslationLang ) - { - fprintf( stderr, "\nERROR: The Options -s and -t are mutually exclusive.\nUse only one of them.\n\n" ); - Help(); - exit ( 1 ); - } - - - - std::ifstream aGSI(aFilename.getStr()); - if (!aGSI.is_open()) { - fprintf( stderr, "\nERROR: Could not open GSI-File %s!\n\n", aFilename.getStr() ); - exit ( 3 ); - } - - std::ifstream aReferenceGSI; - if ( bReferenceFile ) - { - aReferenceGSI.open(aReferenceFilename.getStr()); - if (!aReferenceGSI.is_open()) { - fprintf( stderr, "\nERROR: Could not open Input-File %s!\n\n", aFilename.getStr() ); - exit ( 3 ); - } - } - - LazyStream aOkOut; - if ( bWriteCorrect ) - { - if (aCorrectFilename.isEmpty()) - { - aCorrectFilename = addSuffix( - aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_ok"))); - } - aOkOut.SetFileName(aCorrectFilename); - } - - LazyStream aErrOut; - if ( bWriteError ) - { - if (aErrorFilename.isEmpty()) - { - aErrorFilename = addSuffix( - aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_err"))); - } - aErrOut.SetFileName(aErrorFilename); - } - - LazyStream aFixOut; - if ( bWriteFixed ) - { - if (aFixedFilename.isEmpty()) - { - aFixedFilename = addSuffix( - aFilename, rtl::OString(RTL_CONSTASCII_STRINGPARAM("_fix"))); - } - aFixOut.SetFileName(aFixedFilename); - } - - - GSILine* pReferenceLine = NULL; - std::size_t nReferenceLine = 0; - - GSILine* pGSILine = NULL; - rtl::OString aOldId("No Valid ID"); // just set to something which can never be an ID - GSIBlock *pBlock = NULL; - std::size_t nLine = 0; - - while (!aGSI.eof()) - { - std::string s; - std::getline(aGSI, s); - nLine++; - - pGSILine = new GSILine(rtl::OString(s.data(), s.length()), nLine ); - sal_Bool bDelete = sal_True; - - if ( !pGSILine->data_.isEmpty() ) - { - if ( FORMAT_UNKNOWN == pGSILine->GetLineFormat() ) - { - PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), bPrintContext, pGSILine->GetLineNumber() ); - pGSILine->NotOK(); - if ( bWriteError ) - { - bFileHasError = sal_True; - aErrOut.LazyOpen(); - aErrOut << pGSILine->data_.getStr(); - } - } - else if ( pGSILine->GetLineType().equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("res-comment")) ) - { // ignore comment lines, but write them to Correct Items File - if ( bWriteCorrect ) - { - aOkOut.LazyOpen(); - aOkOut << pGSILine->data_.getStr() << '\n'; - } - } - else - { - rtl::OString aId = pGSILine->GetUniqId(); - if ( aId != aOldId ) - { - if ( pBlock ) - { - bFileHasError |= pBlock->CheckSyntax( nLine, !aSourceLang.isEmpty(), bFixTags ); - - if ( bWriteError ) - pBlock->WriteError( aErrOut, !aSourceLang.isEmpty() ); - if ( bWriteCorrect ) - pBlock->WriteCorrect( aOkOut, !aSourceLang.isEmpty() ); - if ( bWriteFixed ) - pBlock->WriteFixed( aFixOut ); - - delete pBlock; - } - pBlock = new GSIBlock( bPrintContext, bCheckSourceLang, bCheckTranslationLang, bReferenceFile, bAllowSuspicious ); - - aOldId = aId; - - // find corresponding line in reference file - if ( bReferenceFile ) - { - sal_Bool bContinueSearching = sal_True; - while ( ( !aReferenceGSI.eof() || pReferenceLine ) && bContinueSearching ) - { - if ( !pReferenceLine ) - { - std::string s2; - std::getline(aReferenceGSI, s2); - nReferenceLine++; - pReferenceLine = new GSILine( - rtl::OString(s2.data(), s2.length()), - nReferenceLine); - } - if ( pReferenceLine->GetLineFormat() != FORMAT_UNKNOWN ) - { - if ( pReferenceLine->GetUniqId() == aId && pReferenceLine->GetLanguageId() == aSourceLang ) - { - pBlock->SetReferenceLine( pReferenceLine ); - pReferenceLine = NULL; - } - else if ( pReferenceLine->GetUniqId() > aId ) - { - bContinueSearching = sal_False; - } - else - { - if ( pReferenceLine->GetUniqId() < aId && pReferenceLine->GetLanguageId() == aSourceLang ) - PrintError( "No Entry in source file found. Entry has been removed from source file", "File format", "", bPrintContext, pGSILine->GetLineNumber(), pReferenceLine->GetUniqId() ); - delete pReferenceLine; - pReferenceLine = NULL; - } - } - else - { - delete pReferenceLine; - pReferenceLine = NULL; - } - - } - } - - } - pBlock->InsertLine( pGSILine, aSourceLang ); - bDelete = sal_False; - } - } - if ( bDelete ) - delete pGSILine; - } - if ( pBlock ) - { - bFileHasError |= pBlock->CheckSyntax( nLine, !aSourceLang.isEmpty(), bFixTags ); - - if ( bWriteError ) - pBlock->WriteError( aErrOut, !aSourceLang.isEmpty() ); - if ( bWriteCorrect ) - pBlock->WriteCorrect( aOkOut, !aSourceLang.isEmpty() ); - if ( bWriteFixed ) - pBlock->WriteFixed( aFixOut ); - - delete pBlock; - } - aGSI.close(); - - if ( bWriteError ) - aErrOut.close(); - if ( bWriteCorrect ) - aOkOut.close(); - if ( bWriteFixed ) - aFixOut.close(); - if ( bFileHasError ) - return 55; - else - return 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/helpmerge.cxx b/l10ntools/source/helpmerge.cxx index cbf38fb9e809..2d4435c5e74c 100644 --- a/l10ntools/source/helpmerge.cxx +++ b/l10ntools/source/helpmerge.cxx @@ -52,7 +52,6 @@ #include "common.hxx" #include "helper.hxx" -#include "gsicheck.hxx" #if OSL_DEBUG_LEVEL > 2 void HelpParser::Dump(XMLHashMap* rElem_in) @@ -396,12 +395,9 @@ void HelpParser::ProcessHelp( LangHashMap* aLangHM , const rtl::OString& sCur , { if( pXMLElement != NULL ) { - if (check(pEntrys->GetSDF(sCur),pEntrys->GetNLine(sCur))) - { - data = new XMLData( sNewdata , NULL , true ); // Add new one - pXMLElement->RemoveAndDeleteAllChildren(); - pXMLElement->AddChild( data ); - } + data = new XMLData( sNewdata , NULL , true ); // Add new one + pXMLElement->RemoveAndDeleteAllChildren(); + pXMLElement->AddChild( data ); aLangHM->erase( sCur ); } } diff --git a/l10ntools/source/merge.cxx b/l10ntools/source/merge.cxx index 4d5d3f6bbc1e..f74bdc0ea22c 100644 --- a/l10ntools/source/merge.cxx +++ b/l10ntools/source/merge.cxx @@ -151,7 +151,6 @@ MergeDataFile::MergeDataFile( printf("Warning : Can't open %s\n", rFileName.getStr()); return; } - std::size_t nLine=0; while (!aInputStream.eof()) { std::string buf; @@ -172,12 +171,11 @@ MergeDataFile::MergeDataFile( const rtl::OString sTEXT = sLine.getToken( 0, '\t', n ); // token 10 const rtl::OString sQHTEXT = sLine.getToken( 1, '\t', n ); // token 12 const rtl::OString sTITLE = sLine.getToken( 0, '\t', n ); // token 13 - const rtl::OString sSDF(buf.data(),buf.length()); if (!nLANG.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("en-US"))) { aLanguageSet.insert(nLANG); - InsertEntry( sTYP, sGID, sLID, sPFO, nLANG, sTEXT, sQHTEXT, sTITLE, filename, bCaseSensitive, sSDF, ++nLine); + InsertEntry( sTYP, sGID, sLID, sPFO, nLANG, sTEXT, sQHTEXT, sTITLE, filename, bCaseSensitive ); } } } @@ -245,8 +243,7 @@ void MergeDataFile::InsertEntry( const rtl::OString &rLID, const rtl::OString &rPFO, const rtl::OString &nLANG, const rtl::OString &rTEXT, const rtl::OString &rQHTEXT, const rtl::OString &rTITLE , - const rtl::OString &rInFilename , bool bCaseSensitive, - const rtl::OString &rSDFLine, const std::size_t nLine + const rtl::OString &rInFilename , bool bCaseSensitive ) { MergeData *pData; @@ -277,7 +274,7 @@ void MergeDataFile::InsertEntry( } // finaly insert the cur string - pFEntrys->InsertEntry( nLANG , rTEXT, rQHTEXT, rTITLE, rSDFLine, nLine ); + pFEntrys->InsertEntry( nLANG , rTEXT, rQHTEXT, rTITLE ); } rtl::OString MergeDataFile::CreateKey(const rtl::OString& rTYP, const rtl::OString& rGID, -- cgit v1.2.3