blob: ca2a7ecf47bb3db550d3b4eb7828a7b48e321900 [file] [log] [blame]
Nguyen Anh Quynh6023ef72014-04-29 11:21:04 +08001/* Capstone Disassembly Engine */
Nguyen Anh Quynhbfcaba52015-03-04 17:45:23 +08002/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08003
reverser160e1982015-04-09 18:28:19 +01004#if defined(CAPSTONE_HAS_OSXKERNEL)
5#include <libkern/libkern.h>
6#else
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +08007#include <stdlib.h>
reverser160e1982015-04-09 18:28:19 +01008#endif
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08009#include <string.h>
10
11#include "utils.h"
12
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080013// create a cache for fast id lookup
14static unsigned short *make_id2insn(insn_map *insns, unsigned int size)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080015{
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080016 // NOTE: assume that the max id is always put at the end of insns array
17 unsigned short max_id = insns[size - 1].id;
Alex Ionescu46018db2014-01-22 09:45:00 -080018 unsigned short i;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080019
Nguyen Anh Quynhaaddb252014-06-17 13:32:37 +080020 unsigned short *cache = (unsigned short *)cs_mem_malloc(sizeof(*cache) * (max_id + 1));
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080021
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080022 for (i = 1; i < size; i++)
23 cache[insns[i].id] = i;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080024
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080025 return cache;
26}
27
28// look for @id in @insns, given its size in @max. first time call will update @cache.
29// return 0 if not found
30unsigned short insn_find(insn_map *insns, unsigned int max, unsigned int id, unsigned short **cache)
31{
32 if (id > insns[max - 1].id)
33 return 0;
34
35 if (*cache == NULL)
36 *cache = make_id2insn(insns, max);
37
38 return (*cache)[id];
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080039}
40
pancakef0e4eed2013-12-11 22:14:42 +010041int name2id(name_map* map, int max, const char *name)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080042{
43 int i;
44
45 for (i = 0; i < max; i++) {
Nguyen Anh Quynh19146e92014-05-28 12:41:31 +080046 if (!strcmp(map[i].name, name)) {
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080047 return map[i].id;
48 }
49 }
50
51 // nothing match
52 return -1;
53}
54
Nguyen Anh Quynh1182d252015-04-27 12:13:34 +080055char *id2name(name_map* map, int max, const unsigned int id)
56{
57 int i;
58
59 for (i = 0; i < max; i++) {
60 if (map[i].id == id) {
61 return map[i].name;
62 }
63 }
64
65 // nothing match
66 return NULL;
67}
68
Nguyen Anh Quynhf35e2ad2013-12-03 11:10:26 +080069// count number of positive members in a list.
70// NOTE: list must be guaranteed to end in 0
Nguyen Anh Quynhefffe782015-03-25 15:02:13 +080071unsigned int count_positive(uint16_t *list)
72{
73 unsigned int c;
74
75 for (c = 0; list[c] > 0; c++);
76
77 return c;
78}
79
80// count number of positive members in a list.
81// NOTE: list must be guaranteed to end in 0
82unsigned int count_positive8(unsigned char *list)
Nguyen Anh Quynhf35e2ad2013-12-03 11:10:26 +080083{
84 unsigned int c;
85
86 for (c = 0; list[c] > 0; c++);
87
88 return c;
89}
Nguyen Anh Quynha9ffb442014-01-15 18:27:01 +080090
91char *cs_strdup(const char *str)
92{
93 size_t len = strlen(str)+ 1;
94 void *new = cs_mem_malloc(len);
95
96 if (new == NULL)
97 return NULL;
98
99 return (char *)memmove(new, str, len);
100}
Nguyen Anh Quynh4b6b15f2014-08-26 15:57:04 +0800101
102// we need this since Windows doesnt have snprintf()
103int cs_snprintf(char *buffer, size_t size, const char *fmt, ...)
104{
105 int ret;
106
107 va_list ap;
108 va_start(ap, fmt);
109 ret = cs_vsnprintf(buffer, size, fmt, ap);
110 va_end(ap);
111
112 return ret;
113}
Nguyen Anh Quynh58eb0732015-04-02 15:18:33 +0800114
115bool arr_exist8(unsigned char *arr, unsigned char max, unsigned int id)
116{
117 int i;
118
119 for (i = 0; i < max; i++) {
120 if (arr[i] == id)
121 return true;
122 }
123
124 return false;
125}
126
127bool arr_exist(uint16_t *arr, unsigned char max, unsigned int id)
128{
129 int i;
130
131 for (i = 0; i < max; i++) {
132 if (arr[i] == id)
133 return true;
134 }
135
136 return false;
137}
138