Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include <string.h>
31 : : #include <stdlib.h>
32 : : #include <rtl/strbuf.hxx>
33 : : #include <tools/stream.hxx>
34 : : #include "dxfgrprd.hxx"
35 : :
36 : : // ----------------------------------------------------------------------------
37 : :
38 : : // we use an own ReadLine function, because Stream::ReadLine stops if
39 : : // a 0-sign occurs; this functions converts 0-signs to blanks and reads
40 : : // a complete line until a cr/lf is found
41 : :
42 : 0 : rtl::OString DXFReadLine(SvStream& rIStm)
43 : : {
44 : : char buf[256 + 1];
45 : 0 : sal_Bool bEnd = sal_False;
46 : 0 : sal_uLong nOldFilePos = rIStm.Tell();
47 : 0 : char c = 0;
48 : :
49 : 0 : rtl::OStringBuffer aBuf;
50 : :
51 : 0 : while( !bEnd && !rIStm.GetError() ) // !!! nicht auf EOF testen,
52 : : // !!! weil wir blockweise
53 : : // !!! lesen
54 : : {
55 : 0 : sal_uInt16 nLen = (sal_uInt16)rIStm.Read( buf, sizeof(buf)-1 );
56 : 0 : if( !nLen )
57 : : {
58 : 0 : if( aBuf.getLength() == 0 )
59 : 0 : return rtl::OString();
60 : : else
61 : 0 : break;
62 : : }
63 : :
64 : 0 : for( sal_uInt16 n = 0; n < nLen ; n++ )
65 : : {
66 : 0 : c = buf[n];
67 : 0 : if( c != '\n' && c != '\r' )
68 : : {
69 : 0 : if( !c )
70 : 0 : c = ' ';
71 : 0 : aBuf.append(c);
72 : : }
73 : : else
74 : : {
75 : 0 : bEnd = sal_True;
76 : 0 : break;
77 : : }
78 : : }
79 : : }
80 : :
81 : 0 : if( !bEnd && !rIStm.GetError() && aBuf.getLength() )
82 : 0 : bEnd = sal_True;
83 : :
84 : 0 : nOldFilePos += aBuf.getLength();
85 : 0 : if( rIStm.Tell() > nOldFilePos )
86 : 0 : nOldFilePos++;
87 : 0 : rIStm.Seek( nOldFilePos ); // seeken wg. obigem BlockRead!
88 : :
89 : 0 : if( bEnd && (c=='\r' || c=='\n')) // Sonderbehandlung DOS-Dateien
90 : : {
91 : 0 : char cTemp(0);
92 : 0 : rIStm.Read(&cTemp, 1);
93 : 0 : if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
94 : 0 : rIStm.Seek( nOldFilePos );
95 : : }
96 : :
97 : 0 : return aBuf.makeStringAndClear();
98 : : }
99 : :
100 : : // ------------------
101 : :
102 : 0 : DXFGroupReader::DXFGroupReader(SvStream & rIStream, sal_uInt16 nminpercent, sal_uInt16 nmaxpercent ) :
103 : 0 : rIS(rIStream)
104 : : {
105 : : sal_uInt16 i;
106 : :
107 : 0 : nIBuffPos=0;
108 : 0 : nIBuffSize=0;
109 : 0 : bStatus=sal_True;
110 : 0 : nLastG=0;
111 : 0 : nGCount=0;
112 : :
113 : 0 : nMinPercent=(sal_uLong)nminpercent;
114 : 0 : nMaxPercent=(sal_uLong)nmaxpercent;
115 : 0 : nLastPercent=nMinPercent;
116 : :
117 : 0 : rIS.Seek(STREAM_SEEK_TO_END);
118 : 0 : nFileSize=rIS.Tell();
119 : 0 : rIS.Seek(0);
120 : :
121 : 0 : for (i=0; i<10; i++) S0_9[i][0]=0;
122 : 0 : S100[ 0 ] = S102[ 0 ] = 0;
123 : 0 : for (i=0; i<50; i++) F10_59[i]=0.0;
124 : 0 : for (i=0; i<20; i++) I60_79[i]=0;
125 : 0 : for (i=0; i<10; i++) I90_99[i]=0;
126 : 0 : for (i=0; i< 8; i++) F140_147[i]=0.0;
127 : 0 : for (i=0; i< 6; i++) I170_175[i]=0;
128 : 0 : for (i=0; i<30; i++) F210_239[i]=0.0;
129 : 0 : for (i=0; i<11; i++) S999_1009[i][0]=0;
130 : 0 : for (i=0; i<50; i++) F1010_1059[i]=0.0;
131 : 0 : for (i=0; i<20; i++) I1060_1079[i]=0;
132 : :
133 : 0 : }
134 : :
135 : :
136 : 0 : sal_uInt16 DXFGroupReader::Read()
137 : : {
138 : 0 : sal_uInt16 nG = 0;
139 : 0 : if ( bStatus )
140 : : {
141 : 0 : nGCount++;
142 : 0 : nG = (sal_uInt16)ReadI();
143 : 0 : if ( bStatus )
144 : : {
145 : : char aTmp[ DXF_MAX_STRING_LEN + 1 ];
146 : :
147 : 0 : if (nG< 10) ReadS(S0_9[nG]);
148 : 0 : else if (nG< 60) F10_59[nG-10]=ReadF();
149 : 0 : else if (nG< 80) I60_79[nG-60]=ReadI();
150 : 0 : else if (nG< 90) ReadS( aTmp );
151 : 0 : else if (nG< 99) I90_99[nG-90]=ReadI();
152 : 0 : else if (nG==100) ReadS(S100);
153 : 0 : else if (nG==102) ReadS(S102);
154 : 0 : else if (nG==105) ReadS( aTmp );
155 : 0 : else if (nG< 140) ReadS( aTmp );
156 : 0 : else if (nG< 148) F140_147[nG-140]=ReadF();
157 : 0 : else if (nG< 170) ReadS( aTmp );
158 : 0 : else if (nG< 176) I170_175[nG-175]=ReadI();
159 : 0 : else if (nG< 180) ReadI();
160 : 0 : else if (nG< 210) ReadS( aTmp );
161 : 0 : else if (nG< 240) F210_239[nG-210]=ReadF();
162 : 0 : else if (nG<=369) ReadS( aTmp );
163 : 0 : else if (nG< 999) ReadS( aTmp );
164 : 0 : else if (nG<1010) ReadS(S999_1009[nG-999]);
165 : 0 : else if (nG<1060) F1010_1059[nG-1010]=ReadF();
166 : 0 : else if (nG<1080) I1060_1079[nG-1060]=ReadI();
167 : 0 : else bStatus = sal_False;
168 : : }
169 : : }
170 : 0 : if ( bStatus )
171 : 0 : nLastG = nG;
172 : : else
173 : : {
174 : 0 : nG = 0;
175 : 0 : SetS( 0, "EOF" );
176 : 0 : if ( nGCount != 0xffffffff )
177 : : {
178 : : // InfoBox(NULL,String("Fehler ab Gruppe Nr ")+String(nGCount)).Execute();
179 : 0 : nGCount=0xffffffff;
180 : : }
181 : : }
182 : 0 : nLastG = nG;
183 : 0 : return nG;
184 : : }
185 : :
186 : :
187 : 0 : long DXFGroupReader::GetI(sal_uInt16 nG) const
188 : : {
189 : 0 : sal_Int32 nRetValue = 0;
190 : 0 : if ( ( nG >= 60 ) && ( nG <= 79 ) )
191 : 0 : nRetValue = I60_79[ nG - 60 ];
192 : 0 : else if ( ( nG >= 90 ) && ( nG <= 99 ) )
193 : 0 : nRetValue = I90_99[ nG - 90 ];
194 : 0 : else if ( ( nG >= 170 ) && ( nG <= 175 ) )
195 : 0 : nRetValue = I170_175[ nG - 170 ];
196 : 0 : else if ( ( nG >= 1060 ) && ( nG <= 1079 ) )
197 : 0 : nRetValue = I1060_1079[ nG - 1060 ];
198 : 0 : return nRetValue;
199 : : }
200 : :
201 : 0 : double DXFGroupReader::GetF(sal_uInt16 nG) const
202 : : {
203 : 0 : nG-=10;
204 : 0 : if (nG<50) return F10_59[nG];
205 : : else {
206 : 0 : nG-=130;
207 : 0 : if (nG<8) return F140_147[nG];
208 : : else {
209 : 0 : nG-=70;
210 : 0 : if (nG<30) return F210_239[nG];
211 : : else {
212 : 0 : nG-=800;
213 : 0 : if (nG<50) return F1010_1059[nG];
214 : 0 : else return 0;
215 : : }
216 : : }
217 : : }
218 : : }
219 : :
220 : 0 : const char * DXFGroupReader::GetS(sal_uInt16 nG) const
221 : : {
222 : 0 : if (nG<10) return S0_9[nG];
223 : 0 : else if ( nG == 100 )
224 : 0 : return S100;
225 : 0 : else if ( nG == 102 )
226 : 0 : return S102;
227 : : else
228 : : {
229 : 0 : nG-=999;
230 : 0 : if (nG<11) return S999_1009[nG];
231 : 0 : else return NULL;
232 : : }
233 : : }
234 : :
235 : 0 : void DXFGroupReader::SetF(sal_uInt16 nG, double fF)
236 : : {
237 : 0 : nG-=10;
238 : 0 : if (nG<50) F10_59[nG]=fF;
239 : : else {
240 : 0 : nG-=130;
241 : 0 : if (nG<8) F140_147[nG]=fF;
242 : : else {
243 : 0 : nG-=70;
244 : 0 : if (nG<30) F210_239[nG]=fF;
245 : : else {
246 : 0 : nG-=800;
247 : 0 : if (nG<50) F1010_1059[nG]=fF;
248 : : }
249 : : }
250 : : }
251 : 0 : }
252 : :
253 : :
254 : 0 : void DXFGroupReader::SetS(sal_uInt16 nG, const char * sS)
255 : : {
256 : 0 : char* pPtr = NULL;
257 : 0 : if ( nG < 10 )
258 : 0 : pPtr = S0_9[ nG ];
259 : 0 : else if ( nG == 100 )
260 : 0 : pPtr = S100;
261 : 0 : else if ( nG == 102 )
262 : 0 : pPtr = S102;
263 : : else
264 : : {
265 : 0 : nG -= 999;
266 : 0 : if ( nG < 11 )
267 : 0 : pPtr = S999_1009[ nG ];
268 : : }
269 : 0 : if ( pPtr )
270 : 0 : strncpy( pPtr, sS, DXF_MAX_STRING_LEN + 1 );
271 : 0 : }
272 : :
273 : :
274 : 0 : void DXFGroupReader::ReadLine(char * ptgt)
275 : : {
276 : 0 : rtl::OString aStr = DXFReadLine(rIS);
277 : :
278 : 0 : size_t nLen = aStr.getLength();
279 : 0 : if ( nLen > DXF_MAX_STRING_LEN )
280 : 0 : nLen = DXF_MAX_STRING_LEN;
281 : :
282 : 0 : memcpy( ptgt, aStr.getStr(), nLen );
283 : 0 : ptgt[ nLen ] = 0x00;
284 : 0 : }
285 : :
286 : :
287 : 0 : long DXFGroupReader::ReadI()
288 : : {
289 : : char sl[DXF_MAX_STRING_LEN+1],*p;
290 : : long res,nv;
291 : :
292 : 0 : ReadLine(sl);
293 : :
294 : 0 : p=sl;
295 : :
296 : 0 : while(*p==0x20) p++;
297 : :
298 : 0 : if ((*p<'0' || *p>'9') && *p!='-') {
299 : 0 : bStatus=sal_False;
300 : 0 : return 0;
301 : : }
302 : :
303 : 0 : if (*p=='-') {
304 : 0 : nv=-1;
305 : 0 : p++;
306 : : }
307 : 0 : else nv=1;
308 : :
309 : 0 : res=0;
310 : 0 : do {
311 : 0 : res=res*10+(long)(*p-'0');
312 : 0 : p++;
313 : : } while (*p>='0' && *p<='9');
314 : :
315 : 0 : while (*p==0x20) p++;
316 : 0 : if (*p!=0) {
317 : 0 : bStatus=sal_False;
318 : 0 : return 0;
319 : : }
320 : :
321 : 0 : return res*nv;
322 : : }
323 : :
324 : :
325 : 0 : double DXFGroupReader::ReadF()
326 : : {
327 : : char sl[DXF_MAX_STRING_LEN+1],*p;
328 : :
329 : 0 : ReadLine(sl);
330 : 0 : p=sl;
331 : 0 : while(*p==0x20) p++;
332 : 0 : if ((*p<'0' || *p>'9') && *p!='.' && *p!='-') {
333 : 0 : bStatus=sal_False;
334 : 0 : return 0.0;
335 : : }
336 : 0 : return atof(p);
337 : : }
338 : :
339 : :
340 : 0 : void DXFGroupReader::ReadS(char * ptgt)
341 : : {
342 : 0 : ReadLine(ptgt);
343 : 0 : }
344 : :
345 : :
346 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|