00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "magic/mclass.h"
00026 #include "magic/mmap.h"
00027
00029
00030
00031
00032 Class* appclass = NULL;
00033 Class* taskclass = NULL;
00034
00035
00036 Class::Class (const char* nam, const char* bases, GetClassInstance* getInstPtr){
00037 #ifdef MODULEDEBUG
00038 TRACE2 ("Class (%s, %s)", nam, bases);
00039 #endif
00040 name = nam;
00041 name.checksum ();
00042
00043
00044
00045
00046 mGetInstance = getInstPtr;
00047
00048 if (bases) {
00049
00050
00051 String bases_str = bases;
00052 while (bases_str.length()>0 && (bases_str[0]=='{' || bases_str[0]=='"'))
00053 bases_str = bases_str.mid (1);
00054 while (bases_str.length()>0 && (bases_str[bases_str.length()-1]=='}' || bases_str[bases_str.length()-1]=='"'))
00055 bases_str.dellast (1);
00056
00057
00058 bases_str.split (parents_unfound, ',');
00059 for (int i=0; i<parents_unfound.size; i++) {
00060 if ((parents_unfound[i] == "Application" ||
00061 parents_unfound[i] == "HTMLQuery") &&
00062 name != "HTMLQuery") {
00063 appclass = this;
00064
00065 }
00066 if (parents_unfound[i] == "Task")
00067 taskclass = this;
00068 }
00069 }
00070
00071
00072
00073 ClassLib::insert (*this);
00074 }
00075
00076 Class::~Class () {
00077
00078
00079 }
00080
00081 void Class::printclassinfo (FILE* out) const {
00082 fprintf (out, "class %s",
00083 (CONSTR) name);
00084
00085
00086 if (parents_unfound.size>0) {
00087 fprintf (out, ": ");
00088 for (int i=0; i<parents_unfound.size; i++) {
00089 fprintf (out, "%s", (CONSTR) parents_unfound[i]);
00090 if (i<parents_unfound.size-1)
00091 fprintf (out, ",");
00092 }
00093 }
00094 fprintf (out, " {\n");
00095
00096
00097
00098
00099
00100 Object* inst=NULL;
00101
00102 DumpContext ar (out);
00103 ar << *inst;
00104 for (int i=0; i<ar.getattribs().size; i++)
00105 fprintf (out, "\t%s;\n", (CONSTR) ar.getattribs()[i]);
00106 delete inst;
00107 fprintf (out, "};\n");
00108 }
00109
00111
00112
00113 CMap<String,Class>* ClassLib::classes = NULL;
00114
00115 void ClassLib::printclassinfo (const String& classname, FILE* out) {
00116 const Class* cls = classes->getp (classname);
00117 if (cls)
00118 cls->printclassinfo (out);
00119 }
00120
00121 Class* ClassLib::getclass (const String& classname) {
00122 return classes->getvp (classname);
00123 }
00124
00125 Object& ClassLib::getinstance (const String& classname) {
00126
00127 Class* cls = classes->getvp (classname);
00128 if (cls)
00129 return *cls->getInstance();
00130 TRACE1("%%ERROR: No instance for '%s' found", (CONSTR) classname);
00131 return *(Object*)NULL;
00132 }
00133
00134 void ClassLib::insert (Class& cls) {
00135 if (!classes)
00136 classes = new CMap<String,Class> (256, MAP_REF);
00137
00138 classes->set (cls.name, cls);
00139
00140
00141 for (int i=0; i<cls.parents_unfound.size; i++)
00142 ;
00143 }