808e4d2e2a042eb205c7440f2328b820e50b11fd
[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   //thenbpar.SetValue  (num,0);
68 }
69
70     void Interface_FileReaderData::AddParam
71   (const Standard_Integer num,
72    const Standard_CString aval, const Interface_ParamType atype,
73    const Standard_Integer nument)
74 {
75 //  Interface_FileParameter FP;
76 //  FP.Init(aval,atype);
77   theparams->Append(aval,-1,atype,nument);
78   //thenbpar(num) ++;  // SetValue(num,thenbpar(num)+1);
79 }
80
81     void Interface_FileReaderData::AddParam
82   (const Standard_Integer num,
83    const TCollection_AsciiString& aval, const Interface_ParamType atype,
84    const Standard_Integer nument)
85 {
86 //  Interface_FileParameter FP;
87 //  FP.Init(aval,atype);
88   theparams->Append(aval.ToCString(),aval.Length(),atype,nument);
89   //thenbpar(num) ++;  // .SetValue(num,thenbpar(num)+1);
90 }
91
92     void Interface_FileReaderData::AddParam
93   (const Standard_Integer num,
94    const Interface_FileParameter& FP)
95 {
96   theparams->Append(FP);
97   //thenbpar(num) ++;  // .SetValue(num,thenbpar(num)+1);
98 }
99
100
101     void Interface_FileReaderData::SetParam
102   (const Standard_Integer num, const Standard_Integer nump,
103    const Interface_FileParameter& FP)
104 {
105   //if (nump <= thenbpar.Value(num))
106     theparams->SetParam(thenumpar(num-1)+nump,FP);
107 }
108
109     Standard_Integer Interface_FileReaderData::NbParams
110   (const Standard_Integer num) const
111 {
112   if (num > 1) return (thenumpar(num) - thenumpar(num-1));
113   else if(num ==1) return thenumpar(num);                  //thenbpar(num);
114   else return theparams->NbParams();
115 }
116
117     Handle(Interface_ParamList) Interface_FileReaderData::Params
118   (const Standard_Integer num) const
119 {
120   if (num == 0) return theparams->Params(0,0);  // complet
121   else if(num ==1) return theparams->Params(0,thenumpar(1));
122   else return theparams->Params ( thenumpar(num-1)+1, (thenumpar(num) - thenumpar(num-1)) );
123 }
124
125     const Interface_FileParameter& Interface_FileReaderData::Param
126   (const Standard_Integer num, const Standard_Integer nump) const
127 {
128   if (thefic != thenum0) return theparams->Param(thenumpar(num-1)+nump);
129   if (thenm0 != num) {  thenp0 = thenumpar(num-1);  thenm0 = num;  }
130   return theparams->Param (thenp0+nump);
131 }
132
133     Interface_FileParameter& Interface_FileReaderData::ChangeParam
134   (const Standard_Integer num, const Standard_Integer nump)
135 {
136   if (thefic != thenum0) return theparams->ChangeParam(thenumpar(num-1)+nump);
137   if (thenm0 != num) {  thenp0 = thenumpar(num-1);  thenm0 = num;  }
138   return theparams->ChangeParam (thenp0+nump);
139 }
140
141     Interface_ParamType Interface_FileReaderData::ParamType
142   (const Standard_Integer num, const Standard_Integer nump) const
143       {  return Param(num,nump).ParamType();  }
144
145     Standard_CString  Interface_FileReaderData::ParamCValue
146   (const Standard_Integer num, const Standard_Integer nump) const
147       {  return Param(num,nump).CValue();  }
148
149
150     Standard_Boolean Interface_FileReaderData::IsParamDefined
151   (const Standard_Integer num, const Standard_Integer nump) const
152       {  return (Param(num,nump).ParamType() != Interface_ParamVoid);  }
153
154     Standard_Integer Interface_FileReaderData::ParamNumber
155   (const Standard_Integer num, const Standard_Integer nump) const
156       {  return Param(num,nump).EntityNumber();  }
157
158     const Handle(Standard_Transient)& Interface_FileReaderData::ParamEntity
159   (const Standard_Integer num, const Standard_Integer nump) const
160       {  return BoundEntity (Param(num,nump).EntityNumber());  }
161
162     Interface_FileParameter& Interface_FileReaderData::ChangeParameter
163   (const Standard_Integer numpar)
164       {  return theparams->ChangeParam (numpar);  }
165
166     void  Interface_FileReaderData::ParamPosition
167   (const Standard_Integer numpar,
168    Standard_Integer& num, Standard_Integer& nump) const
169 {
170   Standard_Integer nbe = thenumpar.Upper();
171   if (numpar <= 0) {  num = nump = 0;  return;  }
172   for (Standard_Integer i = 1; i <= nbe; i ++) {
173     if (thenumpar(i) > numpar)
174       {  num = i;  nump = numpar - thenumpar(i) +1;  return;  }
175   }
176   num = nbe;  nump = numpar - thenumpar(nbe) +1;
177 }
178
179     Standard_Integer Interface_FileReaderData::ParamFirstRank
180   (const Standard_Integer num) const
181       {  return thenumpar(num);  }
182
183     void  Interface_FileReaderData::SetErrorLoad (const Standard_Boolean val)
184       {  therrload = (val ? 1 : -1);  }
185
186     Standard_Boolean  Interface_FileReaderData::IsErrorLoad () const
187       {  return (therrload != 0);  }
188
189     Standard_Boolean  Interface_FileReaderData::ResetErrorLoad ()
190       {  Standard_Boolean res = (therrload > 0); therrload = 0;  return res;  }
191
192 //  ....        Gestion des Entites Associees aux Donnees du Fichier       ....
193
194
195 const Handle(Standard_Transient)& Interface_FileReaderData::BoundEntity
196        (const Standard_Integer num) const
197        //      {  return theents(num);  }
198
199   if (num >= theents.Lower() && num <= theents.Upper()) {
200     return theents(num);
201   }
202   else {
203     static Handle(Standard_Transient) dummy;
204     return dummy;
205   }
206 }
207 /*  //static Handle(Standard_Transient) dummy;
208   {
209   //smh#10 Protection. If iges entity does not exist, return null pointer.
210     try {
211       OCC_CATCH_SIGNALS
212       Handle(Standard_Transient) temp = theents.Value(num);
213     }
214   ////sln 21.01.2002 OCC133: Exception handling 
215  // catch (Standard_OutOfRange) {
216  //   cout<<" Catch of sln"<<endl;
217     
218  //   return dummy;
219  // }
220     catch (Standard_Failure) {
221       
222     // some work-around, the best would be to modify CDL to
223     // return "Handle(Standard_Transient)" not "const Handle(Standard_Transient)&"
224       static Handle(Standard_Transient) dummy;
225      // cout<<" Catch of smh"<<endl;
226     return dummy;
227     }
228   }
229    //cout<<" Normal"<<endl;
230   if (theents.Value(num).IsImmutable()) cout << "IMMUTABLE:"<<num<<endl;
231   return theents(num); 
232 }
233 */
234
235 void Interface_FileReaderData::BindEntity
236    (const Standard_Integer num, const Handle(Standard_Transient)& ent)
237 //      {  theents.SetValue(num,ent);  }
238 {
239 //  #ifdef DEB
240 //    if (ent.IsImmutable())
241 //      cout << "Bind IMMUTABLE:"<<num<<endl;
242 //  #endif
243   theents.SetValue(num,ent);
244 }
245
246 void Interface_FileReaderData::Destroy ()
247 {
248 }
249
250
251 #define MAXCHIF 80
252
253 static const Standard_Real vtab[] =
254 { 1.,     2.,     3.,     4., 5., 6., 7.,     8., 9.,
255   10.,    20.,    30.,    40., 50., 60., 70.,    80., 90.,
256   100.,   200.,   300.,   400., 500., 600., 700.,   800., 900.,
257   1000.,  2000.,  3000.,  4000., 5000., 6000., 7000.,  8000., 9000.,
258   10000., 20000., 30000., 40000., 50000., 60000., 70000., 80000., 90000.,
259   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,
260   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,
261   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,
262   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,
263   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,
264   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,
265   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,
266   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,
267   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,
268   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,
269   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,
270   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,
271   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,
272   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,
273   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,
274   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,
275   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,
276   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,
277   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,
278   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,
279   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,
280   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,
281   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,
282   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,
283   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,
284   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,
285   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,
286   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,
287   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,
288   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,
289   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,
290   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,
291   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,
292   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,
293   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,
294   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,
295   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,
296   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,
297   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,
298   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,
299   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,
300   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,
301   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,
302   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,
303   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,
304   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,
305   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,
306   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,
307   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,
308   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,
309   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,
310   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,
311   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,
312   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,
313   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,
314   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,
315   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,
316   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,
317   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,
318   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,
319   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,
320   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,
321   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,
322   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,
323   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,
324   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,
325   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,
326   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,
327   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,
328   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,
329   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,
330   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,
331   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,
332   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,
333   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,
334   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,
335   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,
336   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,
337   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,
338   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,
339   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,
340   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,
341   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,
342   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,
343   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,
344   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,
345   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,
346   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,
347   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,
348   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,
349   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,
350   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,
351   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,
352   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,
353   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 };
354
355
356     Standard_Real Interface_FileReaderData::Fastof (const Standard_CString ligne)
357 {
358   Standard_Real val = 0., valdiv;
359   int i, jj, j, k, je, jx;
360   int chiffre[MAXCHIF];  int point, prem, moins, exp, grexp;
361   j = jj = je = jx = 0;
362   moins = exp = grexp = 0;
363   prem = MAXCHIF + 1;  point = -1;  //   ligne[MAXCHIF+1] = '\0';  fin forcee
364
365 /*  Analyse de la ligne (reputee representer un Flottant)  */
366   for (i = 0; ; i ++) {    // critere d arret : cf '\0'
367     const char& car = ligne[i];
368 /* critere d arret : ne pas l oublier, mais eviter de freiner le traitement
369    DONC, une fois en fin, plus une fois pour 1er passage
370     if (car == '\0')
371       {  if (point < 0) {  point = i; jx = point - prem; };  break;  }   */
372
373     if (prem > MAXCHIF) {
374       if (car == '0') continue;
375       if (car == '.') {  point = i;  continue;  }
376       if (car == '+') continue;
377       if (car == '-') {  moins = 1;  continue;  }
378       if (car == '\0')
379         {  if (point < 0) {  point = i; jx = point - prem; };  break;  }
380       if (car < 33) continue;
381       prem = i;
382       if (point >= 0) jx = point - prem + 1;
383     }
384     if (car > 48 && car <= 57)
385       {  chiffre[j] = car - 48;  jj = ++j;  continue;  }    // j++ puis jj = j
386     if (car == '0') {  chiffre[j] = 0;  j ++;  continue;  }
387     if (car == '.') {  point = i;  jx = point - prem;  continue;  }
388     if ((car & 94) == 68) { // prend  : e E d D
389       je = i;     exp = atoi(&ligne[i+1]);     jx += exp;
390       if (exp < -100 || exp > 100) grexp = 1;  break;
391     }
392     if (car == '\0')
393       {  if (point < 0) {  point = i; jx = point - prem; };  break;  }
394   }
395
396 /*  Interpretation  : on decale le Point Decimal selon l Exposant
397     Puis on considere par rapport a <jj>, <prem> :
398     chiffre[i, pour i <  point - prem] : partie entiere
399     chiffre[i, pour i >= point - prem] : partie decimale
400 */
401
402 //  jx = (point < prem ? point - prem + 1 : point - prem) + exp;  deja calcule
403 //        Puissance de 10 premiere decimale <0>
404 //  limite : le PLUS PETIT SIGNIFIANT doit etre >= 1e-99
405   je = jx*9;
406   if (jx > jj) {
407     valdiv = 1.;
408     if (jx >= 100 || grexp) return Atof(ligne);  // issue de secours
409   } else {
410     k = jj*9;
411     if (jj >= 100 || grexp || (k-je >= 900)) return Atof(ligne);  // issue de secours
412     valdiv = vtab[k-je];
413     je = k;
414   }
415
416   je --;
417 //  val = 0.;    mis a la creation
418   for (i = 0; i < jj; i ++) {
419     je -= 9;
420     const int& chif = chiffre[i];
421     if (chif != 0) val += vtab[chif+je];
422   }
423   if (valdiv != 1.) val = val/valdiv;
424   if (moins) val = -val;
425   return val;
426 }