0024186: Eliminate remaining compiler warnings in MSVC++ 2010 64 bit with warning...
[occt.git] / src / Interface / Interface_FileReaderData.cxx
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
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
36 static Standard_Integer thefic = 0;
37 static Standard_Integer thenm0 = -1;
38 static Standard_Integer thenp0 = -1;
39
40
41 Interface_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());
67 }
68
69     void Interface_FileReaderData::AddParam
70   (const Standard_Integer /*num*/,
71    const Standard_CString aval, const Interface_ParamType atype,
72    const Standard_Integer nument)
73 {
74   theparams->Append(aval,-1,atype,nument);
75 }
76
77     void Interface_FileReaderData::AddParam
78   (const Standard_Integer /*num*/,
79    const TCollection_AsciiString& aval, const Interface_ParamType atype,
80    const Standard_Integer nument)
81 {
82   theparams->Append(aval.ToCString(),aval.Length(),atype,nument);
83 }
84
85     void Interface_FileReaderData::AddParam
86   (const Standard_Integer /*num*/,
87    const Interface_FileParameter& FP)
88 {
89   theparams->Append(FP);
90 }
91
92
93     void Interface_FileReaderData::SetParam
94   (const Standard_Integer num, const Standard_Integer nump,
95    const Interface_FileParameter& FP)
96 {
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));
104   else if(num ==1) return thenumpar(num);
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
186 const 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
226 void 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
237 void Interface_FileReaderData::Destroy ()
238 {
239 }
240
241
242 #define MAXCHIF 80
243
244 static 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.;
399     if (jx >= 100 || grexp) return Atof(ligne);  // issue de secours
400   } else {
401     k = jj*9;
402     if (jj >= 100 || grexp || (k-je >= 900)) return Atof(ligne);  // issue de secours
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 }