blob: 549f2e884102cf2d5a0728977cd905620e93f2e0 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_rsc.hxx"
/****************** I N C L U D E S **************************************/
// C and C++ Includes.
#include <string.h>
#include <rscpar.hxx>
#include <rscdb.hxx>
/****************** R s c F i l e I n s t ********************************/
/****************** C O D E **********************************************/
/*************************************************************************
|*
|* RscFileInst::Init()
|*
|* Beschreibung
|* Ersterstellung MM 05.11.91
|* Letzte Aenderung MM 17.02.93
|*
*************************************************************************/
void RscFileInst::Init()
{
nLineNo = 0;
nLineBufLen = 256;
pLine = (char *)rtl_allocateMemory( nLineBufLen );
*pLine = '\0';
nScanPos = 0;
cLastChar = '\0';
bEof = sal_False;
};
/*************************************************************************
|*
|* RscFileInst::RscFileInst()
|*
|* Beschreibung
|* Ersterstellung MM 06.06.91
|* Letzte Aenderung MM 06.06.91
|*
*************************************************************************/
RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc,
sal_uLong lFIndex, FILE * fFile )
{
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( RscTypCont * pTC, sal_uLong lIndexSrc,
sal_uLong lFIndex, const ByteString& rBuf )
{
pTypCont = pTC;
Init();
lFileIndex = lFIndex;
lSrcIndex = lIndexSrc;
fInputFile = NULL;
nInputPos = 0;
nInputEndPos = rBuf.Len();
// Muss groesser sein wegen Eingabeende bei nInputBufLen < nInputEndPos
nInputBufLen = nInputEndPos +1;
pInput = (char *)rtl_allocateMemory( nInputBufLen +100 );
memcpy( pInput, rBuf.GetBuffer(), nInputEndPos );
}
/*************************************************************************
|*
|* RscFileInst::~RscFileInst()
|*
|* Beschreibung
|* Ersterstellung MM 06.06.91
|* Letzte Aenderung MM 06.06.91
|*
*************************************************************************/
RscFileInst::~RscFileInst(){
if( pInput )
rtl_freeMemory( pInput );
if( pLine )
rtl_freeMemory( pLine );
}
/*************************************************************************
|*
|* RscFileInst::GetChar()
|*
|* Beschreibung
|* Ersterstellung MM 01.06.91
|* Letzte Aenderung MM 09.08.91
|*
*************************************************************************/
int RscFileInst::GetChar()
{
if( pLine[ nScanPos ] )
return( pLine[ nScanPos++ ] );
else if( nInputPos >= nInputEndPos && nInputEndPos != nInputBufLen )
{
// Dateiende
bEof = sal_True;
return 0;
}
else
{
GetNewLine();
return( '\n' );
}
}
/*************************************************************************
|*
|* RscFileInst::GetNewLine()
|*
|* Beschreibung
|* Ersterstellung MM 06.06.91
|* Letzte Aenderung MM 06.06.91
|*
*************************************************************************/
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" );
}
}
/*************************************************************************
|*
|* RscFileInst::SetError()
|*
|* Beschreibung
|* Ersterstellung MM 05.11.91
|* Letzte Aenderung MM 05.11.91
|*
*************************************************************************/
void RscFileInst::SetError( ERRTYPE aError )
{
if( aError.IsOk() )
{
aFirstError = aError;
nErrorLine = GetLineNo();
nErrorPos = GetScanPos() -1;
};
};