b311480e |
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 | |
7fd59977 |
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()); |
7fd59977 |
67 | } |
68 | |
69 | void Interface_FileReaderData::AddParam |
35e08fe8 |
70 | (const Standard_Integer /*num*/, |
7fd59977 |
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 |
35e08fe8 |
81 | (const Standard_Integer /*num*/, |
7fd59977 |
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 |
35e08fe8 |
92 | (const Standard_Integer /*num*/, |
7fd59977 |
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.; |
91322f44 |
407 | if (jx >= 100 || grexp) return Atof(ligne); // issue de secours |
7fd59977 |
408 | } else { |
409 | k = jj*9; |
91322f44 |
410 | if (jj >= 100 || grexp || (k-je >= 900)) return Atof(ligne); // issue de secours |
7fd59977 |
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 | } |