office-gobmx/rsc/source/parser/rscpar.cxx
Lucas Satabin 894151e80f tdf#39468: Translate German comments in core/rsc/source
Change-Id: Ia2d94a88d217a3b0ec9c78096b8d74a38216fbc9
Reviewed-on: https://gerrit.libreoffice.org/18066
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
2015-08-28 19:00:08 +00:00

164 lines
4.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <string.h>
#include <rscpar.hxx>
#include <rscdb.hxx>
void RscFileInst::Init()
{
nLineNo = 0;
nLineBufLen = 256;
pLine = static_cast<char *>(rtl_allocateMemory( nLineBufLen ));
*pLine = '\0';
nScanPos = 0;
cLastChar = '\0';
bEof = false;
}
RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc,
sal_uLong lFIndex, FILE * fFile )
: nErrorLine(0)
, nErrorPos(0)
{
pTypCont = pTC;
Init();
lFileIndex = lFIndex;
lSrcIndex = lIndexSrc;
fInputFile = fFile;
// state: pointer at the end of the input buffer
nInputPos = nInputEndPos = nInputBufLen = READBUFFER_MAX;
pInput = static_cast<char *>(rtl_allocateMemory( nInputBufLen ));
}
RscFileInst::~RscFileInst()
{
if( pInput )
rtl_freeMemory( pInput );
if( pLine )
rtl_freeMemory( pLine );
}
int RscFileInst::GetChar()
{
if( pLine[ nScanPos ] )
return pLine[ nScanPos++ ];
else if( nInputPos >= nInputEndPos && nInputEndPos != nInputBufLen )
{
// end of file
bEof = true;
return 0;
}
else
{
GetNewLine();
return '\n';
}
}
void RscFileInst::GetNewLine()
{
nLineNo++;
nScanPos = 0;
// run until end of file
sal_uInt32 nLen = 0;
while( (nInputPos < nInputEndPos) || (nInputEndPos == nInputBufLen) )
{
if( (nInputPos >= nInputEndPos) && fInputFile )
{
nInputEndPos = fread( pInput, 1, nInputBufLen, fInputFile );
nInputPos = 0;
}
while( nInputPos < nInputEndPos )
{
// always read one line
if( nLen >= nLineBufLen )
{
nLineBufLen += 256;
// one more for '\0'
pLine = static_cast<char*>(rtl_reallocateMemory( pLine, nLineBufLen +1 ));
}
// cr lf, lf cr, lf or cr become '\0'
if( pInput[ nInputPos ] == '\n' )
{
nInputPos++;
if( cLastChar != '\r' )
{
cLastChar = '\n';
pLine[ nLen++ ] = '\0';
goto END;
}
}
else if( pInput[ nInputPos ] == '\r' )
{
nInputPos++;
if( cLastChar != '\n' )
{
cLastChar = '\r';
pLine[ nLen++ ] = '\0';
goto END;
}
}
else
{
pLine[ nLen++ ] = pInput[ nInputPos++ ];
if( nLen > 2 )
{
if( (unsigned char)pLine[nLen-3] == 0xef &&
(unsigned char)pLine[nLen-2] == 0xbb &&
(unsigned char)pLine[nLen-1] == 0xbf )
{
nLen -= 3;
}
}
}
}
}
// stop on reaching EOF
pLine[ nLen ] = '\0';
END:
if( pTypCont->pEH->GetListFile() )
{
char buf[ 10 ];
sprintf( buf, "%5d ", (int)GetLineNo() );
pTypCont->pEH->LstOut( buf );
pTypCont->pEH->LstOut( GetLine() );
pTypCont->pEH->LstOut( "\n" );
}
}
void RscFileInst::SetError( ERRTYPE aError )
{
if( aError.IsOk() )
{
aFirstError = aError;
nErrorLine = GetLineNo();
nErrorPos = GetScanPos() -1;
}
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */