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