1 // File: Dynamic_MethodDefinitionsDictionary.cxx
2 // Created: Wed Jun 24 12:49:59 1992
3 // Author: Gilles DEBARBOUILLE
6 // CRD : 15/04/97 : Passage WOK++ : Replace TYPE by STANDARD_TYPE
7 // CRD : 03/07/97 : Porting Windows NT.
9 #include <Standard_Stream.hxx>
11 #include <Dynamic_MethodDefinitionsDictionary.ixx>
12 #include <Dynamic.hxx>
13 #include <Dynamic_CompiledMethod.hxx>
14 #include <Dynamic_BooleanParameter.hxx>
15 #include <Dynamic_IntegerParameter.hxx>
16 #include <Dynamic_RealParameter.hxx>
17 #include <Dynamic_StringParameter.hxx>
18 #include <Dynamic_ObjectParameter.hxx>
19 #include <Dynamic_InstanceParameter.hxx>
20 #include <TCollection_AsciiString.hxx>
27 #ifdef HAVE_SYS_TYPES_H
28 # include <sys/types.h>
31 #if defined (HAVE_SYS_STAT_H) || defined (WNT)
32 # include <sys/stat.h>
40 //#define strcasecmp _stricoll
43 //=======================================================================
44 //function : Dynamic_MethodDefinitionsDictionary
46 //=======================================================================
48 Dynamic_MethodDefinitionsDictionary::Dynamic_MethodDefinitionsDictionary()
52 //=======================================================================
55 //=======================================================================
57 void Dynamic_MethodDefinitionsDictionary::Creates(const Standard_CString afilename)
59 Standard_Boolean group;
60 Standard_Integer fr,i,begin,end,endline;
65 char value[80],value1[80],value2[80],value3[80];
66 Handle(Dynamic_CompiledMethod) methoddefinition;
67 Handle(Dynamic_Parameter) parameter;
71 ifstream file(afilename);
74 cout<<"unable to open "<<afilename<<" for input"<<endl;
78 thefilename = new TCollection_HAsciiString(afilename);
80 if(!stat(afilename,&buf)) thetime = buf.st_ctime;
82 thesequenceofmethoddefinitions = new Dynamic_SequenceOfMethodDefinitions();
86 for(i=0; i<255; i++) line[i] = 0;
88 file.getline(line,255);
92 while( i >= 0 && ( line[i] == ' ' || !line[i]))line[i--] = 0;
98 methoddefinition = new Dynamic_CompiledMethod(line,line);
99 thesequenceofmethoddefinitions->Append(methoddefinition);
120 for(i=0; i<80; i++)name[i]=0;
123 for(i=begin+1; i<=end-1; i++)name[endline++] = line[i];
125 for(i=0; i<80; i++)mode [i] = 0;
126 for(i=0; i<80; i++)type [i] = 0;
127 for(i=0; i<80; i++)value [i] = 0;
128 for(i=0; i<80; i++)value1 [i] = 0;
129 for(i=0; i<80; i++)value2 [i] = 0;
130 for(i=0; i<80; i++)value3 [i] = 0;
132 // fr = sscanf(&line[end+1],"%s%s%80c",&mode,&type,&value);
133 fr = sscanf(&line[end+1],"%s%s%80c",mode,type,value);
134 if(fr == -1) continue;
136 group = Standard_False;
139 group = Standard_True;
140 for(i=1; i<80; i++)type[i-1] = type[i];
152 for(i=begin; i<80; i++) value[i-begin] = value[i];
153 for(i=80-begin; i<80; i++) value[i] = 0;
155 if (!strcasecmp(type,"Standard_Boolean"))
156 methoddefinition->AddVariable(new Dynamic_BooleanParameter(name,value),Dynamic::Mode(mode),group);
158 else if(!strcasecmp(type,"Standard_Integer"))
159 methoddefinition->AddVariable(new Dynamic_IntegerParameter(name,atoi(value)),Dynamic::Mode(mode),group);
161 else if(!strcasecmp(type,"Standard_Real"))
162 methoddefinition->AddVariable(new Dynamic_RealParameter(name,atof(value)),Dynamic::Mode(mode),group);
164 else if(!strcasecmp(type,"Standard_CString"))
165 methoddefinition->AddVariable(new Dynamic_StringParameter(name,value),Dynamic::Mode(mode),group);
169 parameter = Switch(name,type,value);
170 if(!parameter.IsNull())methoddefinition->AddVariable(parameter,Dynamic::Mode(mode),group);
178 //=======================================================================
179 //function : Definition
181 //=======================================================================
183 Standard_Boolean Dynamic_MethodDefinitionsDictionary::Definition(const Handle(Dynamic_Method)& adefinition)
185 Handle(Dynamic_MethodDefinition) methoddefinition;
186 if(adefinition->IsKind(STANDARD_TYPE(Dynamic_MethodDefinition)))
188 methoddefinition = *(Handle_Dynamic_MethodDefinition*)&adefinition;
189 thesequenceofmethoddefinitions->Append(methoddefinition);
190 return Standard_True;
194 cout<<"the definition is not a method definition"<<endl;
195 return Standard_False;
199 //=======================================================================
200 //function : Definition
202 //=======================================================================
204 Standard_Boolean Dynamic_MethodDefinitionsDictionary::Definition
205 (const Standard_CString atype,
206 Handle(Dynamic_Method)& adefinition) const
208 Handle(Dynamic_Method) definition;
210 for(Standard_Integer index=1; index<=thesequenceofmethoddefinitions->Length(); index++)
212 definition = thesequenceofmethoddefinitions->Value(index);
213 if(definition->Type() == atype)
215 adefinition = definition;
216 return Standard_True;
219 return Standard_False;
222 //=======================================================================
225 //=======================================================================
227 Handle(Dynamic_Parameter) Dynamic_MethodDefinitionsDictionary::Switch(
228 const Standard_CString aname,
229 const Standard_CString atype,
230 const Standard_CString avalue) const
232 Handle(Dynamic_ObjectParameter) objectparameter;
233 cout<<"Parameter "<<aname<<" of type "<<atype<<" with "<<avalue<<" does not exist."<<endl;
234 return objectparameter;
237 //=======================================================================
238 //function : UpToDate
240 //=======================================================================
242 Standard_Boolean Dynamic_MethodDefinitionsDictionary::UpToDate() const
246 TCollection_AsciiString string = thefilename->String();
247 if(!stat(string.ToCString(),&buf))
249 if(thetime == buf.st_ctime) return Standard_True;
252 return Standard_False;
255 //=======================================================================
256 //function : NumberOfDefinitions
258 //=======================================================================
260 Standard_Integer Dynamic_MethodDefinitionsDictionary::NumberOfDefinitions() const
262 return thesequenceofmethoddefinitions->Length();
265 //=======================================================================
266 //function : Definition
268 //=======================================================================
270 Handle(Dynamic_Method) Dynamic_MethodDefinitionsDictionary::Definition
271 (const Standard_Integer anindex) const
273 return thesequenceofmethoddefinitions->Value(anindex);
276 //=======================================================================
279 //=======================================================================
281 void Dynamic_MethodDefinitionsDictionary::Dump(Standard_OStream& astream) const
283 Standard_Integer index;
284 astream<<" DICTIONARY : \n\n";
285 for(index=1;index<=thesequenceofmethoddefinitions->Length();index++)
286 thesequenceofmethoddefinitions->Value(index)->Dump(astream);