#include <BlackAdder.h>
Public Member Functions | |
BlackAdder () | |
~BlackAdder () | |
CLS * | add_class (const std::string &,string_v &,const std::string &,int, bool) |
NSP * | GetNamespace (const std::string &name, bool add=true) |
void | MakeDot (const std::string &group_name="") |
void | add_using (const std::string &) |
void | clear_using () |
void | add_type (CLS *, const std::string &) |
void | set_typedef (const std::string &nspace, const std::string &,std::vector< std::string > &) |
bool | type_lookup (CLS *, const std::string &typ, string_v &, NSP *&) |
bool | is_class (const std::string &nspace, const std::string &name) |
Private Member Functions | |
void | fix_class () |
CLS * | find_class (const std::string &,const std::string &) |
bool | locate (NSP *base, const char *, NSP *&, CLS *&, bool add=true) |
bool | has_subclass (NSP *nsp0, CLS *cls0, const std::string &color) |
std::list< CLS * > | find_base (NSP *nsp, CLS *cls) |
void | find_color (NSP *nsp, CLS *cls) |
CLS * | find_class (const std::string &name0) |
Private Attributes | |
std::vector< NSP * > | m_added |
strstr_m | m_using |
|
Definition at line 45 of file BlackAdder.cpp.
00046 { 00047 } |
|
Definition at line 50 of file BlackAdder.cpp.
00051 { 00052 } |
|
Definition at line 55 of file BlackAdder.cpp. References DEB, get_group(), GetNamespace(), m_using, and string_v. Referenced by fix_class().
00056 { 00057 NSP *nsp = GetNamespace(strNamespace); 00058 std::string name; 00059 if (0&&strNamespace.size()) 00060 name = strNamespace + "::" + vecStr[1]; 00061 else 00062 name = vecStr[1]; 00063 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00064 { 00065 CLS *tmp = *it; 00066 if (!strcmp(tmp -> name.c_str(),name.c_str())) 00067 return tmp; 00068 } 00069 // class not added, so add 00070 CLS *tmp = new CLS; 00071 tmp -> name = name; 00072 tmp -> group_name = get_group(name); 00073 tmp -> m_namespace = strNamespace; 00074 tmp -> filename = filename; 00075 tmp -> line = line; 00076 tmp -> bExtern = bExtern; 00077 tmp -> bUsed = false; 00078 nsp -> added.push_back( tmp ); 00079 DEB( fprintf(stderr,"Class to add to namespace '%s': %s\n",strNamespace.c_str(),name.c_str());) 00080 bool col = false; 00081 bool debug = false; 00082 int count = 0; 00083 std::string bas; 00084 if (strstr(name.c_str(),"Form") || strstr(name.c_str(),"Web") ) 00085 debug = true; 00086 for (string_v::iterator it = vecStr.begin(); it != vecStr.end(); it++) 00087 { 00088 if (!col) 00089 { 00090 if (*it == ":") 00091 col = true; 00092 } 00093 else 00094 { 00095 if (*it == "<") 00096 count++; 00097 if (*it == ">") 00098 count--; 00099 if (*it == "{" || (*it == "," && !count)) 00100 { 00101 tmp -> bases.push_back( bas ); 00102 tmp -> bUsed = true; 00103 if (debug) 00104 fprintf(stderr," basklass: '%s'\n",bas.c_str()); 00105 bas = ""; 00106 } 00107 else 00108 { 00109 if (*it != "virtual" && 00110 *it != "public" && 00111 *it != "protected" && 00112 *it != "private") 00113 { 00114 if (bas.size()) 00115 bas += " " + *it; 00116 else 00117 { 00118 bas = *it; 00119 for (strstr_m::iterator i2 = m_using.begin(); i2 != m_using.end(); i2++) 00120 { 00121 if (!strcmp((*i2).first.c_str(), bas.c_str())) 00122 { 00123 bas = (*i2).second; 00124 break; 00125 } 00126 } 00127 } 00128 } 00129 } 00130 } 00131 } 00132 // printf("\n"); 00133 return tmp; 00134 } |
|
Definition at line 168 of file BlackAdder.cpp.
00169 { 00170 // skip namespace resolution here 00171 /* 00172 for (typedef_m::iterator it = m_typedef.begin(); it != m_typedef.end(); it++) 00173 { 00174 if (!strcmp((*it).first.c_str(),str.c_str())) 00175 { 00176 std::string prev; 00177 //#define DEB(x) x 00178 DEB( printf("typedef '%s'\n",str.c_str());) 00179 for (string_v::iterator it2 = (*it).second.begin(); it2 != (*it).second.end(); it2++) 00180 { 00181 if (*it2 == "<") 00182 { 00183 if (prev.size()) 00184 add_type(cls, prev); 00185 prev = ""; 00186 } 00187 else 00188 if (*it2 == ",") 00189 { 00190 if (prev.size()) 00191 add_type(cls, prev); 00192 prev = ""; 00193 } 00194 else 00195 if (*it2 == ">") 00196 { 00197 if (prev.size()) 00198 add_type(cls, prev); 00199 prev = ""; 00200 } 00201 else 00202 { 00203 // if (prev.size()) 00204 // prev += " "; 00205 prev += *it2; 00206 } 00207 } 00208 DEB( printf("typedef '%s' ok\n",str.c_str());) 00209 return; 00210 } 00211 } 00212 */ 00213 for (string_v::iterator it = cls -> using_type.begin(); it != cls -> using_type.end(); it++) 00214 { 00215 std::string x = *it; 00216 if (!strcmp(x.c_str(), str.c_str())) 00217 return; 00218 } 00219 fprintf(stderr, " adding type '%s' for class '%s'\n", str.c_str(), cls -> name.c_str()); 00220 cls -> using_type.push_back( str ); 00221 } |
|
Definition at line 137 of file BlackAdder.cpp. References m_using.
00138 { 00139 size_t x = 0; 00140 for (size_t i = 0; i < str.size() - 1; i++) 00141 if (str[i] == ':' && str[i + 1] == ':') 00142 x = i + 2; 00143 m_using[str.c_str() + x] = str; 00144 } |
|
Definition at line 161 of file BlackAdder.cpp. References m_using. Referenced by parse_file().
|
|
Definition at line 528 of file BlackAdder.cpp. References find_class(). Referenced by MakeDot().
00529 { 00530 std::list<CLS *> bases; 00531 std::string name; 00532 bool debug = false; 00533 if (nsp -> name.size()) 00534 name = nsp -> name + "::" + cls -> name; 00535 else 00536 name = cls -> name; 00537 for (string_v::iterator it = cls -> bases.begin(); it != cls -> bases.end(); it++) 00538 { 00539 std::string base = *it; 00540 CLS *base_cls = NULL; 00541 if (strstr(name.c_str(),"Form") || 00542 strstr(base.c_str(),"Form") 00543 ) 00544 { 00545 fprintf(stderr,"Class: '%s' : Base Class: '%s'\n",name.c_str(),base.c_str()); 00546 debug = true; 00547 } 00548 base_cls = find_class(base); 00549 fprintf(stderr, "Class '%s': %s\n", base.c_str(), base_cls ? "found" : "not found"); 00550 /* 00551 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00552 { 00553 CLS *cls = *it; 00554 if (!strcmp(cls -> name.c_str(),base.c_str())) 00555 { 00556 if (!strstr(base.c_str(),"::") && nsp -> name.size()) 00557 base = nsp -> name + "::" + base; 00558 resolved = true; 00559 base_cls = cls; 00560 if (debug) 00561 fprintf(stderr,"resolved as 1\n"); 00562 break; 00563 } 00564 } 00565 if (!resolved && !strstr(base.c_str(),"::") ) // find class in blank namespace 00566 { 00567 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00568 { 00569 NSP *nsp = *it; 00570 if (!nsp -> name.size()) // blank namespace 00571 { 00572 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00573 { 00574 CLS *cls = *it; 00575 if (!strcmp(cls -> name.c_str(),base.c_str())) 00576 { 00577 resolved = true; // ok base class in blank namespace 00578 base_cls = cls; 00579 if (debug) 00580 fprintf(stderr,"resolved as 2\n"); 00581 break; 00582 } 00583 } 00584 } 00585 } 00586 if (!resolved) // base must be on our namespace, somehow 00587 { 00588 if (!strstr(base.c_str(),"::") && nsp -> name.size()) 00589 { 00590 base = nsp -> name + "::" + base; 00591 if (debug) 00592 fprintf(stderr,"not resolved - renamed: %s\n",base.c_str()); 00593 } 00594 } 00595 } 00596 */ 00597 if (base_cls) 00598 { 00599 bases.push_back(base_cls); 00600 } 00601 } // for (basklasser... 00602 return bases; 00603 } |
|
Definition at line 505 of file BlackAdder.cpp. References m_added.
00506 { 00507 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00508 { 00509 NSP *nsp = *it; 00510 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00511 { 00512 CLS *cls = *it; 00513 std::string name; 00514 if (nsp -> name.size()) 00515 name = nsp -> name + "::" + cls -> name; 00516 else 00517 name = cls -> name; 00518 if (name0 == name) 00519 return cls; 00520 if (cls -> name == name0) 00521 return cls; 00522 } 00523 } 00524 return NULL; 00525 } |
|
Definition at line 147 of file BlackAdder.cpp. References DEB, and GetNamespace(). Referenced by find_base(), and fix_class().
00148 { 00149 NSP *nsp = GetNamespace(strNamespace); 00150 DEB( printf("Looking for '%s :: %s'\n",strNamespace.c_str(),strName.c_str());) 00151 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00152 { 00153 CLS *cls = *it; 00154 if (!strcmp(cls -> name.c_str(),strName.c_str())) 00155 return cls; 00156 } 00157 return NULL; 00158 } |
|
|
|
Definition at line 244 of file BlackAdder.cpp. References add_class(), DEB, find_class(), locate(), and m_added. Referenced by MakeDot().
00245 { 00246 std::vector<ADD *> c2add; 00247 return; 00248 00249 // arv 00250 00251 // namespace loop 00252 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00253 { 00254 NSP *nsp = *it; 00255 DEB( printf("\n fix_class() namespace '%s'\n",nsp -> name.c_str());) 00256 00257 // class loop 00258 for (std::vector<CLS *>::iterator it2 = nsp -> added.begin(); it2 != nsp -> added.end(); it2++) 00259 { 00260 CLS *cls = *it2; 00261 DEB( printf(" fix_class() class '%s'\n",cls -> name.c_str());) 00262 std::string name; 00263 if (nsp -> name.size()) 00264 name = nsp -> name + "::" + cls -> name; 00265 else 00266 name = cls -> name; 00267 DEB( printf(" fix_class() classname '%s'\n",name.c_str());) 00268 00269 // base class loop 00270 for (string_v::iterator it3 = cls -> bases.begin(); it3 != cls -> bases.end(); it3++) 00271 { 00272 std::string base = *it3; 00273 bool resolved = false; 00274 00275 DEB( printf(" fix_class() base_class '%s'\n",base.c_str());) 00276 00277 // try to locate base class 00278 if (!strstr(base.c_str(),"::")) 00279 { 00280 for (std::vector<CLS *>::iterator i2 = nsp -> added.begin(); i2 != nsp -> added.end(); i2++) 00281 { 00282 CLS *cls = *i2; 00283 if (!strcmp(cls -> name.c_str(),base.c_str())) 00284 { 00285 if (nsp -> name.size()) 00286 base = nsp -> name + "::" + base; 00287 resolved = true; 00288 cls -> bUsed = true; 00289 break; 00290 } 00291 } 00292 if (!resolved) // find class in blank namespace 00293 { 00294 for (std::vector<NSP *>::iterator i2 = m_added.begin(); i2 != m_added.end(); i2++) 00295 { 00296 NSP *nsp = *i2; 00297 if (!nsp -> name.size()) // blank namespace 00298 { 00299 for (std::vector<CLS *>::iterator i3 = nsp -> added.begin(); i3 != nsp -> added.end(); i3++) 00300 { 00301 CLS *cls = *i3; 00302 if (!strcmp(cls -> name.c_str(),base.c_str())) 00303 { 00304 resolved = true; // ok base class in blank namespace 00305 cls -> bUsed = true; 00306 break; 00307 } 00308 } 00309 } 00310 } 00311 if (!resolved) // base must be on our namespace, somehow 00312 { 00313 ADD *tmp = new ADD; 00314 tmp -> nsp = nsp -> name; 00315 tmp -> cls = base; 00316 c2add.push_back( tmp ); 00317 00318 if (nsp -> name.size()) 00319 base = nsp -> name + "::" + base; 00320 } 00321 } 00322 } // !strstr(,"::") 00323 00324 if (strcmp((*it3).c_str(),base.c_str())) 00325 { 00326 DEB( printf(" fix_class() renaming base class '%s' to '%s'\n",(*it3).c_str(),base.c_str());) 00327 (*it3) = base; 00328 } 00329 00330 if (!resolved) 00331 { 00332 std::string strNamespace; 00333 std::string strName = base; 00334 for (size_t i = 0; i < base.size() - 1; i++) 00335 { 00336 if (base[i] == ':' && base[i + 1] == ':') 00337 { 00338 char slask[1000]; 00339 strcpy(slask,base.c_str()); 00340 slask[i] = 0; 00341 strNamespace = slask; 00342 strName = slask + i + 2; 00343 } 00344 } 00345 CLS *t2; 00346 if (!(t2 = find_class(strNamespace,strName))) 00347 { 00348 ADD *tmp = new ADD; 00349 tmp -> nsp = strNamespace; 00350 tmp -> cls = strName; 00351 c2add.push_back( tmp ); 00352 } 00353 else 00354 { 00355 DEB( printf("setting bUsed for class '%s' in namespace '%s'\n",strName.c_str(),strNamespace.c_str());) 00356 t2 -> bUsed = true; 00357 } 00358 } 00359 } 00360 } 00361 } 00362 DEB( printf("fix_class() adding\n");) 00363 for (std::vector<ADD *>::iterator it = c2add.begin(); it != c2add.end(); it++) 00364 { 00365 ADD *tmp = *it; 00366 std::vector<std::string> vec; 00367 vec.push_back("class"); 00368 vec.push_back(tmp -> cls); 00369 vec.push_back("{"); 00370 DEB( printf("Adding '%s :: %s'\n",tmp -> nsp.c_str(),tmp -> cls.c_str());) 00371 CLS *t2 = add_class(tmp -> nsp,vec,"",0,true); 00372 t2 -> bUsed = true; 00373 } 00374 00375 // relationer 00376 DEB( printf("fix_class() relationer\n");) 00377 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00378 { 00379 NSP *nsp = *it; 00380 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00381 { 00382 CLS *cls = *it; 00383 std::string name; 00384 if (nsp -> name.size()) 00385 name = nsp -> name + "::" + cls -> name; 00386 else 00387 name = cls -> name; 00388 for (string_v::iterator it = cls -> using_type.begin(); it != cls -> using_type.end(); it++) 00389 { 00390 std::string typ = *it; 00391 char slask[1000]; 00392 bool ptr = false; 00393 bool arr = false; 00394 bool ref = false; 00395 char *s; 00396 strcpy(slask,typ.c_str()); 00397 if ((s = strstr(slask,"*")) != NULL) 00398 { 00399 ptr = true; 00400 *s = 0; 00401 } 00402 if ((s = strstr(slask,"[")) != NULL) 00403 { 00404 arr = true; 00405 *s = 0; 00406 } 00407 if ((s = strstr(slask,"&")) != NULL) 00408 { 00409 ref = true; 00410 *s = 0; 00411 } 00412 NSP *nsp2; 00413 CLS *cls2; 00414 if (locate(nsp,slask,nsp2,cls2)) 00415 { 00416 cls -> bUsed = true; 00417 cls2 -> bUsed = true; 00418 } 00419 } // for (relationer... 00420 } 00421 } 00422 // /relationer 00423 DEB( printf("fix_class() ok\n");) 00424 } |
|
Definition at line 225 of file BlackAdder.cpp. References m_added. Referenced by add_class(), find_class(), is_class(), locate(), set_typedef(), and type_lookup().
00226 { 00227 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00228 { 00229 NSP *nsp = *it; 00230 if (!strcmp(nsp -> name.c_str(),name.c_str())) 00231 { 00232 return nsp; 00233 } 00234 } 00235 if (!add) 00236 return NULL; 00237 NSP *nsp = new NSP; 00238 nsp -> name = name; 00239 m_added.push_back(nsp); 00240 return nsp; 00241 } |
|
Definition at line 457 of file BlackAdder.cpp. References darken(), m_added, and merge_colors(). Referenced by MakeDot().
00458 { 00459 bool r = false; 00460 std::string name0; 00461 if (nsp0 -> name.size()) 00462 name0 = nsp0 -> name + "::" + cls0 -> name; 00463 else 00464 name0 = cls0 -> name; 00465 fprintf(stderr, "Check subclass for '%s'\n", name0.c_str()); 00466 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00467 { 00468 NSP *nsp = *it; 00469 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00470 { 00471 CLS *cls = *it; 00472 std::string name; 00473 if (nsp -> name.size()) 00474 name = nsp -> name + "::" + cls -> name; 00475 else 00476 name = cls -> name; 00477 for (string_v::iterator it = cls -> bases.begin(); it != cls -> bases.end(); it++) 00478 { 00479 std::string base = *it; 00480 fprintf(stderr, " ... check base '%s'\n", base.c_str()); 00481 if (base == name0) 00482 { 00483 if (cls -> color.size()) 00484 { 00485 cls -> color = darken(merge_colors(cls -> color, color)); 00486 } 00487 else 00488 { 00489 cls -> color = darken(color); 00490 } 00491 r = true; 00492 } 00493 /* 00494 if (base == cls0 -> name) 00495 return true; 00496 */ 00497 } 00498 } 00499 } 00500 fprintf(stderr, " has_subclass OK\n"); 00501 return r; 00502 } |
|
Definition at line 1078 of file BlackAdder.cpp. References GetNamespace().
01079 { 01080 NSP *nsp = GetNamespace(name, false); 01081 if (!nsp) 01082 return false; 01083 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 01084 { 01085 CLS *cls = *it; 01086 if (!strcmp(cls -> name.c_str(), name.c_str())) 01087 { 01088 return true; 01089 } 01090 } 01091 return false; 01092 } |
|
Definition at line 938 of file BlackAdder.cpp. References GetNamespace(), m_added, and m_using. Referenced by fix_class(), and MakeDot().
00939 { 00940 std::string strUsing; 00941 bool found = false; 00942 for (strstr_m::iterator it = m_using.begin(); it != m_using.end(); it++) 00943 { 00944 if (!strcmp((*it).first.c_str(), name)) 00945 { 00946 strUsing = (*it).second; 00947 found = true; 00948 break; 00949 } 00950 } 00951 if (found && strUsing.size()) 00952 { 00953 size_t x = 0; 00954 char slask[3000]; 00955 for (size_t i = 0; i < strUsing.size() - 2; i++) 00956 if (strUsing[i] == ':' && strUsing[i + 1] == ':') 00957 x = i; 00958 strcpy(slask,strUsing.c_str()); 00959 slask[x] = 0; 00960 nsp2 = GetNamespace(slask,add); 00961 for (std::vector<CLS *>::iterator it = nsp2 -> added.begin(); it != nsp2 -> added.end(); it++) 00962 { 00963 CLS *cls = *it; 00964 if (!strcmp(cls -> name.c_str(),name)) 00965 { 00966 cls2 = cls; 00967 return true; 00968 } 00969 } 00970 return false; // huh 00971 } 00972 else 00973 { 00974 nsp2 = base; 00975 for (std::vector<CLS *>::iterator it = nsp2 -> added.begin(); it != nsp2 -> added.end(); it++) 00976 { 00977 CLS *cls = *it; 00978 if (!strcmp(cls -> name.c_str(),name)) 00979 { 00980 cls2 = cls; 00981 return true; 00982 } 00983 } 00984 nsp2 = GetNamespace("",add); 00985 if (!nsp2) 00986 { 00987 fprintf(stderr,"Couldn't find empty namespace\n"); 00988 } 00989 else 00990 for (std::vector<CLS *>::iterator it = nsp2 -> added.begin(); it != nsp2 -> added.end(); it++) 00991 { 00992 CLS *cls = *it; 00993 if (!cls) 00994 fprintf(stderr,"locate, cls is NULL\n"); 00995 else 00996 { 00997 if (!strcmp(cls -> name.c_str(),name)) 00998 { 00999 cls2 = cls; 01000 return true; 01001 } 01002 } 01003 } 01004 } 01005 return false; 01006 01007 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 01008 { 01009 NSP *nsp = *it; 01010 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 01011 { 01012 CLS *cls = *it; 01013 if (!strcmp(cls -> name.c_str(),name)) 01014 { 01015 nsp2 = nsp; 01016 cls2 = cls; 01017 return true; 01018 } 01019 } 01020 } 01021 return false; 01022 } |
|
Definition at line 606 of file BlackAdder.cpp. References box, cluster, colorcount, colors, config, darken(), DEB, find_base(), fix_class(), fontsize, has_subclass(), locate(), m_added, maxcolor, and merge_colors(). Referenced by main().
00607 { 00608 bool bCluster = true; 00609 DEB( printf("MakeDot()\n");) 00610 if (config["-cluster"] == "true") 00611 bCluster = false; 00612 00613 DEB( printf("fix_class()\n");) 00614 fix_class(); 00615 00616 00617 // --- 00618 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00619 { 00620 NSP *nsp = *it; 00621 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00622 { 00623 CLS *cls = *it; 00624 if (cls -> group_name != group_name) 00625 continue; 00626 bool has_base = cls -> bases.size() ? true : false; 00627 fprintf(stderr, "calling has_subclass\n"); 00628 if (!has_base && has_subclass(nsp, cls, colors[colorcount % maxcolor])) 00629 { 00630 cls -> color = colors[colorcount++ % maxcolor]; 00631 } 00632 } 00633 } 00634 // --- 00635 fprintf(stderr, "*** Assigning colors for subclasses\n"); 00636 for (int i = 0; i < 10; i++) 00637 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00638 { 00639 NSP *nsp = *it; 00640 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00641 { 00642 CLS *cls = *it; 00643 if (cls -> group_name != group_name) 00644 continue; 00645 std::list<CLS *> vec = find_base(nsp, cls); 00646 if (!cls -> color.size() || cls -> color == "#ffffff") 00647 { 00648 std::string color = "#ffffff"; 00649 bool ok = true; 00650 for (std::list<CLS *>::iterator it = vec.begin(); it != vec.end(); it++) 00651 { 00652 CLS *cls_base = *it; 00653 if (cls_base -> color.size() == 0) 00654 { 00655 ok = false; 00656 } 00657 else 00658 { 00659 color = merge_colors(color, cls_base -> color); 00660 } 00661 } 00662 if (ok && color != "#ffffff") 00663 { 00664 cls -> color = darken(color); 00665 } 00666 } 00667 } 00668 } 00669 // --- 00670 00671 for (int empty = 1; empty >= 0; empty--) 00672 { 00673 DEB( printf(" empty = %d\n",empty);) 00674 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00675 { 00676 NSP *nsp = *it; 00677 bool clust = false; 00678 if ((nsp -> name.size() && !empty) || (!nsp -> name.size() && empty)) 00679 { 00680 if (nsp -> name.size() && (bCluster || box[nsp -> name.c_str()] == "true") ) 00681 { 00682 printf(" subgraph cluster_%ld {\n",cluster++); 00683 printf(" style=filled;\n"); 00684 printf(" fillcolor=lightgrey;\n"); 00685 printf(" label=\"Namespace '%s'\"\n",nsp -> name.c_str()); 00686 printf(" node [shape=box style=filled fillcolor=white]\n"); 00687 clust = true; 00688 } 00689 else 00690 { 00691 // printf(" node [shape=box]\n"); 00692 } 00693 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00694 { 00695 CLS *cls = *it; 00696 if (cls -> group_name != group_name) 00697 continue; 00698 // bool has_base = cls -> bases.size() ? true : false; 00699 // find_color(cls); 00700 std::string name; 00701 std::string args; // [ ...args... ] 00702 if (nsp -> name.size()) 00703 name = nsp -> name + "::" + cls -> name; 00704 else 00705 name = cls -> name; 00706 // build args 00707 if (cls -> filename.size()) 00708 { 00709 // char slask[1000]; 00710 // sprintf(slask," URL=\"index.html\" tooltip=\"%s(%d)\"",cls -> filename.c_str(),cls -> line); 00711 // args += slask; 00712 switch (cls -> filename[0]) 00713 { 00714 case '/': // sys hdr (probably) 00715 args += " style=filled fillcolor=\"#e0a0a0\""; 00716 break; 00717 case '.': 00718 if (cls -> filename.size() > 1 && cls -> filename[1] == '.') 00719 { 00720 args += " style=filled fillcolor=\"#e0e0e0\""; 00721 } 00722 break; 00723 } 00724 } 00725 else 00726 if (cls -> bExtern) 00727 { 00728 args += " style=filled fillcolor=\"#e0a0a0\""; 00729 } 00730 if (!args.size()) 00731 { 00732 char slask[1000]; 00733 char tmp[1000]; 00734 size_t j = 0; 00735 for (size_t i = 0; i < cls -> name.size(); i++) 00736 { 00737 if (cls -> name[i] == '_') 00738 tmp[j++] = '_'; 00739 tmp[j++] = cls -> name[i]; 00740 } 00741 tmp[j] = 0; 00742 sprintf(slask," URL=\"html/class%s.html\" tooltip=\"Class documentation\"",tmp); 00743 args += slask; 00744 } 00745 // add fontsize 00746 { 00747 char slask[100]; 00748 sprintf(slask, " fontsize=%d", fontsize); 00749 args += slask; 00750 } 00751 // if (!has_base && has_subclass(nsp, cls) ) 00752 if (cls -> color.size()) 00753 { 00754 args += " style=filled fillcolor=\""; //#ffffe0\""; 00755 args += cls -> color; //colors[colorcount++ % maxcolor]; 00756 args += "\""; 00757 } 00758 // ... 00759 { 00760 if (clust) 00761 printf("\t"); 00762 if (args.size()) 00763 { 00764 printf("\t\"%s\" [%s]\n",name.c_str(),args.c_str() + 1); 00765 } 00766 else 00767 { 00768 printf("\t\"%s\"\n",name.c_str()); 00769 } 00770 } 00771 } 00772 if (clust) 00773 { 00774 printf(" }\n"); 00775 } 00776 } // if (empty... 00777 } 00778 // arv 00779 DEB( printf("arv\n");) 00780 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00781 { 00782 NSP *nsp = *it; 00783 bool debug = false; 00784 if ((nsp -> name.size() && !empty) || (!nsp -> name.size() && empty)) 00785 { 00786 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00787 { 00788 CLS *cls = *it; 00789 if (cls -> group_name != group_name) 00790 continue; 00791 std::string name; 00792 if (nsp -> name.size()) 00793 name = nsp -> name + "::" + cls -> name; 00794 else 00795 name = cls -> name; 00796 for (string_v::iterator it = cls -> bases.begin(); it != cls -> bases.end(); it++) 00797 { 00798 std::string base = *it; 00799 bool resolved = false; 00800 if (strstr(name.c_str(),"Form") || 00801 strstr(base.c_str(),"Form") 00802 ) 00803 { 00804 fprintf(stderr,"Class: '%s' : Base Class: '%s'\n",name.c_str(),base.c_str()); 00805 debug = true; 00806 } 00807 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00808 { 00809 CLS *cls = *it; 00810 if (!strcmp(cls -> name.c_str(),base.c_str())) 00811 { 00812 if (!strstr(base.c_str(),"::") && nsp -> name.size()) 00813 base = nsp -> name + "::" + base; 00814 resolved = true; 00815 if (debug) 00816 fprintf(stderr,"resolved as 1\n"); 00817 break; 00818 } 00819 } 00820 if (!resolved && !strstr(base.c_str(),"::") ) // find class in blank namespace 00821 { 00822 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00823 { 00824 NSP *nsp = *it; 00825 if (!nsp -> name.size()) // blank namespace 00826 { 00827 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00828 { 00829 CLS *cls = *it; 00830 if (!strcmp(cls -> name.c_str(),base.c_str())) 00831 { 00832 resolved = true; // ok base class in blank namespace 00833 if (debug) 00834 fprintf(stderr,"resolved as 2\n"); 00835 break; 00836 } 00837 } 00838 } 00839 } 00840 if (!resolved) // base must be on our namespace, somehow 00841 { 00842 if (!strstr(base.c_str(),"::") && nsp -> name.size()) 00843 { 00844 base = nsp -> name + "::" + base; 00845 if (debug) 00846 fprintf(stderr,"not resolved - renamed: %s\n",base.c_str()); 00847 } 00848 } 00849 } 00850 printf(" \"%s\" -> \"%s\" [dir=back arrowtail=empty]\n", 00851 base.c_str(),name.c_str()); 00852 } // for (basklasser... 00853 } 00854 } // if (empty... 00855 } 00856 } // for (empty) 00857 00858 // relationer 00859 DEB( printf("relationer\n");) 00860 for (std::vector<NSP *>::iterator it = m_added.begin(); it != m_added.end(); it++) 00861 { 00862 NSP *nsp = *it; 00863 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 00864 { 00865 CLS *cls = *it; 00866 if (cls -> group_name != group_name) 00867 continue; 00868 std::string name; 00869 if (nsp -> name.size()) 00870 name = nsp -> name + "::" + cls -> name; 00871 else 00872 name = cls -> name; 00873 for (string_v::iterator it = cls -> using_type.begin(); it != cls -> using_type.end(); it++) 00874 { 00875 std::string typ = *it; 00876 char slask[1000]; 00877 bool ptr = false; 00878 bool arr = false; 00879 bool ref = false; 00880 char *s; 00881 strcpy(slask,typ.c_str()); 00882 if ((s = strstr(slask,"*")) != NULL) 00883 { 00884 ptr = true; 00885 *s = 0; 00886 } 00887 if ((s = strstr(slask,"[")) != NULL) 00888 { 00889 arr = true; 00890 *s = 0; 00891 } 00892 if ((s = strstr(slask,"&")) != NULL) 00893 { 00894 ref = true; 00895 *s = 0; 00896 } 00897 NSP *nsp2; 00898 CLS *cls2; 00899 if (strncmp(slask, "int", 3) && locate(nsp,slask,nsp2,cls2,false)) 00900 { 00901 std::string name2; 00902 if (nsp2 -> name.size()) 00903 name2 = nsp2 -> name + "::" + cls2 -> name; 00904 else 00905 name2 = cls2 -> name; 00906 // printf(" \"%s\" [fontsize=%d]\n", name.c_str(), fontsize); 00907 if (ptr) 00908 { 00909 printf(" \"%s\" -> \"%s\" [arrowtail=none arrowhead=open style=dashed]\n", 00910 name.c_str(), 00911 name2.c_str()); 00912 } 00913 else 00914 if (ref) 00915 { 00916 printf(" \"%s\" -> \"%s\" [arrowtail=odiamond arrowhead=none style=dashed]\n", 00917 name.c_str(), 00918 name2.c_str()); 00919 } 00920 else 00921 { 00922 printf(" \"%s\" -> \"%s\" [arrowtail=diamond arrowhead=none style=dashed]\n", 00923 name.c_str(), 00924 name2.c_str()); 00925 } 00926 } 00927 else 00928 { 00929 } 00930 } // for (relationer... 00931 } 00932 } 00933 // /relationer 00934 DEB( printf("MakeDot() ok\n");) 00935 } |
|
Definition at line 1025 of file BlackAdder.cpp. References GetNamespace().
01026 { 01027 NSP *nsp = GetNamespace(nspace); 01028 nsp -> typedefs[t] = def; 01029 } |
|
Definition at line 1032 of file BlackAdder.cpp. References GetNamespace(), and string_v.
01033 { 01034 nsp = GetNamespace(cls -> m_namespace); 01035 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 01036 { 01037 CLS *cls = *it; 01038 if (!strcmp(cls -> name.c_str(),typ.c_str())) 01039 { 01040 return true; 01041 } 01042 } 01043 for (typedef_m::iterator it = nsp -> typedefs.begin(); it != nsp -> typedefs.end(); it++) 01044 { 01045 std::string typname = (*it).first; 01046 string_v& ref = (*it).second; 01047 if (!strcmp(typname.c_str(), typ.c_str())) 01048 { 01049 translated = ref; 01050 return true; 01051 } 01052 } 01053 nsp = GetNamespace("", false); 01054 if (!nsp) 01055 return false; 01056 for (std::vector<CLS *>::iterator it = nsp -> added.begin(); it != nsp -> added.end(); it++) 01057 { 01058 CLS *cls = *it; 01059 if (!strcmp(cls -> name.c_str(),typ.c_str())) 01060 { 01061 return true; 01062 } 01063 } 01064 for (typedef_m::iterator it = nsp -> typedefs.begin(); it != nsp -> typedefs.end(); it++) 01065 { 01066 std::string typname = (*it).first; 01067 string_v& ref = (*it).second; 01068 if (!strcmp(typname.c_str(), typ.c_str())) 01069 { 01070 translated = ref; 01071 return true; 01072 } 01073 } 01074 return false; 01075 } |
|
Definition at line 83 of file BlackAdder.h. Referenced by find_class(), fix_class(), GetNamespace(), has_subclass(), locate(), and MakeDot(). |
|
Definition at line 84 of file BlackAdder.h. Referenced by add_class(), add_using(), clear_using(), and locate(). |