1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_rsc.hxx" 30 /****************** I N C L U D E S **************************************/ 31 // C and C++ Includes. 32 #include <string.h> 33 #include <rscpar.hxx> 34 #include <rscdb.hxx> 35 36 /****************** R s c F i l e I n s t ********************************/ 37 /****************** C O D E **********************************************/ 38 /************************************************************************* 39 |* 40 |* RscFileInst::Init() 41 |* 42 |* Beschreibung 43 |* Ersterstellung MM 05.11.91 44 |* Letzte Aenderung MM 17.02.93 45 |* 46 *************************************************************************/ 47 void RscFileInst::Init() 48 { 49 nLineNo = 0; 50 nLineBufLen = 256; 51 pLine = (char *)rtl_allocateMemory( nLineBufLen ); 52 *pLine = '\0'; 53 nScanPos = 0; 54 cLastChar = '\0'; 55 bEof = sal_False; 56 }; 57 58 /************************************************************************* 59 |* 60 |* RscFileInst::RscFileInst() 61 |* 62 |* Beschreibung 63 |* Ersterstellung MM 06.06.91 64 |* Letzte Aenderung MM 06.06.91 65 |* 66 *************************************************************************/ 67 RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc, 68 sal_uLong lFIndex, FILE * fFile ) 69 { 70 pTypCont = pTC; 71 Init(); 72 73 lFileIndex = lFIndex; 74 lSrcIndex = lIndexSrc; 75 fInputFile = fFile; 76 77 //Status: Zeiger am Ende des Lesepuffers 78 nInputPos = nInputEndPos = nInputBufLen = READBUFFER_MAX; 79 pInput = (char *)rtl_allocateMemory( nInputBufLen ); 80 } 81 82 RscFileInst::RscFileInst( RscTypCont * pTC, sal_uLong lIndexSrc, 83 sal_uLong lFIndex, const ByteString& rBuf ) 84 { 85 pTypCont = pTC; 86 Init(); 87 lFileIndex = lFIndex; 88 lSrcIndex = lIndexSrc; 89 fInputFile = NULL; 90 nInputPos = 0; 91 nInputEndPos = rBuf.Len(); 92 93 // Muss groesser sein wegen Eingabeende bei nInputBufLen < nInputEndPos 94 nInputBufLen = nInputEndPos +1; 95 pInput = (char *)rtl_allocateMemory( nInputBufLen +100 ); 96 memcpy( pInput, rBuf.GetBuffer(), nInputEndPos ); 97 } 98 99 /************************************************************************* 100 |* 101 |* RscFileInst::~RscFileInst() 102 |* 103 |* Beschreibung 104 |* Ersterstellung MM 06.06.91 105 |* Letzte Aenderung MM 06.06.91 106 |* 107 *************************************************************************/ 108 RscFileInst::~RscFileInst(){ 109 if( pInput ) 110 rtl_freeMemory( pInput ); 111 if( pLine ) 112 rtl_freeMemory( pLine ); 113 } 114 115 /************************************************************************* 116 |* 117 |* RscFileInst::GetChar() 118 |* 119 |* Beschreibung 120 |* Ersterstellung MM 01.06.91 121 |* Letzte Aenderung MM 09.08.91 122 |* 123 *************************************************************************/ 124 int RscFileInst::GetChar() 125 { 126 if( pLine[ nScanPos ] ) 127 return( pLine[ nScanPos++ ] ); 128 else if( nInputPos >= nInputEndPos && nInputEndPos != nInputBufLen ) 129 { 130 // Dateiende 131 bEof = sal_True; 132 return 0; 133 } 134 else 135 { 136 GetNewLine(); 137 return( '\n' ); 138 } 139 } 140 141 /************************************************************************* 142 |* 143 |* RscFileInst::GetNewLine() 144 |* 145 |* Beschreibung 146 |* Ersterstellung MM 06.06.91 147 |* Letzte Aenderung MM 06.06.91 148 |* 149 *************************************************************************/ 150 void RscFileInst::GetNewLine() 151 { 152 nLineNo++; 153 nScanPos = 0; 154 155 //laeuft bis Dateiende 156 sal_uInt32 nLen = 0; 157 while( (nInputPos < nInputEndPos) || (nInputEndPos == nInputBufLen) ) 158 { 159 if( (nInputPos >= nInputEndPos) && fInputFile ) 160 { 161 nInputEndPos = fread( pInput, 1, nInputBufLen, fInputFile ); 162 nInputPos = 0; 163 } 164 165 while( nInputPos < nInputEndPos ) 166 { 167 //immer eine Zeile lesen 168 if( nLen >= nLineBufLen ) 169 { 170 nLineBufLen += 256; 171 // einen dazu fuer '\0' 172 pLine = (char*)rtl_reallocateMemory( pLine, nLineBufLen +1 ); 173 } 174 175 // cr lf, lf cr, lf oder cr wird '\0' 176 if( pInput[ nInputPos ] == '\n' ){ 177 nInputPos++; 178 if( cLastChar != '\r' ){ 179 cLastChar = '\n'; 180 pLine[ nLen++ ] = '\0'; 181 goto END; 182 } 183 } 184 else if( pInput[ nInputPos ] == '\r' ){ 185 nInputPos++; 186 if( cLastChar != '\n' ){ 187 cLastChar = '\r'; 188 pLine[ nLen++ ] = '\0'; 189 goto END; 190 } 191 } 192 else 193 { 194 pLine[ nLen++ ] = pInput[ nInputPos++ ]; 195 if( nLen > 2 ) 196 { 197 if( (unsigned char)pLine[nLen-3] == 0xef && 198 (unsigned char)pLine[nLen-2] == 0xbb && 199 (unsigned char)pLine[nLen-1] == 0xbf ) 200 { 201 nLen -= 3; 202 } 203 } 204 } 205 }; 206 }; 207 208 // Abbruch ueber EOF 209 pLine[ nLen ] = '\0'; 210 211 END: 212 if( pTypCont->pEH->GetListFile() ){ 213 char buf[ 10 ]; 214 215 sprintf( buf, "%5d ", (int)GetLineNo() ); 216 pTypCont->pEH->LstOut( buf ); 217 pTypCont->pEH->LstOut( GetLine() ); 218 pTypCont->pEH->LstOut( "\n" ); 219 } 220 } 221 222 /************************************************************************* 223 |* 224 |* RscFileInst::SetError() 225 |* 226 |* Beschreibung 227 |* Ersterstellung MM 05.11.91 228 |* Letzte Aenderung MM 05.11.91 229 |* 230 *************************************************************************/ 231 void RscFileInst::SetError( ERRTYPE aError ) 232 { 233 if( aError.IsOk() ) 234 { 235 aFirstError = aError; 236 nErrorLine = GetLineNo(); 237 nErrorPos = GetScanPos() -1; 238 }; 239 }; 240