19e0fc027SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39e0fc027SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49e0fc027SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59e0fc027SAndrew Rist  * distributed with this work for additional information
69e0fc027SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79e0fc027SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89e0fc027SAndrew Rist  * "License"); you may not use this file except in compliance
99e0fc027SAndrew Rist  * with the License.  You may obtain a copy of the License at
109e0fc027SAndrew Rist  *
119e0fc027SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
129e0fc027SAndrew Rist  *
139e0fc027SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149e0fc027SAndrew Rist  * software distributed under the License is distributed on an
159e0fc027SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169e0fc027SAndrew Rist  * KIND, either express or implied.  See the License for the
179e0fc027SAndrew Rist  * specific language governing permissions and limitations
189e0fc027SAndrew Rist  * under the License.
199e0fc027SAndrew Rist  *
209e0fc027SAndrew Rist  *************************************************************/
219e0fc027SAndrew Rist 
229e0fc027SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_filter.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <string.h>
28cdf0e10cSrcweir #include <stdlib.h>
29cdf0e10cSrcweir #include <tools/stream.hxx>
30cdf0e10cSrcweir #include "dxfgrprd.hxx"
31cdf0e10cSrcweir 
32cdf0e10cSrcweir // ----------------------------------------------------------------------------
33cdf0e10cSrcweir 
34cdf0e10cSrcweir // we use an own ReadLine function, because Stream::ReadLine stops if
35cdf0e10cSrcweir // a 0-sign occurs; this functions converts 0-signs to blanks and reads
36cdf0e10cSrcweir // a complete line until a cr/lf is found
37cdf0e10cSrcweir 
DXFReadLine(SvStream & rIStm,ByteString & rStr)38cdf0e10cSrcweir sal_Bool DXFReadLine( SvStream& rIStm, ByteString& rStr )
39cdf0e10cSrcweir {
40cdf0e10cSrcweir 	char  buf[256 + 1];
41cdf0e10cSrcweir 	sal_Bool  bEnd = sal_False;
42cdf0e10cSrcweir 	sal_uLong nOldFilePos = rIStm.Tell();
43cdf0e10cSrcweir 	char  c = 0;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 	rStr.Erase();
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 	while( !bEnd && !rIStm.GetError() )   // !!! nicht auf EOF testen,
48cdf0e10cSrcweir 										  // !!! weil wir blockweise
49cdf0e10cSrcweir 										  // !!! lesen
50cdf0e10cSrcweir 	{
51cdf0e10cSrcweir 		sal_uInt16 nLen = (sal_uInt16)rIStm.Read( buf, sizeof(buf)-1 );
52cdf0e10cSrcweir 		if( !nLen )
53cdf0e10cSrcweir 		{
54cdf0e10cSrcweir 			if( rStr.Len() == 0 )
55cdf0e10cSrcweir 				return sal_False;
56cdf0e10cSrcweir 			else
57cdf0e10cSrcweir 				break;
58cdf0e10cSrcweir 		}
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 		for( sal_uInt16 n = 0; n < nLen ; n++ )
61cdf0e10cSrcweir 		{
62cdf0e10cSrcweir 			c = buf[n];
63cdf0e10cSrcweir 			if( c != '\n' && c != '\r' )
64cdf0e10cSrcweir 			{
65cdf0e10cSrcweir 				if( !c )
66cdf0e10cSrcweir 					c = ' ';
67cdf0e10cSrcweir 				rStr += c;
68cdf0e10cSrcweir 			}
69cdf0e10cSrcweir 			else
70cdf0e10cSrcweir 			{
71cdf0e10cSrcweir 				bEnd = sal_True;
72cdf0e10cSrcweir 				break;
73cdf0e10cSrcweir 			}
74cdf0e10cSrcweir 		}
75cdf0e10cSrcweir 	}
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 	if( !bEnd && !rIStm.GetError() && rStr.Len() )
78cdf0e10cSrcweir 		bEnd = sal_True;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	nOldFilePos += rStr.Len();
81cdf0e10cSrcweir 	if( rIStm.Tell() > nOldFilePos )
82cdf0e10cSrcweir 		nOldFilePos++;
83cdf0e10cSrcweir 	rIStm.Seek( nOldFilePos );  // seeken wg. obigem BlockRead!
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	if( bEnd && (c=='\r' || c=='\n'))  // Sonderbehandlung DOS-Dateien
86cdf0e10cSrcweir 	{
87cdf0e10cSrcweir 		char cTemp;
88cdf0e10cSrcweir 		rIStm.Read((char*)&cTemp , sizeof(cTemp) );
89cdf0e10cSrcweir 		if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
90cdf0e10cSrcweir 			rIStm.Seek( nOldFilePos );
91cdf0e10cSrcweir 	}
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	return bEnd;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir // ------------------
97cdf0e10cSrcweir 
DXFGroupReader(SvStream & rIStream,sal_uInt16 nminpercent,sal_uInt16 nmaxpercent)98cdf0e10cSrcweir DXFGroupReader::DXFGroupReader(SvStream & rIStream, sal_uInt16 nminpercent, sal_uInt16 nmaxpercent ) :
99cdf0e10cSrcweir 	rIS(rIStream)
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	sal_uInt16 i;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	nIBuffPos=0;
104cdf0e10cSrcweir 	nIBuffSize=0;
105cdf0e10cSrcweir 	bStatus=sal_True;
106cdf0e10cSrcweir 	nLastG=0;
107cdf0e10cSrcweir 	nGCount=0;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	nMinPercent=(sal_uLong)nminpercent;
110cdf0e10cSrcweir 	nMaxPercent=(sal_uLong)nmaxpercent;
111cdf0e10cSrcweir 	nLastPercent=nMinPercent;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 	rIS.Seek(STREAM_SEEK_TO_END);
114cdf0e10cSrcweir 	nFileSize=rIS.Tell();
115cdf0e10cSrcweir 	rIS.Seek(0);
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	for (i=0; i<10; i++) S0_9[i][0]=0;
118cdf0e10cSrcweir     S100[ 0 ] = S102[ 0 ] = 0;
119cdf0e10cSrcweir 	for (i=0; i<50; i++) F10_59[i]=0.0;
120cdf0e10cSrcweir 	for (i=0; i<20; i++) I60_79[i]=0;
121cdf0e10cSrcweir 	for (i=0; i<10; i++) I90_99[i]=0;
122cdf0e10cSrcweir 	for (i=0; i< 8; i++) F140_147[i]=0.0;
123cdf0e10cSrcweir 	for (i=0; i< 6; i++) I170_175[i]=0;
124cdf0e10cSrcweir 	for (i=0; i<30; i++) F210_239[i]=0.0;
125cdf0e10cSrcweir 	for (i=0; i<11; i++) S999_1009[i][0]=0;
126cdf0e10cSrcweir 	for (i=0; i<50; i++) F1010_1059[i]=0.0;
127cdf0e10cSrcweir 	for (i=0; i<20; i++) I1060_1079[i]=0;
128cdf0e10cSrcweir 
129cdf0e10cSrcweir }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 
Read()132cdf0e10cSrcweir sal_uInt16 DXFGroupReader::Read()
133cdf0e10cSrcweir {
134cdf0e10cSrcweir 	sal_uInt16 nG = 0;
135cdf0e10cSrcweir 	if ( bStatus )
136cdf0e10cSrcweir 	{
137cdf0e10cSrcweir 		nGCount++;
138cdf0e10cSrcweir 		nG = (sal_uInt16)ReadI();
139cdf0e10cSrcweir 		if ( bStatus )
140cdf0e10cSrcweir 		{
141cdf0e10cSrcweir 			char aTmp[ DXF_MAX_STRING_LEN + 1 ];
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 			if      (nG<  10) ReadS(S0_9[nG]);
144cdf0e10cSrcweir 			else if (nG<  60) F10_59[nG-10]=ReadF();
145cdf0e10cSrcweir 			else if (nG<  80) I60_79[nG-60]=ReadI();
146cdf0e10cSrcweir 			else if (nG<  90) ReadS( aTmp );
147cdf0e10cSrcweir 			else if (nG<  99) I90_99[nG-90]=ReadI();
148cdf0e10cSrcweir 			else if (nG==100) ReadS(S100);
149cdf0e10cSrcweir 			else if (nG==102) ReadS(S102);
150cdf0e10cSrcweir 			else if (nG==105) ReadS( aTmp );
151cdf0e10cSrcweir 			else if (nG< 140) ReadS( aTmp );
152cdf0e10cSrcweir 			else if (nG< 148) F140_147[nG-140]=ReadF();
153cdf0e10cSrcweir 			else if (nG< 170) ReadS( aTmp );
154cdf0e10cSrcweir 			else if (nG< 176) I170_175[nG-175]=ReadI();
155cdf0e10cSrcweir 			else if (nG< 180) ReadI();
156cdf0e10cSrcweir 			else if (nG< 210) ReadS( aTmp );
157cdf0e10cSrcweir 			else if (nG< 240) F210_239[nG-210]=ReadF();
158cdf0e10cSrcweir 			else if (nG<=369) ReadS( aTmp );
159cdf0e10cSrcweir 			else if (nG< 999) ReadS( aTmp );
160cdf0e10cSrcweir 			else if (nG<1010) ReadS(S999_1009[nG-999]);
161cdf0e10cSrcweir 			else if (nG<1060) F1010_1059[nG-1010]=ReadF();
162cdf0e10cSrcweir 			else if (nG<1080) I1060_1079[nG-1060]=ReadI();
163cdf0e10cSrcweir 			else bStatus = sal_False;
164cdf0e10cSrcweir 		}
165cdf0e10cSrcweir 	}
166cdf0e10cSrcweir 	if ( bStatus )
167cdf0e10cSrcweir 		nLastG = nG;
168cdf0e10cSrcweir 	else
169cdf0e10cSrcweir 	{
170cdf0e10cSrcweir 		nG = 0;
171cdf0e10cSrcweir 		SetS( 0, "EOF" );
172cdf0e10cSrcweir 		if ( nGCount != 0xffffffff )
173cdf0e10cSrcweir 		{
174cdf0e10cSrcweir 			// InfoBox(NULL,String("Fehler ab Gruppe Nr ")+String(nGCount)).Execute();
175cdf0e10cSrcweir 			nGCount=0xffffffff;
176cdf0e10cSrcweir 		}
177cdf0e10cSrcweir 	}
178cdf0e10cSrcweir 	nLastG = nG;
179cdf0e10cSrcweir 	return nG;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 
GetI(sal_uInt16 nG)183cdf0e10cSrcweir long DXFGroupReader::GetI(sal_uInt16 nG)
184cdf0e10cSrcweir {
185cdf0e10cSrcweir 	sal_Int32 nRetValue = 0;
186cdf0e10cSrcweir 	if ( ( nG >= 60 ) && ( nG <= 79 ) )
187cdf0e10cSrcweir 		nRetValue = I60_79[ nG - 60 ];
188cdf0e10cSrcweir 	else if ( ( nG >= 90 ) && ( nG <= 99 ) )
189cdf0e10cSrcweir 		nRetValue = I90_99[ nG - 90 ];
190cdf0e10cSrcweir 	else if ( ( nG >= 170 ) && ( nG <= 175 ) )
191cdf0e10cSrcweir 		nRetValue = I170_175[ nG - 170 ];
192cdf0e10cSrcweir 	else if ( ( nG >= 1060 ) && ( nG <= 1079 ) )
193cdf0e10cSrcweir 		nRetValue = I1060_1079[ nG - 1060 ];
194cdf0e10cSrcweir 	return nRetValue;
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
GetF(sal_uInt16 nG)197cdf0e10cSrcweir double DXFGroupReader::GetF(sal_uInt16 nG)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir 	nG-=10;
200cdf0e10cSrcweir 	if (nG<50) return F10_59[nG];
201cdf0e10cSrcweir 	else {
202cdf0e10cSrcweir 		nG-=130;
203cdf0e10cSrcweir 		if (nG<8) return F140_147[nG];
204cdf0e10cSrcweir 		else {
205cdf0e10cSrcweir 			nG-=70;
206cdf0e10cSrcweir 			if (nG<30) return F210_239[nG];
207cdf0e10cSrcweir 			else {
208cdf0e10cSrcweir 				nG-=800;
209cdf0e10cSrcweir 				if (nG<50) return F1010_1059[nG];
210cdf0e10cSrcweir 				else return 0;
211cdf0e10cSrcweir 			}
212cdf0e10cSrcweir 		}
213cdf0e10cSrcweir 	}
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
GetS(sal_uInt16 nG)216cdf0e10cSrcweir const char * DXFGroupReader::GetS(sal_uInt16 nG)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir 	if (nG<10) return S0_9[nG];
219cdf0e10cSrcweir 	else if ( nG == 100 )
220cdf0e10cSrcweir         return S100;
221cdf0e10cSrcweir     else if ( nG == 102 )
222cdf0e10cSrcweir         return S102;
223cdf0e10cSrcweir     else
224cdf0e10cSrcweir     {
225cdf0e10cSrcweir 		nG-=999;
226cdf0e10cSrcweir 		if (nG<11) return S999_1009[nG];
227cdf0e10cSrcweir 		else return NULL;
228cdf0e10cSrcweir 	}
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
SetF(sal_uInt16 nG,double fF)231cdf0e10cSrcweir void DXFGroupReader::SetF(sal_uInt16 nG, double fF)
232cdf0e10cSrcweir {
233cdf0e10cSrcweir 	nG-=10;
234cdf0e10cSrcweir 	if (nG<50) F10_59[nG]=fF;
235cdf0e10cSrcweir 	else {
236cdf0e10cSrcweir 		nG-=130;
237cdf0e10cSrcweir 		if (nG<8) F140_147[nG]=fF;
238cdf0e10cSrcweir 		else {
239cdf0e10cSrcweir 			nG-=70;
240cdf0e10cSrcweir 			if (nG<30) F210_239[nG]=fF;
241cdf0e10cSrcweir 			else {
242cdf0e10cSrcweir 				nG-=800;
243cdf0e10cSrcweir 				if (nG<50) F1010_1059[nG]=fF;
244cdf0e10cSrcweir 			}
245cdf0e10cSrcweir 		}
246cdf0e10cSrcweir 	}
247cdf0e10cSrcweir }
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 
SetS(sal_uInt16 nG,const char * sS)250cdf0e10cSrcweir void DXFGroupReader::SetS(sal_uInt16 nG, const char * sS)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir     char* pPtr = NULL;
253cdf0e10cSrcweir 	if ( nG < 10 )
254cdf0e10cSrcweir         pPtr = S0_9[ nG ];
255cdf0e10cSrcweir 	else if ( nG == 100 )
256cdf0e10cSrcweir         pPtr = S100;
257cdf0e10cSrcweir     else if ( nG == 102 )
258cdf0e10cSrcweir         pPtr = S102;
259cdf0e10cSrcweir     else
260cdf0e10cSrcweir     {
261cdf0e10cSrcweir 		nG -= 999;
262cdf0e10cSrcweir 		if ( nG < 11 )
263cdf0e10cSrcweir             pPtr = S999_1009[ nG ];
264cdf0e10cSrcweir 	}
265cdf0e10cSrcweir     if ( pPtr )
266cdf0e10cSrcweir         strncpy( pPtr, sS, DXF_MAX_STRING_LEN + 1 );
267cdf0e10cSrcweir }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 
ReadLine(char * ptgt)270cdf0e10cSrcweir void DXFGroupReader::ReadLine(char * ptgt)
271cdf0e10cSrcweir {
272cdf0e10cSrcweir 	ByteString	aStr;
273cdf0e10cSrcweir 	sal_uLong		nLen;
274cdf0e10cSrcweir 
275cdf0e10cSrcweir 	DXFReadLine( rIS, aStr );
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	nLen = aStr.Len();
278cdf0e10cSrcweir 	if ( nLen > DXF_MAX_STRING_LEN )
279cdf0e10cSrcweir 		nLen = DXF_MAX_STRING_LEN;
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 	memcpy( ptgt, aStr.GetBuffer(), nLen );
282cdf0e10cSrcweir 	ptgt[ nLen ] = 0x00;
283cdf0e10cSrcweir /*
284cdf0e10cSrcweir 	if ( pCallback )
285cdf0e10cSrcweir 	{
286cdf0e10cSrcweir 		const sal_uLong nPercent= nMinPercent + (nMaxPercent-nMinPercent)*rIS.Tell() / nFileSize;
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 		if ( nPercent >= nLastPercent + 4 )
289cdf0e10cSrcweir 		{
290cdf0e10cSrcweir 			nLastPercent=nPercent;
291cdf0e10cSrcweir 			if (((*pCallback)(pCallerData,(sal_uInt16)nPercent))==sal_True)
292cdf0e10cSrcweir 				bStatus=sal_False;
293cdf0e10cSrcweir 		}
294cdf0e10cSrcweir 	}
295cdf0e10cSrcweir */
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 
ReadI()299cdf0e10cSrcweir long DXFGroupReader::ReadI()
300cdf0e10cSrcweir {
301cdf0e10cSrcweir 	char sl[DXF_MAX_STRING_LEN+1],*p;
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	ReadLine(sl);
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 	p=sl;
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 	while(*p==0x20) p++;
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 	if ((*p<'0' || *p>'9') && *p!='-') {
310cdf0e10cSrcweir 		bStatus=sal_False;
311cdf0e10cSrcweir 		return 0;
312cdf0e10cSrcweir 	}
313cdf0e10cSrcweir 
314*ffb0abf2SDamjan Jovanovic 	char *start = p;
315cdf0e10cSrcweir 	if (*p=='-') {
316cdf0e10cSrcweir 		p++;
317cdf0e10cSrcweir 	}
318*ffb0abf2SDamjan Jovanovic 	while (*p>='0' && *p<='9') {
319cdf0e10cSrcweir 		p++;
320*ffb0abf2SDamjan Jovanovic 	}
321*ffb0abf2SDamjan Jovanovic 
322*ffb0abf2SDamjan Jovanovic 	char prev = *p;
323*ffb0abf2SDamjan Jovanovic 	*p = '\0';
324*ffb0abf2SDamjan Jovanovic 	char *end;
325*ffb0abf2SDamjan Jovanovic 	long res = strtol(start, &end, 10);
326*ffb0abf2SDamjan Jovanovic 	*p = prev;
327*ffb0abf2SDamjan Jovanovic 	if (end != p) {
328*ffb0abf2SDamjan Jovanovic 		bStatus=sal_False;
329*ffb0abf2SDamjan Jovanovic 		return 0;
330*ffb0abf2SDamjan Jovanovic 	}
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	while (*p==0x20) p++;
333cdf0e10cSrcweir 	if (*p!=0) {
334cdf0e10cSrcweir 		bStatus=sal_False;
335cdf0e10cSrcweir 		return 0;
336cdf0e10cSrcweir 	}
337cdf0e10cSrcweir 
338*ffb0abf2SDamjan Jovanovic 	return res;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir 
ReadF()342cdf0e10cSrcweir double DXFGroupReader::ReadF()
343cdf0e10cSrcweir {
344cdf0e10cSrcweir 	char sl[DXF_MAX_STRING_LEN+1],*p;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 	ReadLine(sl);
347cdf0e10cSrcweir 	p=sl;
348cdf0e10cSrcweir 	while(*p==0x20) p++;
349cdf0e10cSrcweir 	if ((*p<'0' || *p>'9') && *p!='.' && *p!='-') {
350cdf0e10cSrcweir 		bStatus=sal_False;
351cdf0e10cSrcweir 		return 0.0;
352cdf0e10cSrcweir 	}
353cdf0e10cSrcweir 	return atof(p);
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 
ReadS(char * ptgt)357cdf0e10cSrcweir void DXFGroupReader::ReadS(char * ptgt)
358cdf0e10cSrcweir {
359cdf0e10cSrcweir 	ReadLine(ptgt);
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 
363