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