1*477794c1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*477794c1SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*477794c1SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*477794c1SAndrew Rist * distributed with this work for additional information
6*477794c1SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*477794c1SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*477794c1SAndrew Rist * "License"); you may not use this file except in compliance
9*477794c1SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*477794c1SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*477794c1SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*477794c1SAndrew Rist * software distributed under the License is distributed on an
15*477794c1SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*477794c1SAndrew Rist * KIND, either express or implied. See the License for the
17*477794c1SAndrew Rist * specific language governing permissions and limitations
18*477794c1SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*477794c1SAndrew Rist *************************************************************/
21*477794c1SAndrew Rist
22*477794c1SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_rsc.hxx"
26cdf0e10cSrcweir /****************** I N C L U D E S **************************************/
27cdf0e10cSrcweir // C and C++ Includes.
28cdf0e10cSrcweir #include <string.h>
29cdf0e10cSrcweir #include <rscpar.hxx>
30cdf0e10cSrcweir #include <rscdb.hxx>
31cdf0e10cSrcweir
32cdf0e10cSrcweir /****************** R s c F i l e I n s t ********************************/
33cdf0e10cSrcweir /****************** C O D E **********************************************/
34cdf0e10cSrcweir /*************************************************************************
35cdf0e10cSrcweir |*
36cdf0e10cSrcweir |* RscFileInst::Init()
37cdf0e10cSrcweir |*
38cdf0e10cSrcweir |* Beschreibung
39cdf0e10cSrcweir |* Ersterstellung MM 05.11.91
40cdf0e10cSrcweir |* Letzte Aenderung MM 17.02.93
41cdf0e10cSrcweir |*
42cdf0e10cSrcweir *************************************************************************/
Init()43cdf0e10cSrcweir void RscFileInst::Init()
44cdf0e10cSrcweir {
45cdf0e10cSrcweir nLineNo = 0;
46cdf0e10cSrcweir nLineBufLen = 256;
47cdf0e10cSrcweir pLine = (char *)rtl_allocateMemory( nLineBufLen );
48cdf0e10cSrcweir *pLine = '\0';
49cdf0e10cSrcweir nScanPos = 0;
50cdf0e10cSrcweir cLastChar = '\0';
51cdf0e10cSrcweir bEof = sal_False;
52cdf0e10cSrcweir };
53cdf0e10cSrcweir
54cdf0e10cSrcweir /*************************************************************************
55cdf0e10cSrcweir |*
56cdf0e10cSrcweir |* RscFileInst::RscFileInst()
57cdf0e10cSrcweir |*
58cdf0e10cSrcweir |* Beschreibung
59cdf0e10cSrcweir |* Ersterstellung MM 06.06.91
60cdf0e10cSrcweir |* Letzte Aenderung MM 06.06.91
61cdf0e10cSrcweir |*
62cdf0e10cSrcweir *************************************************************************/
RscFileInst(RscTypCont * pTC,sal_uLong lIndexSrc,sal_uLong lFIndex,FILE * fFile)63cdf0e10cSrcweir RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc,
64cdf0e10cSrcweir sal_uLong lFIndex, FILE * fFile )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir pTypCont = pTC;
67cdf0e10cSrcweir Init();
68cdf0e10cSrcweir
69cdf0e10cSrcweir lFileIndex = lFIndex;
70cdf0e10cSrcweir lSrcIndex = lIndexSrc;
71cdf0e10cSrcweir fInputFile = fFile;
72cdf0e10cSrcweir
73cdf0e10cSrcweir //Status: Zeiger am Ende des Lesepuffers
74cdf0e10cSrcweir nInputPos = nInputEndPos = nInputBufLen = READBUFFER_MAX;
75cdf0e10cSrcweir pInput = (char *)rtl_allocateMemory( nInputBufLen );
76cdf0e10cSrcweir }
77cdf0e10cSrcweir
RscFileInst(RscTypCont * pTC,sal_uLong lIndexSrc,sal_uLong lFIndex,const ByteString & rBuf)78cdf0e10cSrcweir RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc,
79cdf0e10cSrcweir sal_uLong lFIndex, const ByteString& rBuf )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir pTypCont = pTC;
82cdf0e10cSrcweir Init();
83cdf0e10cSrcweir lFileIndex = lFIndex;
84cdf0e10cSrcweir lSrcIndex = lIndexSrc;
85cdf0e10cSrcweir fInputFile = NULL;
86cdf0e10cSrcweir nInputPos = 0;
87cdf0e10cSrcweir nInputEndPos = rBuf.Len();
88cdf0e10cSrcweir
89cdf0e10cSrcweir // Muss groesser sein wegen Eingabeende bei nInputBufLen < nInputEndPos
90cdf0e10cSrcweir nInputBufLen = nInputEndPos +1;
91cdf0e10cSrcweir pInput = (char *)rtl_allocateMemory( nInputBufLen +100 );
92cdf0e10cSrcweir memcpy( pInput, rBuf.GetBuffer(), nInputEndPos );
93cdf0e10cSrcweir }
94cdf0e10cSrcweir
95cdf0e10cSrcweir /*************************************************************************
96cdf0e10cSrcweir |*
97cdf0e10cSrcweir |* RscFileInst::~RscFileInst()
98cdf0e10cSrcweir |*
99cdf0e10cSrcweir |* Beschreibung
100cdf0e10cSrcweir |* Ersterstellung MM 06.06.91
101cdf0e10cSrcweir |* Letzte Aenderung MM 06.06.91
102cdf0e10cSrcweir |*
103cdf0e10cSrcweir *************************************************************************/
~RscFileInst()104cdf0e10cSrcweir RscFileInst::~RscFileInst(){
105cdf0e10cSrcweir if( pInput )
106cdf0e10cSrcweir rtl_freeMemory( pInput );
107cdf0e10cSrcweir if( pLine )
108cdf0e10cSrcweir rtl_freeMemory( pLine );
109cdf0e10cSrcweir }
110cdf0e10cSrcweir
111cdf0e10cSrcweir /*************************************************************************
112cdf0e10cSrcweir |*
113cdf0e10cSrcweir |* RscFileInst::GetChar()
114cdf0e10cSrcweir |*
115cdf0e10cSrcweir |* Beschreibung
116cdf0e10cSrcweir |* Ersterstellung MM 01.06.91
117cdf0e10cSrcweir |* Letzte Aenderung MM 09.08.91
118cdf0e10cSrcweir |*
119cdf0e10cSrcweir *************************************************************************/
GetChar()120cdf0e10cSrcweir int RscFileInst::GetChar()
121cdf0e10cSrcweir {
122cdf0e10cSrcweir if( pLine[ nScanPos ] )
123cdf0e10cSrcweir return( pLine[ nScanPos++ ] );
124cdf0e10cSrcweir else if( nInputPos >= nInputEndPos && nInputEndPos != nInputBufLen )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir // Dateiende
127cdf0e10cSrcweir bEof = sal_True;
128cdf0e10cSrcweir return 0;
129cdf0e10cSrcweir }
130cdf0e10cSrcweir else
131cdf0e10cSrcweir {
132cdf0e10cSrcweir GetNewLine();
133cdf0e10cSrcweir return( '\n' );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
137cdf0e10cSrcweir /*************************************************************************
138cdf0e10cSrcweir |*
139cdf0e10cSrcweir |* RscFileInst::GetNewLine()
140cdf0e10cSrcweir |*
141cdf0e10cSrcweir |* Beschreibung
142cdf0e10cSrcweir |* Ersterstellung MM 06.06.91
143cdf0e10cSrcweir |* Letzte Aenderung MM 06.06.91
144cdf0e10cSrcweir |*
145cdf0e10cSrcweir *************************************************************************/
GetNewLine()146cdf0e10cSrcweir void RscFileInst::GetNewLine()
147cdf0e10cSrcweir {
148cdf0e10cSrcweir nLineNo++;
149cdf0e10cSrcweir nScanPos = 0;
150cdf0e10cSrcweir
151cdf0e10cSrcweir //laeuft bis Dateiende
152cdf0e10cSrcweir sal_uInt32 nLen = 0;
153cdf0e10cSrcweir while( (nInputPos < nInputEndPos) || (nInputEndPos == nInputBufLen) )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir if( (nInputPos >= nInputEndPos) && fInputFile )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir nInputEndPos = fread( pInput, 1, nInputBufLen, fInputFile );
158cdf0e10cSrcweir nInputPos = 0;
159cdf0e10cSrcweir }
160cdf0e10cSrcweir
161cdf0e10cSrcweir while( nInputPos < nInputEndPos )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir //immer eine Zeile lesen
164cdf0e10cSrcweir if( nLen >= nLineBufLen )
165cdf0e10cSrcweir {
166cdf0e10cSrcweir nLineBufLen += 256;
167cdf0e10cSrcweir // einen dazu fuer '\0'
168cdf0e10cSrcweir pLine = (char*)rtl_reallocateMemory( pLine, nLineBufLen +1 );
169cdf0e10cSrcweir }
170cdf0e10cSrcweir
171cdf0e10cSrcweir // cr lf, lf cr, lf oder cr wird '\0'
172cdf0e10cSrcweir if( pInput[ nInputPos ] == '\n' ){
173cdf0e10cSrcweir nInputPos++;
174cdf0e10cSrcweir if( cLastChar != '\r' ){
175cdf0e10cSrcweir cLastChar = '\n';
176cdf0e10cSrcweir pLine[ nLen++ ] = '\0';
177cdf0e10cSrcweir goto END;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir else if( pInput[ nInputPos ] == '\r' ){
181cdf0e10cSrcweir nInputPos++;
182cdf0e10cSrcweir if( cLastChar != '\n' ){
183cdf0e10cSrcweir cLastChar = '\r';
184cdf0e10cSrcweir pLine[ nLen++ ] = '\0';
185cdf0e10cSrcweir goto END;
186cdf0e10cSrcweir }
187cdf0e10cSrcweir }
188cdf0e10cSrcweir else
189cdf0e10cSrcweir {
190cdf0e10cSrcweir pLine[ nLen++ ] = pInput[ nInputPos++ ];
191cdf0e10cSrcweir if( nLen > 2 )
192cdf0e10cSrcweir {
193cdf0e10cSrcweir if( (unsigned char)pLine[nLen-3] == 0xef &&
194cdf0e10cSrcweir (unsigned char)pLine[nLen-2] == 0xbb &&
195cdf0e10cSrcweir (unsigned char)pLine[nLen-1] == 0xbf )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir nLen -= 3;
198cdf0e10cSrcweir }
199cdf0e10cSrcweir }
200cdf0e10cSrcweir }
201cdf0e10cSrcweir };
202cdf0e10cSrcweir };
203cdf0e10cSrcweir
204cdf0e10cSrcweir // Abbruch ueber EOF
205cdf0e10cSrcweir pLine[ nLen ] = '\0';
206cdf0e10cSrcweir
207cdf0e10cSrcweir END:
208cdf0e10cSrcweir if( pTypCont->pEH->GetListFile() ){
209cdf0e10cSrcweir char buf[ 10 ];
210cdf0e10cSrcweir
211cdf0e10cSrcweir sprintf( buf, "%5d ", (int)GetLineNo() );
212cdf0e10cSrcweir pTypCont->pEH->LstOut( buf );
213cdf0e10cSrcweir pTypCont->pEH->LstOut( GetLine() );
214cdf0e10cSrcweir pTypCont->pEH->LstOut( "\n" );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir }
217cdf0e10cSrcweir
218cdf0e10cSrcweir /*************************************************************************
219cdf0e10cSrcweir |*
220cdf0e10cSrcweir |* RscFileInst::SetError()
221cdf0e10cSrcweir |*
222cdf0e10cSrcweir |* Beschreibung
223cdf0e10cSrcweir |* Ersterstellung MM 05.11.91
224cdf0e10cSrcweir |* Letzte Aenderung MM 05.11.91
225cdf0e10cSrcweir |*
226cdf0e10cSrcweir *************************************************************************/
SetError(ERRTYPE aError)227cdf0e10cSrcweir void RscFileInst::SetError( ERRTYPE aError )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir if( aError.IsOk() )
230cdf0e10cSrcweir {
231cdf0e10cSrcweir aFirstError = aError;
232cdf0e10cSrcweir nErrorLine = GetLineNo();
233cdf0e10cSrcweir nErrorPos = GetScanPos() -1;
234cdf0e10cSrcweir };
235cdf0e10cSrcweir };
236