vmenu2_ptr VMenu2::create(const string& Title, const MenuDataEx *Data, size_t ItemCount, int MaxHeight, DWORD Flags) { vmenu2_ptr VMenu2Ptr(new VMenu2(MaxHeight)); VMenu2Ptr->InitDialogObjects(); VMenu2Ptr->SetMacroMode(MACROAREA_MENU); VMenu2Ptr->SetDialogMode(DMODE_KEEPCONSOLETITLE | DMODE_ISMENU); VMenu2Ptr->SetTitle(Title); VMenu2Ptr->SendMessage(DM_SETINPUTNOTIFY, 1, nullptr); std::vector<FarListItem> fli(ItemCount); std::transform(Data, Data + ItemCount, fli.begin(), [](const MenuDataEx& i)->FarListItem { FarListItem Item = {i.Flags, i.Name}; return Item; }); FarList fl={sizeof(FarList), ItemCount, fli.data()}; VMenu2Ptr->SendMessage(DM_LISTSET, 0, &fl); for(size_t i=0; i<ItemCount; ++i) VMenu2Ptr->GetItemPtr(static_cast<int>(i))->AccelKey = Data[i].AccelKey; // BUGBUG VMenu2Ptr->Dialog::SetPosition(-1, -1, 20, 20); VMenu2Ptr->SetMenuFlags(Flags | VMENU_MOUSEREACTION); VMenu2Ptr->Resize(); return VMenu2Ptr; }
/** Computes the dependencies between directories */ void DirDef::computeDependencies() { FileList *fl = m_fileList; if (fl) { QListIterator<FileDef> fli(*fl); FileDef *fd; for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd { //printf(" File %s\n",fd->name().data()); //printf("** dir=%s file=%s\n",shortName().data(),fd->name().data()); QList<IncludeInfo> *ifl = fd->includeFileList(); if (ifl) { QListIterator<IncludeInfo> ifli(*ifl); IncludeInfo *ii; for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file { //printf(" > %s\n",ii->includeName.data()); //printf(" #include %s\n",ii->includeName.data()); if (ii->fileDef && ii->fileDef->isLinkable()) // linkable file { DirDef *usedDir = ii->fileDef->getDirDef(); if (usedDir) { // add dependency: thisDir->usedDir //static int count=0; //printf(" %d: add dependency %s->%s\n",count++,name().data(),usedDir->name().data()); addUsesDependency(usedDir,fd,ii->fileDef,FALSE); } } } } } } if (m_usedDirs) { QDictIterator<UsedDir> udi(*m_usedDirs); UsedDir *udir; for (udi.toFirst();(udir=udi.current());++udi) { udir->sort(); } } }
//-- print number of CFG nodes, max and average fact size void MBU::print_debug_stats(CFG& cfg, FILE * outf) { int num_nodes = 0; int tot_facts = 0; int max_facts = 0; suco_iterator<CFGfunction *> fli(cfg.getFunctionList()); while(fli.Iterate()){ if(flag_use_bblocks){ suco_iterator<CFGbblock *> bbi(fli.Current()->getBBlist()); while(bbi.Iterate()){ CFGbblock& bb = *bbi.Current(); //-- count facts MBUfact& mf = bb.getMBUfact(); int len = mf.length(); num_nodes++; tot_facts += len; if(max_facts < len){ max_facts = len; } } } else { suco_iterator<PgmStmt *> sti(fli.Current()->getStmtList()); while(sti.Iterate()){ PgmStmt& st = *sti.Current(); //-- count facts MBUfact& mf = st.getMBUfact(); int len = mf.length(); num_nodes++; tot_facts += len; if(max_facts < len){ max_facts = len; } } } } if(flag_verbose == 4){ static fmapentry * func_map = 0; static int num_funcs = 0; int i; if(!func_map){ //-- one-time initialization of func_map num_funcs = cfg.getFunctionList().Length(); func_map = new struct fmapentry[num_funcs]; for(i = 0; i < num_funcs; ++i){ func_map[i].fptr = 0; func_map[i].count = 0; func_map[i].oldcount = 0; } } for(i = 0; i < num_funcs; ++i){ func_map[i].oldcount = func_map[i].count; func_map[i].count = 0; } suco_iterator<CFGnode *> wli(this->worklist.list); while(wli.Iterate()){ CFGfunction * fptr = &wli.Current()->getParentFunction(); for(i = 0; i < num_funcs; ++i){ if(!func_map[i].fptr){ func_map[i].fptr = fptr; func_map[i].count = 1; break; } else if(func_map[i].fptr == fptr){ func_map[i].count++; break; } } } qsort(func_map, num_funcs, sizeof(struct fmapentry), fme_compare); int mode = 0; fprintf(outf, "Worklist content: top 5 functions:\n\t"); for(i = 0; i < num_funcs && func_map[i].count; ++i){ if(i == 5){ // switch mode to active delta mode = 1; fprintf(outf, "\nRemaining active with deltas:"); } if(mode == 0){ fprintf(outf, " %s(%d/%d)", func_map[i].fptr->getId().getPid().getname(), func_map[i].count, func_map[i].count - func_map[i].oldcount); } else if(func_map[i].count - func_map[i].oldcount){ if(!((mode-1) % 5)) fprintf(outf, "\n\t"); mode++; fprintf(outf, " %s(%d/%d)", func_map[i].fptr->getId().getPid().getname(), func_map[i].count, func_map[i].count - func_map[i].oldcount); } } fprintf(outf, "\n"); } fprintf(outf, "Facts: total %d, per %s %.2f, max = %d\n", tot_facts, flag_use_bblocks?"bblock":"stmt", (num_nodes)?((float)tot_facts/(float)num_nodes):((float)tot_facts), max_facts); }