2 * util.c: Assorted utilities for the disassembler
5 * Miguel de Icaza (miguel@ximian.com)
7 * (C) 2001 Ximian, Inc (http://www.ximian.com)
17 * @code: code to lookup in table
18 * @table: table to decode code
20 * Warning: returns static buffer.
23 map (guint32 code
, dis_map_t
*table
)
27 for (i
= 0; table
[i
].str
!= NULL
; i
++)
28 if (table
[i
].code
== code
)
30 return "invalid-flags";
36 * @table: table to decode bitfield
38 * Warning: returns static buffer.
41 flags (guint32 code
, dis_map_t
*table
)
43 static char buffer
[1024];
48 for (i
= 0; code
&& table
[i
].str
!= NULL
; i
++)
49 if (table
[i
].code
& code
) {
50 code
&= ~table
[i
].code
;
51 strcat (buffer
, table
[i
].str
);
55 sprintf (buffer
+ strlen (buffer
), "unknown-flag-%2x ", code
);
62 * @buffer: pointer to buffer to dump
63 * @base: numbering base to use
64 * @count: number of bytes to dump
67 hex_dump (const char *buffer
, int base
, int count
)
77 for (i
= 0; i
< count
; i
++){
80 printf ("\n0x%08X: ", (unsigned char) base
+ i
);
82 printf ("%02X ", (unsigned char) (buffer
[i
]));
88 data_dump (const char *data
, int len
, const char* prefix
) {
92 return g_strdup (" ()\n");
93 str
= g_string_new (" (");
94 for (i
= 0; i
+ 15 < len
; i
+= 16) {
96 g_string_append_printf (str
, "\n");
97 g_string_append_printf (str
, "%s", prefix
);
98 for (j
= 0; j
< 16; ++j
)
99 g_string_append_printf (str
, "%02X ", (unsigned char) (data
[i
+ j
]));
100 g_string_append_printf (str
, i
== len
- 16? ") // ": " // ");
101 for (j
= 0; j
< 16; ++j
)
102 g_string_append_printf (str
, "%c", data
[i
+ j
] >= 32 && data
[i
+ j
] <= 126? data
[i
+ j
]: '.');
103 g_string_append_printf (str
, "\n");
106 return g_string_free (str
, FALSE
);
108 g_string_append_printf (str
, "%s", prefix
);
111 g_string_append_printf (str
, "%02X ", (unsigned char) (data
[i
]));
114 int count
= 16 - (len
% 16);
115 for (i
= 0; i
< count
; ++i
)
116 g_string_append_printf (str
, " ");
118 g_string_append_printf (str
, ") // ");
119 for (i
= j
; i
< len
; ++i
)
120 g_string_append_printf (str
, "%c", data
[i
] >= 32 && data
[i
] <= 126? data
[i
]: '.');
121 g_string_append_printf (str
, "\n");
122 return g_string_free (str
, FALSE
);