3 * Assorted utilities for the disassembler
6 * Miguel de Icaza (miguel@ximian.com)
8 * (C) 2001 Ximian, Inc (http://www.ximian.com)
16 #include "mono/utils/mono-compiler.h"
24 * @code: code to lookup in table
25 * @table: table to decode code
27 * Warning: returns static buffer.
30 map (guint32 code, dis_map_t *table)
34 for (i = 0; table [i].str != NULL; i++)
35 if (table [i].code == code)
37 return "invalid-flags";
43 * @table: table to decode bitfield
45 * Warning: returns static buffer.
48 flags (guint32 code, dis_map_t *table)
50 static char buffer [1024];
55 for (i = 0; code && table [i].str != NULL; i++)
56 if (table [i].code & code) {
57 code &= ~table [i].code;
58 strcat (buffer, table [i].str);
62 sprintf (buffer + strlen (buffer), "unknown-flag-%2x ", code);
69 * @buffer: pointer to buffer to dump
70 * @base: numbering base to use
71 * @count: number of bytes to dump
74 hex_dump (const char *buffer, int base, int count)
84 for (i = 0; i < count; i++){
87 printf ("\n0x%08X: ", (unsigned char) base + i);
89 printf ("%02X ", (unsigned char) (buffer [i]));
95 data_dump (const char *data, int len, const char* prefix) {
99 return g_strdup (" ()\n");
100 str = g_string_new (" (");
101 for (i = 0; i + 15 < len; i += 16) {
103 g_string_append_printf (str, "\n");
104 g_string_append_printf (str, "%s", prefix);
105 for (j = 0; j < 16; ++j)
106 g_string_append_printf (str, "%02X ", (unsigned char) (data [i + j]));
107 g_string_append_printf (str, i == len - 16? ") // ": " // ");
108 for (j = 0; j < 16; ++j)
109 g_string_append_printf (str, "%c", data [i + j] >= 32 && data [i + j] <= 126? data [i + j]: '.');
110 g_string_append_printf (str, "\n");
113 return g_string_free (str, FALSE);
115 g_string_append_printf (str, "%s", prefix);
118 g_string_append_printf (str, "%02X ", (unsigned char) (data [i]));
121 int count = 16 - (len % 16);
122 for (i = 0; i < count; ++i)
123 g_string_append_printf (str, " ");
125 g_string_append_printf (str, ") // ");
126 for (i = j; i < len; ++i)
127 g_string_append_printf (str, "%c", data [i] >= 32 && data [i] <= 126? data [i]: '.');
128 g_string_append_printf (str, "\n");
129 return g_string_free (str, FALSE);
133 dis_isinf (double num)
137 #elif defined(HAVE_IEEEFP_H)
140 klass = fpclass (num);
141 if (klass == FP_NINF)
144 if (klass == FP_PINF)
148 #elif defined(HAVE__FINITE)
149 return _finite (num) ? 0 : 1;
151 #error "Don't know how to implement isinf for this platform."
156 dis_isnan (double num)
158 #ifdef __MINGW32_VERSION