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