forked from amazingfate/loongoffice
A simplified version of the semantic match that finds this problem is follows: (http://coccinelle.lip6.fr/) // <smpl> @r1@ statement S; position p,p1; @@ S@p1;@p @script:python r2@ p << r1.p; p1 << r1.p1; @@ if p[0].line != p1[0].line_end: cocci.include_match(False) @@ position r1.p; @@ -;@p // </smpl> Change-Id: Ib9708d37fbb4c6060f88d5dae3814a2d37b2091e Reviewed-on: https://gerrit.libreoffice.org/9493 Reviewed-by: Noel Grandin <noelgrandin@gmail.com> Tested-by: Noel Grandin <noelgrandin@gmail.com>
165 lines
4.3 KiB
C++
165 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 = (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;
|
|
|
|
//Status: Zeiger am Ende des Lesepuffers
|
|
nInputPos = nInputEndPos = nInputBufLen = READBUFFER_MAX;
|
|
pInput = (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 )
|
|
{
|
|
// Dateiende
|
|
bEof = true;
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
GetNewLine();
|
|
return '\n';
|
|
}
|
|
}
|
|
|
|
void RscFileInst::GetNewLine()
|
|
{
|
|
nLineNo++;
|
|
nScanPos = 0;
|
|
|
|
//laeuft bis Dateiende
|
|
sal_uInt32 nLen = 0;
|
|
while( (nInputPos < nInputEndPos) || (nInputEndPos == nInputBufLen) )
|
|
{
|
|
if( (nInputPos >= nInputEndPos) && fInputFile )
|
|
{
|
|
nInputEndPos = fread( pInput, 1, nInputBufLen, fInputFile );
|
|
nInputPos = 0;
|
|
}
|
|
|
|
while( nInputPos < nInputEndPos )
|
|
{
|
|
//immer eine Zeile lesen
|
|
if( nLen >= nLineBufLen )
|
|
{
|
|
nLineBufLen += 256;
|
|
// einen dazu fuer '\0'
|
|
pLine = (char*)rtl_reallocateMemory( pLine, nLineBufLen +1 );
|
|
}
|
|
|
|
// cr lf, lf cr, lf oder cr wird '\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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Abbruch ueber 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: */
|