0024186: Eliminate remaining compiler warnings in MSVC++ 2010 64 bit with warning...
[occt.git] / src / Interface / Interface_ParamSet.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 //szv#4 S4163
19 #include <Interface_ParamSet.ixx>
20
21
22 Interface_ParamSet::Interface_ParamSet (const Standard_Integer nres, const Standard_Integer )//nst)
23 {
24   thelist = new Interface_ParamList;// (nst,nst+nres+2);
25   themxpar = nres;
26   thenbpar = 0;
27   thelnval = 0;
28   thelnres = 100; // *20;  // 10 caracteres par Param (\0 inclus) : raisonnable
29   theval   = new char[thelnres]; //szv#4:S4163:12Mar99 `thelnres+1` chars was wrong
30 }
31
32
33 //  Append(CString) : Gestion des caracteres selon <lnval>
34 //  Si lnval < 0, ParamSet passif, memoire geree de l exterieur, ParamSet
35 //                se contente de s y referer
36 //  Sinon, recopie dans une page locale
37
38 Standard_Integer  Interface_ParamSet::Append (const Standard_CString val, const Standard_Integer lnval,
39                                               const Interface_ParamType typ, const Standard_Integer nument)
40 {
41   //  Ici, gestion locale de String
42   thenbpar ++;
43   if (thenbpar > themxpar) {
44     thenext = new Interface_ParamSet (themxpar,1);
45     return (thenbpar + thenext->Append(val,lnval,typ,nument));
46   }
47   else if (lnval < 0) {
48     //    ..  Gestion externe des caracteres  ..
49     Interface_FileParameter& FP = thelist->ChangeValue(thenbpar);
50     FP.Init(val,typ);
51     if (nument != 0) FP.SetEntityNumber(nument);
52   }
53   else {
54     //    ..  Gestion locale des caracteres  ..
55     Standard_Integer i;
56     if (thelnval + lnval + 1 > thelnres) {
57       //      Reservation de caracteres insuffisante : d abord augmenter
58       Standard_Integer newres = (Standard_Integer)(thelnres*2 + lnval);
59       char* newval = new char[newres];
60       for (i = 0; i < thelnval; i++) 
61         newval[i] = theval[i]; //szv#4:S4163:12Mar99 `<= thelnres` was wrong
62       //      et cepatou : il faut realigner les Params deja enregistres sur
63       //      l ancienne reservation de caracteres ...
64       //Standard_Integer delta = (Standard_Integer) (newval - theval);
65       // difference a appliquer
66       char* poldVal = &theval[0];
67       char* pnewVal= &newval[0];
68       for (i = 1; i < thenbpar; i ++) {
69         Interface_FileParameter& OFP = thelist->ChangeValue(i);
70         Interface_ParamType otyp = OFP.ParamType();
71         char* oval = (char*)OFP.CValue();
72         Standard_Integer delta = (Standard_Integer) (oval - poldVal);
73         //if (oval < theval || oval >= (theval+thelnres)) 
74         //  continue;  //hors reserve //szv#4:S4163:12Mar99 `oval >` was wrong
75         Standard_Integer onum = OFP.EntityNumber();
76         OFP.Init(pnewVal+delta,otyp);    // et voila; on remet dans la boite
77         if (onum != 0) OFP.SetEntityNumber(onum);
78       }
79       //      Enteriner la nouvelle reservation
80       delete [] theval;
81       theval   = newval;
82       thelnres = newres;
83     }
84     //      Enregistrer ce parametre
85     for (i = 0; i < lnval; i ++)  theval[thelnval + i] = val[i];
86     theval[thelnval+lnval] = '\0';
87
88     Interface_FileParameter& FP = thelist->ChangeValue(thenbpar);
89     FP.Init(&theval[thelnval],typ);
90     if (nument != 0) FP.SetEntityNumber(nument);
91     thelnval += (Standard_Integer)(lnval+1);
92   }
93   return thenbpar;
94 }
95
96 Standard_Integer  Interface_ParamSet::Append (const Interface_FileParameter& FP)
97 {
98   //  Ici, FP tout pret : pas de gestion memoire sur String (dommage)
99
100   thenbpar ++;
101   if (thenbpar > themxpar) {
102     thenext = new Interface_ParamSet (themxpar,1);
103     return thenbpar + thenext->Append(FP);
104   }
105   thelist->SetValue(thenbpar,FP);
106   return thenbpar;
107 }
108
109 Standard_Integer Interface_ParamSet::NbParams () const 
110 {  return thenbpar;  }
111
112 const Interface_FileParameter& Interface_ParamSet::Param (const Standard_Integer num) const 
113 {
114   if (num > themxpar) return thenext->Param(num - themxpar);
115   else return thelist->Value(num);
116 }
117
118 Interface_FileParameter& Interface_ParamSet::ChangeParam (const Standard_Integer num)
119 {
120   if (num > themxpar) return thenext->ChangeParam(num - themxpar);
121   else return thelist->ChangeValue(num);
122 }
123
124 void Interface_ParamSet::SetParam (const Standard_Integer num, const Interface_FileParameter& FP)
125 {
126   if (num > themxpar) thenext->SetParam(num - themxpar, FP);
127   else thelist->SetValue(num,FP);
128 }
129
130 Handle(Interface_ParamList) Interface_ParamSet::Params (const Standard_Integer num,
131                                                         const Standard_Integer nb) const 
132 {
133   Standard_Integer i, n0 = num-1, nbp = nb;
134   if (num > themxpar) 
135     return thenext->Params (num-themxpar,nb);
136   if (num == 0 && nb == 0) {
137     n0 = 0;  nbp = thenbpar;
138     if (thenbpar <= themxpar) 
139       return thelist;  // et zou
140   }
141   Handle(Interface_ParamList) list = new Interface_ParamList;
142   if (nb == 0) 
143     return list;
144   
145   for (i = 1; i <= nbp; i ++) list->SetValue(i,Param(n0+i));
146   return list;
147 }
148
149 void Interface_ParamSet::Destroy () 
150 {
151   //  if (!thenext.IsNull()) thenext->Destroy();
152   thenext.Nullify();
153   //  Destruction "manuelle" (gestion memoire directe)
154   if (theval) delete [] theval;
155   theval = NULL;
156   thelist->Clear();
157   thelist.Nullify();
158 }