0024186: Eliminate remaining compiler warnings in MSVC++ 2010 64 bit with warning...
[occt.git] / src / Interface / Interface_FileReaderData.cxx
CommitLineData
b311480e 1// Copyright (c) 1999-2012 OPEN CASCADE SAS
2//
3// The content of this file is subject to the Open CASCADE Technology Public
4// License Version 6.5 (the "License"). You may not use the content of this file
5// except in compliance with the License. Please obtain a copy of the License
6// at http://www.opencascade.org and read it completely before using this file.
7//
8// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10//
11// The Original Code and all software distributed under the License is
12// distributed on an "AS IS" basis, without warranty of any kind, and the
13// Initial Developer hereby disclaims all such warranties, including without
14// limitation, any warranties of merchantability, fitness for a particular
15// purpose or non-infringement. Please see the License for the specific terms
16// and conditions governing the rights and limitations under the License.
17
7fd59977 18//====================================================================
19//#10 smh 22.12.99 Protection (case of unexisting directory entry in file)
20//sln 21.01.2002 OCC133: Exception handling was added in method Interface_FileReaderData::BoundEntity
21//====================================================================
22#include <Standard_ErrorHandler.hxx>
23#include <Standard_Failure.hxx>
24#include <Interface_FileReaderData.ixx>
25
26
27// Stoque les Donnees issues d un Fichier (Conservees sous forme Litterale)
28// Chaque norme peut s en servir comme base (listes de parametres litteraux,
29// entites associees) et y ajoute ses donnees propres.
30
31// Travaille sous le controle de FileReaderTool
32
33// Optimisation : Champs pas possibles, car Param est const. Dommage
34// Donc, on suppose qu on lit un fichier a la fois (hypothese raisonnable)
35// On note en champ un numero de fichier, par rapport auquel on optimise
36static Standard_Integer thefic = 0;
37static Standard_Integer thenm0 = -1;
38static Standard_Integer thenp0 = -1;
39
40
41Interface_FileReaderData::Interface_FileReaderData (const Standard_Integer nbr,
42 const Standard_Integer npar)
43 : therrload (0), thenumpar (0,nbr), theents (0,nbr)
44{
45 theparams = new Interface_ParamSet (npar);
46 thenumpar.Init(0);
47 thenm0 = -1;
48 thenum0 = ++thefic;
49}
50
51 Standard_Integer Interface_FileReaderData::NbRecords () const
52 { return thenumpar.Upper(); }
53
54 Standard_Integer Interface_FileReaderData::NbEntities () const
55{
56 Standard_Integer nb = 0; Standard_Integer num = 0;
57 while ( (num = FindNextRecord(num)) > 0) nb ++;
58 return nb;
59}
60
61
62// .... Gestion des Parametres attaches aux Records ....
63
64 void Interface_FileReaderData::InitParams (const Standard_Integer num)
65{
66 thenumpar.SetValue (num,theparams->NbParams());
7fd59977 67}
68
69 void Interface_FileReaderData::AddParam
35e08fe8 70 (const Standard_Integer /*num*/,
7fd59977 71 const Standard_CString aval, const Interface_ParamType atype,
72 const Standard_Integer nument)
73{
7fd59977 74 theparams->Append(aval,-1,atype,nument);
7fd59977 75}
76
77 void Interface_FileReaderData::AddParam
35e08fe8 78 (const Standard_Integer /*num*/,
7fd59977 79 const TCollection_AsciiString& aval, const Interface_ParamType atype,
80 const Standard_Integer nument)
81{
7fd59977 82 theparams->Append(aval.ToCString(),aval.Length(),atype,nument);
7fd59977 83}
84
85 void Interface_FileReaderData::AddParam
35e08fe8 86 (const Standard_Integer /*num*/,
7fd59977 87 const Interface_FileParameter& FP)
88{
89 theparams->Append(FP);
7fd59977 90}
91
92
93 void Interface_FileReaderData::SetParam
94 (const Standard_Integer num, const Standard_Integer nump,
95 const Interface_FileParameter& FP)
96{
7fd59977 97 theparams->SetParam(thenumpar(num-1)+nump,FP);
98}
99
100 Standard_Integer Interface_FileReaderData::NbParams
101 (const Standard_Integer num) const
102{
103 if (num > 1) return (thenumpar(num) - thenumpar(num-1));
7dc9e047 104 else if(num ==1) return thenumpar(num);
7fd59977 105 else return theparams->NbParams();
106}
107
108 Handle(Interface_ParamList) Interface_FileReaderData::Params
109 (const Standard_Integer num) const
110{
111 if (num == 0) return theparams->Params(0,0); // complet
112 else if(num ==1) return theparams->Params(0,thenumpar(1));
113 else return theparams->Params ( thenumpar(num-1)+1, (thenumpar(num) - thenumpar(num-1)) );
114}
115
116 const Interface_FileParameter& Interface_FileReaderData::Param
117 (const Standard_Integer num, const Standard_Integer nump) const
118{
119 if (thefic != thenum0) return theparams->Param(thenumpar(num-1)+nump);
120 if (thenm0 != num) { thenp0 = thenumpar(num-1); thenm0 = num; }
121 return theparams->Param (thenp0+nump);
122}
123
124 Interface_FileParameter& Interface_FileReaderData::ChangeParam
125 (const Standard_Integer num, const Standard_Integer nump)
126{
127 if (thefic != thenum0) return theparams->ChangeParam(thenumpar(num-1)+nump);
128 if (thenm0 != num) { thenp0 = thenumpar(num-1); thenm0 = num; }
129 return theparams->ChangeParam (thenp0+nump);
130}
131
132 Interface_ParamType Interface_FileReaderData::ParamType
133 (const Standard_Integer num, const Standard_Integer nump) const
134 { return Param(num,nump).ParamType(); }
135
136 Standard_CString Interface_FileReaderData::ParamCValue
137 (const Standard_Integer num, const Standard_Integer nump) const
138 { return Param(num,nump).CValue(); }
139
140
141 Standard_Boolean Interface_FileReaderData::IsParamDefined
142 (const Standard_Integer num, const Standard_Integer nump) const
143 { return (Param(num,nump).ParamType() != Interface_ParamVoid); }
144
145 Standard_Integer Interface_FileReaderData::ParamNumber
146 (const Standard_Integer num, const Standard_Integer nump) const
147 { return Param(num,nump).EntityNumber(); }
148
149 const Handle(Standard_Transient)& Interface_FileReaderData::ParamEntity
150 (const Standard_Integer num, const Standard_Integer nump) const
151 { return BoundEntity (Param(num,nump).EntityNumber()); }
152
153 Interface_FileParameter& Interface_FileReaderData::ChangeParameter
154 (const Standard_Integer numpar)
155 { return theparams->ChangeParam (numpar); }
156
157 void Interface_FileReaderData::ParamPosition
158 (const Standard_Integer numpar,
159 Standard_Integer& num, Standard_Integer& nump) const
160{
161 Standard_Integer nbe = thenumpar.Upper();
162 if (numpar <= 0) { num = nump = 0; return; }
163 for (Standard_Integer i = 1; i <= nbe; i ++) {
164 if (thenumpar(i) > numpar)
165 { num = i; nump = numpar - thenumpar(i) +1; return; }
166 }
167 num = nbe; nump = numpar - thenumpar(nbe) +1;
168}
169
170 Standard_Integer Interface_FileReaderData::ParamFirstRank
171 (const Standard_Integer num) const
172 { return thenumpar(num); }
173
174 void Interface_FileReaderData::SetErrorLoad (const Standard_Boolean val)
175 { therrload = (val ? 1 : -1); }
176
177 Standard_Boolean Interface_FileReaderData::IsErrorLoad () const
178 { return (therrload != 0); }
179
180 Standard_Boolean Interface_FileReaderData::ResetErrorLoad ()
181 { Standard_Boolean res = (therrload > 0); therrload = 0; return res; }
182
183// .... Gestion des Entites Associees aux Donnees du Fichier ....
184
185
186const Handle(Standard_Transient)& Interface_FileReaderData::BoundEntity
187 (const Standard_Integer num) const
188 // { return theents(num); }
189{
190 if (num >= theents.Lower() && num <= theents.Upper()) {
191 return theents(num);
192 }
193 else {
194 static Handle(Standard_Transient) dummy;
195 return dummy;
196 }
197}
198/* //static Handle(Standard_Transient) dummy;
199 {
200 //smh#10 Protection. If iges entity does not exist, return null pointer.
201 try {
202 OCC_CATCH_SIGNALS
203 Handle(Standard_Transient) temp = theents.Value(num);
204 }
205 ////sln 21.01.2002 OCC133: Exception handling
206 // catch (Standard_OutOfRange) {
207 // cout<<" Catch of sln"<<endl;
208
209 // return dummy;
210 // }
211 catch (Standard_Failure) {
212
213 // some work-around, the best would be to modify CDL to
214 // return "Handle(Standard_Transient)" not "const Handle(Standard_Transient)&"
215 static Handle(Standard_Transient) dummy;
216 // cout<<" Catch of smh"<<endl;
217 return dummy;
218 }
219 }
220 //cout<<" Normal"<<endl;
221 if (theents.Value(num).IsImmutable()) cout << "IMMUTABLE:"<<num<<endl;
222 return theents(num);
223}
224*/
225
226void Interface_FileReaderData::BindEntity
227 (const Standard_Integer num, const Handle(Standard_Transient)& ent)
228// { theents.SetValue(num,ent); }
229{
230// #ifdef DEB
231// if (ent.IsImmutable())
232// cout << "Bind IMMUTABLE:"<<num<<endl;
233// #endif
234 theents.SetValue(num,ent);
235}
236
237void Interface_FileReaderData::Destroy ()
238{
239}
240
241
242#define MAXCHIF 80
243
244static const Standard_Real vtab[] =
245{ 1., 2., 3., 4., 5., 6., 7., 8., 9.,
246 10., 20., 30., 40., 50., 60., 70., 80., 90.,
247 100., 200., 300., 400., 500., 600., 700., 800., 900.,
248 1000., 2000., 3000., 4000., 5000., 6000., 7000., 8000., 9000.,
249 10000., 20000., 30000., 40000., 50000., 60000., 70000., 80000., 90000.,
250 1.E+05, 2.E+05, 3.E+05, 4.E+05, 5.E+05, 6.E+05, 7.E+05, 8.E+05, 9.E+05,
251 1.E+06, 2.E+06, 3.E+06, 4.E+06, 5.E+06, 6.E+06, 7.E+06, 8.E+06, 9.E+06,
252 1.E+07, 2.E+07, 3.E+07, 4.E+07, 5.E+07, 6.E+07, 7.E+07, 8.E+07, 9.E+07,
253 1.E+08, 2.E+08, 3.E+08, 4.E+08, 5.E+08, 6.E+08, 7.E+08, 8.E+08, 9.E+08,
254 1.E+09, 2.E+09, 3.E+09, 4.E+09, 5.E+09, 6.E+09, 7.E+09, 8.E+09, 9.E+09,
255 1.E+10, 2.E+10, 3.E+10, 4.E+10, 5.E+10, 6.E+10, 7.E+10, 8.E+10, 9.E+10,
256 1.E+11, 2.E+11, 3.E+11, 4.E+11, 5.E+11, 6.E+11, 7.E+11, 8.E+11, 9.E+11,
257 1.E+12, 2.E+12, 3.E+12, 4.E+12, 5.E+12, 6.E+12, 7.E+12, 8.E+12, 9.E+12,
258 1.E+13, 2.E+13, 3.E+13, 4.E+13, 5.E+13, 6.E+13, 7.E+13, 8.E+13, 9.E+13,
259 1.E+14, 2.E+14, 3.E+14, 4.E+14, 5.E+14, 6.E+14, 7.E+14, 8.E+14, 9.E+14,
260 1.E+15, 2.E+15, 3.E+15, 4.E+15, 5.E+15, 6.E+15, 7.E+15, 8.E+15, 9.E+15,
261 1.E+16, 2.E+16, 3.E+16, 4.E+16, 5.E+16, 6.E+16, 7.E+16, 8.E+16, 9.E+16,
262 1.E+17, 2.E+17, 3.E+17, 4.E+17, 5.E+17, 6.E+17, 7.E+17, 8.E+17, 9.E+17,
263 1.E+18, 2.E+18, 3.E+18, 4.E+18, 5.E+18, 6.E+18, 7.E+18, 8.E+18, 9.E+18,
264 1.E+19, 2.E+19, 3.E+19, 4.E+19, 5.E+19, 6.E+19, 7.E+19, 8.E+19, 9.E+19,
265 1.E+20, 2.E+20, 3.E+20, 4.E+20, 5.E+20, 6.E+20, 7.E+20, 8.E+20, 9.E+20,
266 1.E+21, 2.E+21, 3.E+21, 4.E+21, 5.E+21, 6.E+21, 7.E+21, 8.E+21, 9.E+21,
267 1.E+22, 2.E+22, 3.E+22, 4.E+22, 5.E+22, 6.E+22, 7.E+22, 8.E+22, 9.E+22,
268 1.E+23, 2.E+23, 3.E+23, 4.E+23, 5.E+23, 6.E+23, 7.E+23, 8.E+23, 9.E+23,
269 1.E+24, 2.E+24, 3.E+24, 4.E+24, 5.E+24, 6.E+24, 7.E+24, 8.E+24, 9.E+24,
270 1.E+25, 2.E+25, 3.E+25, 4.E+25, 5.E+25, 6.E+25, 7.E+25, 8.E+25, 9.E+25,
271 1.E+26, 2.E+26, 3.E+26, 4.E+26, 5.E+26, 6.E+26, 7.E+26, 8.E+26, 9.E+26,
272 1.E+27, 2.E+27, 3.E+27, 4.E+27, 5.E+27, 6.E+27, 7.E+27, 8.E+27, 9.E+27,
273 1.E+28, 2.E+28, 3.E+28, 4.E+28, 5.E+28, 6.E+28, 7.E+28, 8.E+28, 9.E+28,
274 1.E+29, 2.E+29, 3.E+29, 4.E+29, 5.E+29, 6.E+29, 7.E+29, 8.E+29, 9.E+29,
275 1.E+30, 2.E+30, 3.E+30, 4.E+30, 5.E+30, 6.E+30, 7.E+30, 8.E+30, 9.E+30,
276 1.E+31, 2.E+31, 3.E+31, 4.E+31, 5.E+31, 6.E+31, 7.E+31, 8.E+31, 9.E+31,
277 1.E+32, 2.E+32, 3.E+32, 4.E+32, 5.E+32, 6.E+32, 7.E+32, 8.E+32, 9.E+32,
278 1.E+33, 2.E+33, 3.E+33, 4.E+33, 5.E+33, 6.E+33, 7.E+33, 8.E+33, 9.E+33,
279 1.E+34, 2.E+34, 3.E+34, 4.E+34, 5.E+34, 6.E+34, 7.E+34, 8.E+34, 9.E+34,
280 1.E+35, 2.E+35, 3.E+35, 4.E+35, 5.E+35, 6.E+35, 7.E+35, 8.E+35, 9.E+35,
281 1.E+36, 2.E+36, 3.E+36, 4.E+36, 5.E+36, 6.E+36, 7.E+36, 8.E+36, 9.E+36,
282 1.E+37, 2.E+37, 3.E+37, 4.E+37, 5.E+37, 6.E+37, 7.E+37, 8.E+37, 9.E+37,
283 1.E+38, 2.E+38, 3.E+38, 4.E+38, 5.E+38, 6.E+38, 7.E+38, 8.E+38, 9.E+38,
284 1.E+39, 2.E+39, 3.E+39, 4.E+39, 5.E+39, 6.E+39, 7.E+39, 8.E+39, 9.E+39,
285 1.E+40, 2.E+40, 3.E+40, 4.E+40, 5.E+40, 6.E+40, 7.E+40, 8.E+40, 9.E+40,
286 1.E+41, 2.E+41, 3.E+41, 4.E+41, 5.E+41, 6.E+41, 7.E+41, 8.E+41, 9.E+41,
287 1.E+42, 2.E+42, 3.E+42, 4.E+42, 5.E+42, 6.E+42, 7.E+42, 8.E+42, 9.E+42,
288 1.E+43, 2.E+43, 3.E+43, 4.E+43, 5.E+43, 6.E+43, 7.E+43, 8.E+43, 9.E+43,
289 1.E+44, 2.E+44, 3.E+44, 4.E+44, 5.E+44, 6.E+44, 7.E+44, 8.E+44, 9.E+44,
290 1.E+45, 2.E+45, 3.E+45, 4.E+45, 5.E+45, 6.E+45, 7.E+45, 8.E+45, 9.E+45,
291 1.E+46, 2.E+46, 3.E+46, 4.E+46, 5.E+46, 6.E+46, 7.E+46, 8.E+46, 9.E+46,
292 1.E+47, 2.E+47, 3.E+47, 4.E+47, 5.E+47, 6.E+47, 7.E+47, 8.E+47, 9.E+47,
293 1.E+48, 2.E+48, 3.E+48, 4.E+48, 5.E+48, 6.E+48, 7.E+48, 8.E+48, 9.E+48,
294 1.E+49, 2.E+49, 3.E+49, 4.E+49, 5.E+49, 6.E+49, 7.E+49, 8.E+49, 9.E+49,
295 1.E+50, 2.E+50, 3.E+50, 4.E+50, 5.E+50, 6.E+50, 7.E+50, 8.E+50, 9.E+50,
296 1.E+51, 2.E+51, 3.E+51, 4.E+51, 5.E+51, 6.E+51, 7.E+51, 8.E+51, 9.E+51,
297 1.E+52, 2.E+52, 3.E+52, 4.E+52, 5.E+52, 6.E+52, 7.E+52, 8.E+52, 9.E+52,
298 1.E+53, 2.E+53, 3.E+53, 4.E+53, 5.E+53, 6.E+53, 7.E+53, 8.E+53, 9.E+53,
299 1.E+54, 2.E+54, 3.E+54, 4.E+54, 5.E+54, 6.E+54, 7.E+54, 8.E+54, 9.E+54,
300 1.E+55, 2.E+55, 3.E+55, 4.E+55, 5.E+55, 6.E+55, 7.E+55, 8.E+55, 9.E+55,
301 1.E+56, 2.E+56, 3.E+56, 4.E+56, 5.E+56, 6.E+56, 7.E+56, 8.E+56, 9.E+56,
302 1.E+57, 2.E+57, 3.E+57, 4.E+57, 5.E+57, 6.E+57, 7.E+57, 8.E+57, 9.E+57,
303 1.E+58, 2.E+58, 3.E+58, 4.E+58, 5.E+58, 6.E+58, 7.E+58, 8.E+58, 9.E+58,
304 1.E+59, 2.E+59, 3.E+59, 4.E+59, 5.E+59, 6.E+59, 7.E+59, 8.E+59, 9.E+59,
305 1.E+60, 2.E+60, 3.E+60, 4.E+60, 5.E+60, 6.E+60, 7.E+60, 8.E+60, 9.E+60,
306 1.E+61, 2.E+61, 3.E+61, 4.E+61, 5.E+61, 6.E+61, 7.E+61, 8.E+61, 9.E+61,
307 1.E+62, 2.E+62, 3.E+62, 4.E+62, 5.E+62, 6.E+62, 7.E+62, 8.E+62, 9.E+62,
308 1.E+63, 2.E+63, 3.E+63, 4.E+63, 5.E+63, 6.E+63, 7.E+63, 8.E+63, 9.E+63,
309 1.E+64, 2.E+64, 3.E+64, 4.E+64, 5.E+64, 6.E+64, 7.E+64, 8.E+64, 9.E+64,
310 1.E+65, 2.E+65, 3.E+65, 4.E+65, 5.E+65, 6.E+65, 7.E+65, 8.E+65, 9.E+65,
311 1.E+66, 2.E+66, 3.E+66, 4.E+66, 5.E+66, 6.E+66, 7.E+66, 8.E+66, 9.E+66,
312 1.E+67, 2.E+67, 3.E+67, 4.E+67, 5.E+67, 6.E+67, 7.E+67, 8.E+67, 9.E+67,
313 1.E+68, 2.E+68, 3.E+68, 4.E+68, 5.E+68, 6.E+68, 7.E+68, 8.E+68, 9.E+68,
314 1.E+69, 2.E+69, 3.E+69, 4.E+69, 5.E+69, 6.E+69, 7.E+69, 8.E+69, 9.E+69,
315 1.E+70, 2.E+70, 3.E+70, 4.E+70, 5.E+70, 6.E+70, 7.E+70, 8.E+70, 9.E+70,
316 1.E+71, 2.E+71, 3.E+71, 4.E+71, 5.E+71, 6.E+71, 7.E+71, 8.E+71, 9.E+71,
317 1.E+72, 2.E+72, 3.E+72, 4.E+72, 5.E+72, 6.E+72, 7.E+72, 8.E+72, 9.E+72,
318 1.E+73, 2.E+73, 3.E+73, 4.E+73, 5.E+73, 6.E+73, 7.E+73, 8.E+73, 9.E+73,
319 1.E+74, 2.E+74, 3.E+74, 4.E+74, 5.E+74, 6.E+74, 7.E+74, 8.E+74, 9.E+74,
320 1.E+75, 2.E+75, 3.E+75, 4.E+75, 5.E+75, 6.E+75, 7.E+75, 8.E+75, 9.E+75,
321 1.E+76, 2.E+76, 3.E+76, 4.E+76, 5.E+76, 6.E+76, 7.E+76, 8.E+76, 9.E+76,
322 1.E+77, 2.E+77, 3.E+77, 4.E+77, 5.E+77, 6.E+77, 7.E+77, 8.E+77, 9.E+77,
323 1.E+78, 2.E+78, 3.E+78, 4.E+78, 5.E+78, 6.E+78, 7.E+78, 8.E+78, 9.E+78,
324 1.E+79, 2.E+79, 3.E+79, 4.E+79, 5.E+79, 6.E+79, 7.E+79, 8.E+79, 9.E+79,
325 1.E+80, 2.E+80, 3.E+80, 4.E+80, 5.E+80, 6.E+80, 7.E+80, 8.E+80, 9.E+80,
326 1.E+81, 2.E+81, 3.E+81, 4.E+81, 5.E+81, 6.E+81, 7.E+81, 8.E+81, 9.E+81,
327 1.E+82, 2.E+82, 3.E+82, 4.E+82, 5.E+82, 6.E+82, 7.E+82, 8.E+82, 9.E+82,
328 1.E+83, 2.E+83, 3.E+83, 4.E+83, 5.E+83, 6.E+83, 7.E+83, 8.E+83, 9.E+83,
329 1.E+84, 2.E+84, 3.E+84, 4.E+84, 5.E+84, 6.E+84, 7.E+84, 8.E+84, 9.E+84,
330 1.E+85, 2.E+85, 3.E+85, 4.E+85, 5.E+85, 6.E+85, 7.E+85, 8.E+85, 9.E+85,
331 1.E+86, 2.E+86, 3.E+86, 4.E+86, 5.E+86, 6.E+86, 7.E+86, 8.E+86, 9.E+86,
332 1.E+87, 2.E+87, 3.E+87, 4.E+87, 5.E+87, 6.E+87, 7.E+87, 8.E+87, 9.E+87,
333 1.E+88, 2.E+88, 3.E+88, 4.E+88, 5.E+88, 6.E+88, 7.E+88, 8.E+88, 9.E+88,
334 1.E+89, 2.E+89, 3.E+89, 4.E+89, 5.E+89, 6.E+89, 7.E+89, 8.E+89, 9.E+89,
335 1.E+90, 2.E+90, 3.E+90, 4.E+90, 5.E+90, 6.E+90, 7.E+90, 8.E+90, 9.E+90,
336 1.E+91, 2.E+91, 3.E+91, 4.E+91, 5.E+91, 6.E+91, 7.E+91, 8.E+91, 9.E+91,
337 1.E+92, 2.E+92, 3.E+92, 4.E+92, 5.E+92, 6.E+92, 7.E+92, 8.E+92, 9.E+92,
338 1.E+93, 2.E+93, 3.E+93, 4.E+93, 5.E+93, 6.E+93, 7.E+93, 8.E+93, 9.E+93,
339 1.E+94, 2.E+94, 3.E+94, 4.E+94, 5.E+94, 6.E+94, 7.E+94, 8.E+94, 9.E+94,
340 1.E+95, 2.E+95, 3.E+95, 4.E+95, 5.E+95, 6.E+95, 7.E+95, 8.E+95, 9.E+95,
341 1.E+96, 2.E+96, 3.E+96, 4.E+96, 5.E+96, 6.E+96, 7.E+96, 8.E+96, 9.E+96,
342 1.E+97, 2.E+97, 3.E+97, 4.E+97, 5.E+97, 6.E+97, 7.E+97, 8.E+97, 9.E+97,
343 1.E+98, 2.E+98, 3.E+98, 4.E+98, 5.E+98, 6.E+98, 7.E+98, 8.E+98, 9.E+98,
344 1.E+99, 2.E+99, 3.E+99, 4.E+99, 5.E+99, 6.E+99, 7.E+99, 8.E+99, 9.E+99 };
345
346
347 Standard_Real Interface_FileReaderData::Fastof (const Standard_CString ligne)
348{
349 Standard_Real val = 0., valdiv;
350 int i, jj, j, k, je, jx;
351 int chiffre[MAXCHIF]; int point, prem, moins, exp, grexp;
352 j = jj = je = jx = 0;
353 moins = exp = grexp = 0;
354 prem = MAXCHIF + 1; point = -1; // ligne[MAXCHIF+1] = '\0'; fin forcee
355
356/* Analyse de la ligne (reputee representer un Flottant) */
357 for (i = 0; ; i ++) { // critere d arret : cf '\0'
358 const char& car = ligne[i];
359/* critere d arret : ne pas l oublier, mais eviter de freiner le traitement
360 DONC, une fois en fin, plus une fois pour 1er passage
361 if (car == '\0')
362 { if (point < 0) { point = i; jx = point - prem; }; break; } */
363
364 if (prem > MAXCHIF) {
365 if (car == '0') continue;
366 if (car == '.') { point = i; continue; }
367 if (car == '+') continue;
368 if (car == '-') { moins = 1; continue; }
369 if (car == '\0')
370 { if (point < 0) { point = i; jx = point - prem; }; break; }
371 if (car < 33) continue;
372 prem = i;
373 if (point >= 0) jx = point - prem + 1;
374 }
375 if (car > 48 && car <= 57)
376 { chiffre[j] = car - 48; jj = ++j; continue; } // j++ puis jj = j
377 if (car == '0') { chiffre[j] = 0; j ++; continue; }
378 if (car == '.') { point = i; jx = point - prem; continue; }
379 if ((car & 94) == 68) { // prend : e E d D
380 je = i; exp = atoi(&ligne[i+1]); jx += exp;
381 if (exp < -100 || exp > 100) grexp = 1; break;
382 }
383 if (car == '\0')
384 { if (point < 0) { point = i; jx = point - prem; }; break; }
385 }
386
387/* Interpretation : on decale le Point Decimal selon l Exposant
388 Puis on considere par rapport a <jj>, <prem> :
389 chiffre[i, pour i < point - prem] : partie entiere
390 chiffre[i, pour i >= point - prem] : partie decimale
391*/
392
393// jx = (point < prem ? point - prem + 1 : point - prem) + exp; deja calcule
394// Puissance de 10 premiere decimale <0>
395// limite : le PLUS PETIT SIGNIFIANT doit etre >= 1e-99
396 je = jx*9;
397 if (jx > jj) {
398 valdiv = 1.;
91322f44 399 if (jx >= 100 || grexp) return Atof(ligne); // issue de secours
7fd59977 400 } else {
401 k = jj*9;
91322f44 402 if (jj >= 100 || grexp || (k-je >= 900)) return Atof(ligne); // issue de secours
7fd59977 403 valdiv = vtab[k-je];
404 je = k;
405 }
406
407 je --;
408// val = 0.; mis a la creation
409 for (i = 0; i < jj; i ++) {
410 je -= 9;
411 const int& chif = chiffre[i];
412 if (chif != 0) val += vtab[chif+je];
413 }
414 if (valdiv != 1.) val = val/valdiv;
415 if (moins) val = -val;
416 return val;
417}