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;
}
Esempio n. 2
0
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;
}