static bool fcn_print_detail(RzCore *core, RzAnalysisFunction *fcn) {
	rz_return_val_if_fail(core && fcn, false);
	const char *defaultCC = rz_analysis_cc_default(core->analysis);
	char *name = rz_core_analysis_fcn_name(core, fcn);
	rz_cons_printf("\"f %s %" PFMT64u " 0x%08" PFMT64x "\"\n", name, rz_analysis_function_linear_size(fcn), fcn->addr);
	rz_cons_printf("\"af+ 0x%08" PFMT64x " %s %c %c\"\n",
		fcn->addr, name, //rz_analysis_fcn_size (fcn), name,
		fcn->type == RZ_ANALYSIS_FCN_TYPE_LOC ? 'l' : fcn->type == RZ_ANALYSIS_FCN_TYPE_SYM ? 's'
			: fcn->type == RZ_ANALYSIS_FCN_TYPE_IMP                                     ? 'i'
												    : 'f',
		fcn->diff->type == RZ_ANALYSIS_DIFF_TYPE_MATCH ? 'm' : fcn->diff->type == RZ_ANALYSIS_DIFF_TYPE_UNMATCH ? 'u'
															: 'n');
	// FIXME: this command prints something annoying. Does it have important side-effects?
	fcn_list_bbs(fcn);
	if (fcn->bits != 0) {
		rz_cons_printf("afB %d @ 0x%08" PFMT64x "\n", fcn->bits, fcn->addr);
	}
	// FIXME command injection vuln here
	if (fcn->cc || defaultCC) {
		rz_cons_printf("afc %s @ 0x%08" PFMT64x "\n", fcn->cc ? fcn->cc : defaultCC, fcn->addr);
	}
	/* show variables  and arguments */
	rz_analysis_var_list_show(core->analysis, fcn, 'b', '*', NULL);
	rz_analysis_var_list_show(core->analysis, fcn, 'r', '*', NULL);
	rz_analysis_var_list_show(core->analysis, fcn, 's', '*', NULL);
	/* Show references */
	RzListIter *refiter;
	RzAnalysisXRef *xrefi;
	RzList *xrefs = rz_analysis_function_get_xrefs_from(fcn);
	rz_list_foreach (xrefs, refiter, xrefi) {
		switch (xrefi->type) {
		case RZ_ANALYSIS_REF_TYPE_CALL:
			rz_cons_printf("axC 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_DATA:
			rz_cons_printf("axd 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_CODE:
			rz_cons_printf("axc 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_STRING:
			rz_cons_printf("axs 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_NULL:
		default:
			rz_cons_printf("ax 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		}
	}
	rz_list_free(xrefs);
	/*Saving Function stack frame*/
	rz_cons_printf("afS %d @ 0x%" PFMT64x "\n", fcn->maxstack, fcn->addr);
	free(name);
	return true;
}
static bool fcn_print_detail(RzCore *core, RzAnalysisFunction *fcn) {
	rz_return_val_if_fail(core && fcn, false);
	const char *defaultCC = rz_analysis_cc_default(core->analysis);
	char *name = rz_core_analysis_fcn_name(core, fcn);
	rz_cons_printf("\"f %s %" PFMT64u " 0x%08" PFMT64x "\"\n", name, rz_analysis_function_linear_size(fcn), fcn->addr);
	rz_cons_printf("\"af+ 0x%08" PFMT64x " %s %c %c\"\n",
		fcn->addr, name,  
		fcn->type == RZ_ANALYSIS_FCN_TYPE_LOC ? 'l' : fcn->type == RZ_ANALYSIS_FCN_TYPE_SYM ? 's'
			: fcn->type == RZ_ANALYSIS_FCN_TYPE_IMP                                     ? 'i'
												    : 'f',
		fcn->diff->type == RZ_ANALYSIS_DIFF_TYPE_MATCH ? 'm' : fcn->diff->type == RZ_ANALYSIS_DIFF_TYPE_UNMATCH ? 'u'
															: 'n');
	 
	fcn_list_bbs(fcn);
	if (fcn->bits != 0) {
		rz_cons_printf("afB %d @ 0x%08" PFMT64x "\n", fcn->bits, fcn->addr);
	}
	 
	if (fcn->cc || defaultCC) {
		rz_cons_printf("afc %s @ 0x%08" PFMT64x "\n", fcn->cc ? fcn->cc : defaultCC, fcn->addr);
	}
	 
	rz_analysis_var_list_show(core->analysis, fcn, 'b', '*', NULL);
	rz_analysis_var_list_show(core->analysis, fcn, 'r', '*', NULL);
	rz_analysis_var_list_show(core->analysis, fcn, 's', '*', NULL);
	 
	RzListIter *refiter;
	RzAnalysisXRef *xrefi;
	RzList *xrefs = rz_analysis_function_get_xrefs_from(fcn);
	rz_list_foreach (xrefs, refiter, xrefi) {
		switch (xrefi->type) {
		case RZ_ANALYSIS_REF_TYPE_CALL:
			rz_cons_printf("axC 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_DATA:
			rz_cons_printf("axd 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_CODE:
			rz_cons_printf("axc 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_STRING:
			rz_cons_printf("axs 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		case RZ_ANALYSIS_REF_TYPE_NULL:
		default:
			rz_cons_printf("ax 0x%" PFMT64x " 0x%" PFMT64x "\n", xrefi->to, xrefi->from);
			break;
		}
	}
	rz_list_free(xrefs);
	 
	rz_cons_printf("afS %d @ 0x%" PFMT64x "\n", fcn->maxstack, fcn->addr);
	free(name);
	return true;
}