00001
00025 #include "magic/mclass.h"
00026 #include "magic/mmap.h"
00027 #include "magic/mdatastream.h"
00028
00029 BEGIN_NAMESPACE (MagiC);
00030
00031
00033
00034
00035
00036
00037
00039
00040
00041
00042 Class* appclass = NULL;
00043 Class* taskclass = NULL;
00044
00045
00046 Class::Class (const char* nam, const char* bases, GetClassInstance* getInstPtr){
00047 #ifdef MODULEDEBUG
00048 TRACE2 ("Class (%s, %s)", nam, bases);
00049 #endif
00050 name = nam;
00051 name.checksum ();
00052
00053
00054
00055
00056 mGetInstance = getInstPtr;
00057
00058 if (bases) {
00059
00060
00061 String bases_str = bases;
00062 while (bases_str.length()>0 && (bases_str[0]=='{' || bases_str[0]=='"'))
00063 bases_str = bases_str.mid (1);
00064 while (bases_str.length()>0 && (bases_str[bases_str.length()-1]=='}' || bases_str[bases_str.length()-1]=='"'))
00065 bases_str.dellast (1);
00066
00067
00068 bases_str.split (parents_unfound, ',');
00069 for (int i=0; i<parents_unfound.size(); i++) {
00070 if ((parents_unfound[i] == "Application" ||
00071 parents_unfound[i] == "HTMLQuery") &&
00072 name != "HTMLQuery") {
00073 appclass = this;
00074
00075 }
00076 if (parents_unfound[i] == "Task")
00077 taskclass = this;
00078 }
00079 }
00080
00081
00082
00083 ClassLib::insert (*this);
00084 }
00085
00086 Class::~Class () {
00087
00088
00089 }
00090
00091 void Class::printclassinfo (FILE* out) const {
00092 fprintf (out, "class %s",
00093 (CONSTR) name);
00094
00095
00096 if (parents_unfound.size() > 0) {
00097 fprintf (out, ": ");
00098 for (int i=0; i<parents_unfound.size(); i++) {
00099 fprintf (out, "%s", (CONSTR) parents_unfound[i]);
00100 if (i < parents_unfound.size() - 1)
00101 fprintf (out, ",");
00102 }
00103 }
00104 fprintf (out, " {\n");
00105
00106
00107
00108
00109
00110 Object* inst=NULL;
00111
00112 DataOStream ar (out);
00113 ar << *inst;
00114 for (int i=0; i<ar.getattribs().size(); i++)
00115 fprintf (out, "\t%s;\n", (CONSTR) ar.getattribs()[i]);
00116 delete inst;
00117 fprintf (out, "};\n");
00118 }
00119
00120
00121
00123
00124
00125
00126
00127
00129
00130
00131 CMap<String,Class>* ClassLib::classes = NULL;
00132
00133 void ClassLib::printclassinfo (const String& classname, FILE* out) {
00134 const Class* cls = classes->getp (classname);
00135 if (cls)
00136 cls->printclassinfo (out);
00137 }
00138
00139 Class* ClassLib::getclass (const String& classname) {
00140 return classes->getvp (classname);
00141 }
00142
00143 Object& ClassLib::getinstance (const String& classname) {
00144
00145 Class* cls = classes->getvp (classname);
00146 if (cls)
00147 return *cls->getInstance();
00148 TRACE1("%%ERROR: No instance for '%s' found", (CONSTR) classname);
00149 return *(Object*)NULL;
00150 }
00151
00152 void ClassLib::insert (Class& cls) {
00153 if (!classes)
00154 classes = new CMap<String,Class> (256, MAP_REF);
00155
00156 classes->set (cls.name, cls);
00157
00158
00159 for (int i=0; i<cls.parents_unfound.size(); i++)
00160 ;
00161 }
00162
00163 END_NAMESPACE;
00164