diff options
Diffstat (limited to 'l10ntools/source/gsicheck.cxx')
-rw-r--r-- | l10ntools/source/gsicheck.cxx | 456 |
1 files changed, 22 insertions, 434 deletions
diff --git a/l10ntools/source/gsicheck.cxx b/l10ntools/source/gsicheck.cxx index af662d009b46..3a4c0af5d7ec 100644 --- a/l10ntools/source/gsicheck.cxx +++ b/l10ntools/source/gsicheck.cxx @@ -42,37 +42,9 @@ #include "tagtest.hxx" #include "gsicheck.hxx" -namespace { - -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, - rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString aUniqueId = rtl::OString() ) + rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString aUniqueId ) /*****************************************************************************/ { fprintf( stdout, "%s %s, Line %u", aType.getStr(), aPrefix.getStr(), static_cast<unsigned>( nLine ) ); @@ -87,7 +59,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() ) + rtl::OString const & aContext, sal_Bool bPrintContext, std::size_t nLine, rtl::OString const & aUniqueId ) /*****************************************************************************/ { PrintMessage( "Error:", aMsg, aPrefix, aContext, bPrintContext, nLine, aUniqueId ); @@ -109,27 +81,6 @@ 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 ) @@ -641,402 +592,39 @@ void GSIBlock::WriteFixed( LazyStream &aFixOut ) } } -/*****************************************************************************/ -void Help() -/*****************************************************************************/ +sal_Bool check(rtl::OString s, std::size_t nLine) { - 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; + pGSILine = new GSILine(s, nLine ); - while (!aGSI.eof()) + if ( !pGSILine->data_.isEmpty() ) { - 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() ) { - 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 + PrintError( "Format of line is unknown. Ignoring!", "Line format", pGSILine->data_.copy( 0,40 ), sal_True, pGSILine->GetLineNumber() ); + bFileHasError = sal_True; + pGSILine->NotOK(); + } + else if ( !(pGSILine->GetLineType().equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("res-comment"))) ) + { + 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) { - 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; + delete pBlock; + pBlock=NULL; + pGSILine=NULL; } } - 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(); - + delete pGSILine; if ( bFileHasError ) - return 55; + return false; else - return 0; + return true; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |