Kaydet (Commit) 8b97644b authored tarafından Andras Timar's avatar Andras Timar

Revert "fdo#52246 let helpex use gsicheck's tag checker"

This reverts commit e3b92778.
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
üst e05bafff
...@@ -34,12 +34,10 @@ $(eval $(call gb_Executable_set_include,gsicheck,\ ...@@ -34,12 +34,10 @@ $(eval $(call gb_Executable_set_include,gsicheck,\
$(eval $(call gb_Executable_use_libraries,gsicheck,\ $(eval $(call gb_Executable_use_libraries,gsicheck,\
sal \ sal \
)) ))
$(eval $(call gb_Executable_use_static_libraries,gsicheck,\
transex \
))
$(eval $(call gb_Executable_add_exception_objects,gsicheck,\ $(eval $(call gb_Executable_add_exception_objects,gsicheck,\
l10ntools/source/gsimain \ l10ntools/source/gsicheck \
l10ntools/source/tagtest \
)) ))
# vim:set shiftwidth=4 softtabstop=4 expandtab: # vim:set shiftwidth=4 softtabstop=4 expandtab:
...@@ -37,8 +37,6 @@ $(eval $(call gb_StaticLibrary_add_exception_objects,transex,\ ...@@ -37,8 +37,6 @@ $(eval $(call gb_StaticLibrary_add_exception_objects,transex,\
l10ntools/source/merge \ l10ntools/source/merge \
l10ntools/source/file \ l10ntools/source/file \
l10ntools/source/directory \ l10ntools/source/directory \
l10ntools/source/tagtest \
l10ntools/source/gsicheck \
)) ))
# vim: set noet sw=4 ts=4: # vim: set noet sw=4 ts=4:
...@@ -71,9 +71,6 @@ typedef boost::unordered_map<rtl::OString, PFormEntrys*, rtl::OStringHash> ...@@ -71,9 +71,6 @@ typedef boost::unordered_map<rtl::OString, PFormEntrys*, rtl::OStringHash>
typedef boost::unordered_map<rtl::OString, MergeData*, rtl::OStringHash> typedef boost::unordered_map<rtl::OString, MergeData*, rtl::OStringHash>
MergeDataHashMap; MergeDataHashMap;
typedef boost::unordered_map<rtl::OString, size_t, rtl::OStringHash>
LineNumberHashMap;
#define SOURCE_LANGUAGE rtl::OString(RTL_CONSTASCII_STRINGPARAM("en-US")) #define SOURCE_LANGUAGE rtl::OString(RTL_CONSTASCII_STRINGPARAM("en-US"))
#define X_COMMENT rtl::OString(RTL_CONSTASCII_STRINGPARAM("x-comment")) #define X_COMMENT rtl::OString(RTL_CONSTASCII_STRINGPARAM("x-comment"))
#define LIST_REFID "LIST_REFID" #define LIST_REFID "LIST_REFID"
...@@ -377,36 +374,23 @@ private: ...@@ -377,36 +374,23 @@ private:
OStringBoolHashMap bQuickHelpTextFirst; OStringBoolHashMap bQuickHelpTextFirst;
OStringHashMap sTitle; OStringHashMap sTitle;
OStringBoolHashMap bTitleFirst; OStringBoolHashMap bTitleFirst;
OStringHashMap sSDFLine;
LineNumberHashMap nLine;
public: public:
PFormEntrys( const rtl::OString &rPForm ) : data_( rPForm ) {}; PFormEntrys( const rtl::OString &rPForm ) : data_( rPForm ) {};
void InsertEntry(const rtl::OString &rId, const rtl::OString &rText, void InsertEntry(const rtl::OString &rId, const rtl::OString &rText,
const rtl::OString &rQuickHelpText, const rtl::OString &rTitle, const rtl::OString &rQuickHelpText, const rtl::OString &rTitle)
const rtl::OString &rSDFLine, const std::size_t nLineIn)
{ {
sText[ rId ] = rText; sText[ rId ] = rText;
bTextFirst[ rId ] = true; bTextFirst[ rId ] = true;
sQuickHelpText[ rId ] = rQuickHelpText; sQuickHelpText[ rId ] = rQuickHelpText;
bQuickHelpTextFirst[ rId ] = true; bQuickHelpTextFirst[ rId ] = true;
sTitle[ rId ] = rTitle; sTitle[ rId ] = rTitle;
bTitleFirst[ rId ] = true; 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 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 ); 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 ...@@ -459,8 +443,7 @@ class MergeDataFile
const rtl::OString &rLID, const rtl::OString &rPFO, const rtl::OString &rLID, const rtl::OString &rPFO,
const rtl::OString &nLang, const rtl::OString &rTEXT, const rtl::OString &nLang, const rtl::OString &rTEXT,
const rtl::OString &rQHTEXT, const rtl::OString &rTITLE, const rtl::OString &rQHTEXT, const rtl::OString &rTITLE,
const rtl::OString &sFilename, bool bCaseSensitive, const rtl::OString &sFilename, bool bCaseSensitive);
const rtl::OString &rSDF, std::size_t nLine);
public: public:
explicit MergeDataFile(const rtl::OString &rFileName, explicit MergeDataFile(const rtl::OString &rFileName,
const rtl::OString& rFile, bool bCaseSensitive); const rtl::OString& rFile, bool bCaseSensitive);
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <cstddef> #include <cstddef>
#include <vector> #include <vector>
#include <fstream>
#include "tagtest.hxx" #include "tagtest.hxx"
...@@ -132,39 +131,6 @@ public: ...@@ -132,39 +131,6 @@ public:
void WriteFixed( LazyStream &aFixOut ); 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 #endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "tagtest.hxx" #include "tagtest.hxx"
#include "gsicheck.hxx" #include "gsicheck.hxx"
sal_Int32 const MAX_GID_LID_LEN = 250;
namespace { namespace {
rtl::OString copyUpTo( rtl::OString copyUpTo(
...@@ -51,11 +53,26 @@ rtl::OString copyUpTo( ...@@ -51,11 +53,26 @@ rtl::OString copyUpTo(
return text.copy(start, std::min(text.getLength() - start, maximumLength)); 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, 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<unsigned>( nLine ) ); fprintf( stdout, "%s %s, Line %u", aType.getStr(), aPrefix.getStr(), static_cast<unsigned>( nLine ) );
...@@ -70,7 +87,7 @@ void PrintMessage( rtl::OString const & aType, rtl::OString const & aMsg, rtl::O ...@@ -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, 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 ); PrintMessage( "Error:", aMsg, aPrefix, aContext, bPrintContext, nLine, aUniqueId );
...@@ -92,6 +109,27 @@ bool LanguageOK( rtl::OString const & aLang ) ...@@ -92,6 +109,27 @@ bool LanguageOK( rtl::OString const & aLang )
&& !t0.equalsIgnoreAsciiCase(t1); && !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() void LazyStream::LazyOpen()
{ {
if ( !bOpened ) if ( !bOpened )
...@@ -603,39 +641,411 @@ void GSIBlock::WriteFixed( LazyStream &aFixOut ) ...@@ -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<sal_Int32>(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; 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; GSILine* pGSILine = NULL;
rtl::OString aOldId("No Valid ID"); // just set to something which can never be an ID
GSIBlock *pBlock = NULL; GSIBlock *pBlock = NULL;
pGSILine = new GSILine(s, nLine ); 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 ( !pGSILine->data_.isEmpty() )
{ {
if ( FORMAT_UNKNOWN == pGSILine->GetLineFormat() ) if ( FORMAT_UNKNOWN == pGSILine->GetLineFormat() )
{ {
PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), sal_True, pGSILine->GetLineNumber() ); PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), bPrintContext, pGSILine->GetLineNumber() );
bFileHasError = sal_True;
pGSILine->NotOK(); pGSILine->NotOK();
if ( bWriteError )
{
bFileHasError = sal_True;
aErrOut.LazyOpen();
aErrOut << pGSILine->data_.getStr();
} }
else if ( !(pGSILine->GetLineType().equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("res-comment"))) ) }
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
{ {
pBlock = new GSIBlock( sal_True, sal_False, sal_False, sal_False, sal_False ); rtl::OString aId = pGSILine->GetUniqId();
pBlock->InsertLine( pGSILine, rtl::OString() ); if ( aId != aOldId )
bFileHasError |= pBlock->CheckSyntax( nLine, sal_False, sal_False );
if (pBlock!=NULL)
{ {
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; delete pBlock;
pBlock=NULL; }
pGSILine=NULL; 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 ) if ( bFileHasError )
return false; return 55;
else else
return true; return 0;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- 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
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#include "sal/config.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <fstream>
#include <string>
#include <stdio.h>
#include <rtl/strbuf.hxx>
#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<sal_Int32>(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: */
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
#include "common.hxx" #include "common.hxx"
#include "helper.hxx" #include "helper.hxx"
#include "gsicheck.hxx"
#if OSL_DEBUG_LEVEL > 2 #if OSL_DEBUG_LEVEL > 2
void HelpParser::Dump(XMLHashMap* rElem_in) void HelpParser::Dump(XMLHashMap* rElem_in)
...@@ -395,13 +394,10 @@ void HelpParser::ProcessHelp( LangHashMap* aLangHM , const rtl::OString& sCur , ...@@ -395,13 +394,10 @@ void HelpParser::ProcessHelp( LangHashMap* aLangHM , const rtl::OString& sCur ,
if (!sNewdata.isEmpty()) if (!sNewdata.isEmpty())
{ {
if( pXMLElement != NULL ) if( pXMLElement != NULL )
{
if (check(pEntrys->GetSDF(sCur),pEntrys->GetNLine(sCur)))
{ {
data = new XMLData( sNewdata , NULL , true ); // Add new one data = new XMLData( sNewdata , NULL , true ); // Add new one
pXMLElement->RemoveAndDeleteAllChildren(); pXMLElement->RemoveAndDeleteAllChildren();
pXMLElement->AddChild( data ); pXMLElement->AddChild( data );
}
aLangHM->erase( sCur ); aLangHM->erase( sCur );
} }
} }
......
...@@ -151,7 +151,6 @@ MergeDataFile::MergeDataFile( ...@@ -151,7 +151,6 @@ MergeDataFile::MergeDataFile(
printf("Warning : Can't open %s\n", rFileName.getStr()); printf("Warning : Can't open %s\n", rFileName.getStr());
return; return;
} }
std::size_t nLine=0;
while (!aInputStream.eof()) while (!aInputStream.eof())
{ {
std::string buf; std::string buf;
...@@ -172,12 +171,11 @@ MergeDataFile::MergeDataFile( ...@@ -172,12 +171,11 @@ MergeDataFile::MergeDataFile(
const rtl::OString sTEXT = sLine.getToken( 0, '\t', n ); // token 10 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 sQHTEXT = sLine.getToken( 1, '\t', n ); // token 12
const rtl::OString sTITLE = sLine.getToken( 0, '\t', n ); // token 13 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"))) if (!nLANG.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("en-US")))
{ {
aLanguageSet.insert(nLANG); 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( ...@@ -245,8 +243,7 @@ void MergeDataFile::InsertEntry(
const rtl::OString &rLID, const rtl::OString &rPFO, const rtl::OString &rLID, const rtl::OString &rPFO,
const rtl::OString &nLANG, const rtl::OString &rTEXT, const rtl::OString &nLANG, const rtl::OString &rTEXT,
const rtl::OString &rQHTEXT, const rtl::OString &rTITLE , const rtl::OString &rQHTEXT, const rtl::OString &rTITLE ,
const rtl::OString &rInFilename , bool bCaseSensitive, const rtl::OString &rInFilename , bool bCaseSensitive
const rtl::OString &rSDFLine, const std::size_t nLine
) )
{ {
MergeData *pData; MergeData *pData;
...@@ -277,7 +274,7 @@ void MergeDataFile::InsertEntry( ...@@ -277,7 +274,7 @@ void MergeDataFile::InsertEntry(
} }
// finaly insert the cur string // 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, rtl::OString MergeDataFile::CreateKey(const rtl::OString& rTYP, const rtl::OString& rGID,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment