11 #include <display/HtmlClassInspector.h>
13 #include <framework/utilities/HTML.h>
16 #include <TClassRef.h>
17 #include <TDataType.h>
18 #include <TDataMember.h>
20 #include <TStreamerElement.h>
21 #include <TVirtualStreamerInfo.h>
30 const_cast<TObject*
>(obj)->ShowMembers(dm);
44 return info + title +
")<br> <br>";
49 title = title.Strip(TString::kBoth,
'/');
50 title = title.Strip(TString::kBoth,
'*');
51 title = title.Strip(TString::kLeading,
'!');
52 title = title.Strip(TString::kLeading,
'<');
53 title = title.Strip(TString::kBoth,
' ');
60 tmp +=
"<table width=100% cellpadding=2 bgcolor=eeeeee>";
77 const Int_t kvalue = 30;
78 const Int_t kline = 1024;
84 TDataType* membertype;
85 TString memberTypeName;
87 const char* memberFullTypeName;
92 if (TDataMember* member = cl->GetDataMember(mname)) {
93 memberTypeName = member->GetTypeName();
94 memberName = member->GetName();
95 memberFullTypeName = member->GetFullTypeName();
96 memberTitle = member->GetTitle();
97 isapointer = member->IsaPointer();
98 isbasic = member->IsBasic();
99 membertype = member->GetDataType();
100 }
else if (!cl->IsLoaded()) {
103 TVirtualStreamerInfo* info = cl->GetStreamerInfo();
105 const char* cursor = mname;
106 while ((*cursor) ==
'*') ++cursor;
107 TString elname(cursor);
108 Ssiz_t pos = elname.Index(
"[");
112 TStreamerElement* element = (TStreamerElement*)info->GetElements()->FindObject(elname.Data());
113 if (!element)
return;
114 memberFullTypeName = element->GetTypeName();
116 memberTypeName = memberFullTypeName;
117 memberTypeName = memberTypeName.Strip(TString::kTrailing,
'*');
118 if (memberTypeName.Index(
"const ") == 0) memberTypeName.Remove(0, 6);
120 memberName = element->GetName();
121 memberTitle = element->GetTitle();
122 isapointer = element->IsaPointer() || element->GetType() == TVirtualStreamerInfo::kCharStar;
123 membertype = gROOT->GetType(memberFullTypeName);
125 isbasic = membertype != 0;
131 Bool_t isdate = kFALSE;
132 if (strcmp(memberName,
"fDatime") == 0 && strcmp(memberTypeName,
"UInt_t") == 0) {
135 Bool_t isbits = kFALSE;
136 if (strcmp(memberName,
"fBits") == 0 && strcmp(memberTypeName,
"UInt_t") == 0) {
139 TClass* dataClass = TClass::GetClass(memberFullTypeName);
140 Bool_t isTString = (dataClass == TString::Class());
141 static TClassRef stdClass(
"std::string");
142 Bool_t isStdString = (dataClass == stdClass);
145 for (i = 0; i < kline; i++) line[i] =
' ';
151 char* pointer = (
char*)add;
152 char** ppointer = (
char**)(pointer);
155 char** p3pointer = (
char**)(*ppointer);
157 snprintf(&line[kvalue], kline - kvalue,
"->0");
159 snprintf(&line[kvalue], kline - kvalue,
"->%lx ", (Long_t)p3pointer);
160 else if (membertype) {
161 if (!strcmp(membertype->GetTypeName(),
"char")) {
162 i = strlen(*ppointer);
163 if (kvalue + i > kline) i = kline - 1 - kvalue;
164 Bool_t isPrintable = kTRUE;
165 for (Int_t j = 0; j < i; j++) {
166 if (!std::isprint((*ppointer)[j])) {
167 isPrintable = kFALSE;
173 std::string out(*ppointer);
174 out.copy(line + kvalue, i);
175 line[kvalue + i] = 0;
180 strncpy(&line[kvalue], membertype->AsString(p3pointer), TMath::Min(kline - 1 - kvalue,
181 (
int)strlen(membertype->AsString(p3pointer))));
183 }
else if (!strcmp(memberFullTypeName,
"char*") ||
184 !strcmp(memberFullTypeName,
"const char*")) {
185 i = strlen(*ppointer);
186 if (kvalue + i >= kline) i = kline - 1 - kvalue;
187 Bool_t isPrintable = kTRUE;
188 for (Int_t j = 0; j < i; j++) {
189 if (!std::isprint((*ppointer)[j])) {
190 isPrintable = kFALSE;
195 std::string out(*ppointer);
196 out.copy(line + kvalue, i);
199 line[kvalue + i] = 0;
204 snprintf(&line[kvalue], kline - kvalue,
"->%lx ", (Long_t)p3pointer);
206 }
else if (membertype) {
208 cdatime = (UInt_t*)pointer;
209 TDatime::GetDateTime(cdatime[0], cdate, ctime);
210 snprintf(&line[kvalue], kline - kvalue,
"%d/%d", cdate, ctime);
212 snprintf(&line[kvalue], kline - kvalue,
"0x%08x", *(UInt_t*)pointer);
214 strncpy(&line[kvalue], membertype->AsString(pointer), TMath::Min(kline - 1 - kvalue, (
int)strlen(membertype->AsString(pointer))));
218 std::string* str = (std::string*)pointer;
219 snprintf(&line[kvalue], kline - kvalue,
"%s", str->c_str());
220 }
else if (isTString) {
221 TString* str = (TString*)pointer;
222 snprintf(&line[kvalue], kline - kvalue,
"%s", str->Data());
224 snprintf(&line[kvalue], kline - kvalue,
"->%lx ", (Long_t)pointer);
231 if (TString(pname) !=
"")
232 indent =
" ";
238 m_info +=
"<td align=right>" + memberValue +
"</td>";