void ctree_dumper_t::process_for_hash(citem_t *item) { if (!filter_citem(item)) { const char* ctype_name = get_ctype_name(item->op); ctree_for_hash.cat_sprnt("%s:", ctype_name); } }
bool idaapi type_builder_t::check_helper(citem_t *parent, int &off, int &num) { if(parent->op == cot_call) { cexpr_t *expr_2 = (cexpr_t *)parent; if(!strcmp(get_ctype_name(expr_2->x->op), "helper")) { char buff[MAXSTR]; expr_2->x->print1(buff, MAXSTR, NULL); tag_remove(buff, buff, 0); if(!strcmp(buff, "LOBYTE")) { num = 1; off = 0; } else if(!strcmp(buff, "HIBYTE") || !strcmp(buff, "BYTE3")) { num = 1; off = 3; } else if(!strcmp(buff, "BYTE1")) { num = 1; off = 1; } else if(!strcmp(buff, "BYTE2")) { num = 1; off = 2; } else if(!strcmp(buff, "LOWORD")) { num = 2; off = 0; } else if(!strcmp(buff, "HIWORD")) { num = 2; off = 2; } else { return false; } return true; } } return false; }
char * ctree_dumper_t::parse_ctree_item(citem_t *item, char *buf, int bufsize) const { char *ptr = buf; char *endp = buf + bufsize; // Each node will have the element type at the first line APPEND(ptr, endp, get_ctype_name(item->op)); const cexpr_t *e = (const cexpr_t *)item; const cinsn_t *i = (const cinsn_t *)item; // For some item types, display additional information switch (item->op) { case cot_call: char buf[MAXSTR]; if (e->x->op == cot_obj) { if (get_func_name(e->x->obj_ea, buf, sizeof(buf)) == NULL) ptr += qsnprintf(ptr, endp - ptr, " sub_%a", e->x->obj_ea); else ptr += qsnprintf(ptr, endp - ptr, " %s", buf); } break; case cot_ptr: // *x case cot_memptr: // x->m // Display access size for pointers ptr += qsnprintf(ptr, endp - ptr, ".%d", e->ptrsize); if (item->op == cot_ptr) break; case cot_memref: // x.m // Display member offset for structure fields ptr += qsnprintf(ptr, endp - ptr, " (m=%d)", e->m); break; case cot_obj: // v case cot_var: // l // Display object size for local variables and global data ptr += qsnprintf(ptr, endp - ptr, ".%d", e->refwidth); case cot_num: // n case cot_helper: // arbitrary name case cot_str: // string constant // Display helper names and number values APPCHAR(ptr, endp, ' '); e->print1(ptr, endp - ptr, NULL); tag_remove(ptr, ptr, 0); ptr = tail(ptr); break; case cit_goto: // Display target label number for gotos ptr += qsnprintf(ptr, endp - ptr, " LABEL_%d", i->cgoto->label_num); break; case cit_asm: // Display instruction block address and size for asm-statements ptr += qsnprintf(ptr, endp - ptr, " %a.%" FMT_Z, *i->casm->begin(), i->casm->size()); break; default: break; } // The second line of the node contains the item address ptr += qsnprintf(ptr, endp - ptr, ";ea->%a", item->ea); if ( item->is_expr() && !e->type.empty() ) { // For typed expressions, the third line will have // the expression type in human readable form APPCHAR(ptr, endp, ';'); qstring out; if (e->type.print(&out)) { APPEND(ptr, endp, out.c_str()); } else { // could not print the type? APPCHAR(ptr, endp, '?'); APPZERO(ptr, endp); } if(e->type.is_ptr()) { tinfo_t ptr_rem = ::remove_pointer(e->type); if(ptr_rem.is_struct()) { qstring typenm; ptr_rem.print(&typenm, "prefix ", 0, 0, PRTYPE_MULTI | PRTYPE_TYPE | PRTYPE_SEMI); } } } return buf; }
char * callgraph_t::get_node_label(int n, char *buf, int bufsize) const { int_ea_map_t::const_iterator it = node2ea.find(n); if ( it != node2ea.end() ) { const citem_t *item = it->second; char *ptr = buf; char *endp = buf + bufsize; // Each node will have the element type at the first line APPEND(ptr, endp, get_ctype_name(item->op)); const cexpr_t *e = (const cexpr_t *)item; const cinsn_t *i = (const cinsn_t *)item; // For some item types, display additional information switch ( item->op ) { case cot_ptr : // *x case cot_memptr : // x->m // Display access size for pointers ptr += qsnprintf(ptr, endp-ptr, ".%d", e->ptrsize); if ( item->op == cot_ptr ) break; case cot_memref : // x.m // Display member offset for structure fields ptr += qsnprintf(ptr, endp-ptr, " (m=%d)", e->m); break; case cot_obj : // v case cot_var : // l // Display object size for local variables and global data ptr += qsnprintf(ptr, endp-ptr, ".%d", e->refwidth); case cot_num : // n case cot_helper : // arbitrary name case cot_str : // string constant // Display helper names and number values APPCHAR(ptr, endp, ' '); e->print1(ptr, endp-ptr, NULL); tag_remove(ptr, ptr, 0); ptr = tail(ptr); break; case cit_goto: // Display target label number for gotos ptr += qsnprintf(ptr, endp-ptr, " LABEL_%d", i->cgoto->label_num); break; case cit_asm: // Display instruction block address and size for asm-statements ptr += qsnprintf(ptr, endp-ptr, " %a.%"FMT_Z, *i->casm->begin(), i->casm->size()); break; default: break; } // The second line of the node contains the item address ptr += qsnprintf(ptr, endp-ptr, "\nea: %a", item->ea); if ( item->is_expr() && !e->type.empty() ) { // For typed expressions, the third line will have // the expression type in human readable form APPCHAR(ptr, endp, '\n'); if ( print_type_to_one_line(ptr, endp-ptr, idati, e->type.u_str()) != T_NORMAL ) { // could not print the type? APPCHAR(ptr, endp, '?'); APPZERO(ptr, endp); } if(e->type.is_ptr()) { typestring ptr_rem = remove_pointer(e->type); if(ptr_rem.is_struct()) { qstring typenm; print_type_to_qstring(&typenm, "prefix ", 0,0, PRTYPE_MULTI | PRTYPE_TYPE | PRTYPE_SEMI, idati, ptr_rem.u_str()); } } } } return buf; }