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>
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.
14 // Travaille sous le controle de FileReaderTool
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;
24 Interface_FileReaderData::Interface_FileReaderData (const Standard_Integer nbr,
25 const Standard_Integer npar)
26 : therrload (0), thenumpar (0,nbr), theents (0,nbr)
28 theparams = new Interface_ParamSet (npar);
34 Standard_Integer Interface_FileReaderData::NbRecords () const
35 { return thenumpar.Upper(); }
37 Standard_Integer Interface_FileReaderData::NbEntities () const
39 Standard_Integer nb = 0; Standard_Integer num = 0;
40 while ( (num = FindNextRecord(num)) > 0) nb ++;
45 // .... Gestion des Parametres attaches aux Records ....
47 void Interface_FileReaderData::InitParams (const Standard_Integer num)
49 thenumpar.SetValue (num,theparams->NbParams());
50 //thenbpar.SetValue (num,0);
53 void Interface_FileReaderData::AddParam
54 (const Standard_Integer num,
55 const Standard_CString aval, const Interface_ParamType atype,
56 const Standard_Integer nument)
58 // Interface_FileParameter FP;
59 // FP.Init(aval,atype);
60 theparams->Append(aval,-1,atype,nument);
61 //thenbpar(num) ++; // SetValue(num,thenbpar(num)+1);
64 void Interface_FileReaderData::AddParam
65 (const Standard_Integer num,
66 const TCollection_AsciiString& aval, const Interface_ParamType atype,
67 const Standard_Integer nument)
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);
75 void Interface_FileReaderData::AddParam
76 (const Standard_Integer num,
77 const Interface_FileParameter& FP)
79 theparams->Append(FP);
80 //thenbpar(num) ++; // .SetValue(num,thenbpar(num)+1);
84 void Interface_FileReaderData::SetParam
85 (const Standard_Integer num, const Standard_Integer nump,
86 const Interface_FileParameter& FP)
88 //if (nump <= thenbpar.Value(num))
89 theparams->SetParam(thenumpar(num-1)+nump,FP);
92 Standard_Integer Interface_FileReaderData::NbParams
93 (const Standard_Integer num) const
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();
100 Handle(Interface_ParamList) Interface_FileReaderData::Params
101 (const Standard_Integer num) const
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)) );
108 const Interface_FileParameter& Interface_FileReaderData::Param
109 (const Standard_Integer num, const Standard_Integer nump) const
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);
116 Interface_FileParameter& Interface_FileReaderData::ChangeParam
117 (const Standard_Integer num, const Standard_Integer nump)
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);
124 Interface_ParamType Interface_FileReaderData::ParamType
125 (const Standard_Integer num, const Standard_Integer nump) const
126 { return Param(num,nump).ParamType(); }
128 Standard_CString Interface_FileReaderData::ParamCValue
129 (const Standard_Integer num, const Standard_Integer nump) const
130 { return Param(num,nump).CValue(); }
133 Standard_Boolean Interface_FileReaderData::IsParamDefined
134 (const Standard_Integer num, const Standard_Integer nump) const
135 { return (Param(num,nump).ParamType() != Interface_ParamVoid); }
137 Standard_Integer Interface_FileReaderData::ParamNumber
138 (const Standard_Integer num, const Standard_Integer nump) const
139 { return Param(num,nump).EntityNumber(); }
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()); }
145 Interface_FileParameter& Interface_FileReaderData::ChangeParameter
146 (const Standard_Integer numpar)
147 { return theparams->ChangeParam (numpar); }
149 void Interface_FileReaderData::ParamPosition
150 (const Standard_Integer numpar,
151 Standard_Integer& num, Standard_Integer& nump) const
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; }
159 num = nbe; nump = numpar - thenumpar(nbe) +1;
162 Standard_Integer Interface_FileReaderData::ParamFirstRank
163 (const Standard_Integer num) const
164 { return thenumpar(num); }
166 void Interface_FileReaderData::SetErrorLoad (const Standard_Boolean val)
167 { therrload = (val ? 1 : -1); }
169 Standard_Boolean Interface_FileReaderData::IsErrorLoad () const
170 { return (therrload != 0); }
172 Standard_Boolean Interface_FileReaderData::ResetErrorLoad ()
173 { Standard_Boolean res = (therrload > 0); therrload = 0; return res; }
175 // .... Gestion des Entites Associees aux Donnees du Fichier ....
178 const Handle(Standard_Transient)& Interface_FileReaderData::BoundEntity
179 (const Standard_Integer num) const
180 // { return theents(num); }
182 if (num >= theents.Lower() && num <= theents.Upper()) {
186 static Handle(Standard_Transient) dummy;
190 /* //static Handle(Standard_Transient) dummy;
192 //smh#10 Protection. If iges entity does not exist, return null pointer.
195 Handle(Standard_Transient) temp = theents.Value(num);
197 ////sln 21.01.2002 OCC133: Exception handling
198 // catch (Standard_OutOfRange) {
199 // cout<<" Catch of sln"<<endl;
203 catch (Standard_Failure) {
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;
212 //cout<<" Normal"<<endl;
213 if (theents.Value(num).IsImmutable()) cout << "IMMUTABLE:"<<num<<endl;
218 void Interface_FileReaderData::BindEntity
219 (const Standard_Integer num, const Handle(Standard_Transient)& ent)
220 // { theents.SetValue(num,ent); }
223 // if (ent.IsImmutable())
224 // cout << "Bind IMMUTABLE:"<<num<<endl;
226 theents.SetValue(num,ent);
229 void Interface_FileReaderData::Destroy ()
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 };
339 Standard_Real Interface_FileReaderData::Fastof (const Standard_CString ligne)
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
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
354 { if (point < 0) { point = i; jx = point - prem; }; break; } */
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; }
362 { if (point < 0) { point = i; jx = point - prem; }; break; }
363 if (car < 33) continue;
365 if (point >= 0) jx = point - prem + 1;
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;
376 { if (point < 0) { point = i; jx = point - prem; }; break; }
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
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
391 if (jx >= 100 || grexp) return atof(ligne); // issue de secours
394 if (jj >= 100 || grexp || (k-je >= 900)) return atof(ligne); // issue de secours
400 // val = 0.; mis a la creation
401 for (i = 0; i < jj; i ++) {
403 const int& chif = chiffre[i];
404 if (chif != 0) val += vtab[chif+je];
406 if (valdiv != 1.) val = val/valdiv;
407 if (moins) val = -val;