1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #if defined(CAPSTONE_HAS_OSXKERNEL)
5*9a0e4156SSadaf Ebrahimi #include <Availability.h>
6*9a0e4156SSadaf Ebrahimi #include <libkern/libkern.h>
7*9a0e4156SSadaf Ebrahimi #else
8*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
9*9a0e4156SSadaf Ebrahimi #endif
10*9a0e4156SSadaf Ebrahimi #include <string.h>
11*9a0e4156SSadaf Ebrahimi
12*9a0e4156SSadaf Ebrahimi #include "utils.h"
13*9a0e4156SSadaf Ebrahimi
14*9a0e4156SSadaf Ebrahimi // create a cache for fast id lookup
make_id2insn(const insn_map * insns,unsigned int size)15*9a0e4156SSadaf Ebrahimi static unsigned short *make_id2insn(const insn_map *insns, unsigned int size)
16*9a0e4156SSadaf Ebrahimi {
17*9a0e4156SSadaf Ebrahimi // NOTE: assume that the max id is always put at the end of insns array
18*9a0e4156SSadaf Ebrahimi unsigned short max_id = insns[size - 1].id;
19*9a0e4156SSadaf Ebrahimi unsigned short i;
20*9a0e4156SSadaf Ebrahimi
21*9a0e4156SSadaf Ebrahimi unsigned short *cache = (unsigned short *)cs_mem_calloc(max_id + 1, sizeof(*cache));
22*9a0e4156SSadaf Ebrahimi
23*9a0e4156SSadaf Ebrahimi for (i = 1; i < size; i++)
24*9a0e4156SSadaf Ebrahimi cache[insns[i].id] = i;
25*9a0e4156SSadaf Ebrahimi
26*9a0e4156SSadaf Ebrahimi return cache;
27*9a0e4156SSadaf Ebrahimi }
28*9a0e4156SSadaf Ebrahimi
29*9a0e4156SSadaf Ebrahimi // look for @id in @insns, given its size in @max. first time call will update @cache.
30*9a0e4156SSadaf Ebrahimi // return 0 if not found
insn_find(const insn_map * insns,unsigned int max,unsigned int id,unsigned short ** cache)31*9a0e4156SSadaf Ebrahimi unsigned short insn_find(const insn_map *insns, unsigned int max, unsigned int id, unsigned short **cache)
32*9a0e4156SSadaf Ebrahimi {
33*9a0e4156SSadaf Ebrahimi if (id > insns[max - 1].id)
34*9a0e4156SSadaf Ebrahimi return 0;
35*9a0e4156SSadaf Ebrahimi
36*9a0e4156SSadaf Ebrahimi if (*cache == NULL)
37*9a0e4156SSadaf Ebrahimi *cache = make_id2insn(insns, max);
38*9a0e4156SSadaf Ebrahimi
39*9a0e4156SSadaf Ebrahimi return (*cache)[id];
40*9a0e4156SSadaf Ebrahimi }
41*9a0e4156SSadaf Ebrahimi
name2id(const name_map * map,int max,const char * name)42*9a0e4156SSadaf Ebrahimi int name2id(const name_map* map, int max, const char *name)
43*9a0e4156SSadaf Ebrahimi {
44*9a0e4156SSadaf Ebrahimi int i;
45*9a0e4156SSadaf Ebrahimi
46*9a0e4156SSadaf Ebrahimi for (i = 0; i < max; i++) {
47*9a0e4156SSadaf Ebrahimi if (!strcmp(map[i].name, name)) {
48*9a0e4156SSadaf Ebrahimi return map[i].id;
49*9a0e4156SSadaf Ebrahimi }
50*9a0e4156SSadaf Ebrahimi }
51*9a0e4156SSadaf Ebrahimi
52*9a0e4156SSadaf Ebrahimi // nothing match
53*9a0e4156SSadaf Ebrahimi return -1;
54*9a0e4156SSadaf Ebrahimi }
55*9a0e4156SSadaf Ebrahimi
id2name(const name_map * map,int max,const unsigned int id)56*9a0e4156SSadaf Ebrahimi const char *id2name(const name_map* map, int max, const unsigned int id)
57*9a0e4156SSadaf Ebrahimi {
58*9a0e4156SSadaf Ebrahimi int i;
59*9a0e4156SSadaf Ebrahimi
60*9a0e4156SSadaf Ebrahimi for (i = 0; i < max; i++) {
61*9a0e4156SSadaf Ebrahimi if (map[i].id == id) {
62*9a0e4156SSadaf Ebrahimi return map[i].name;
63*9a0e4156SSadaf Ebrahimi }
64*9a0e4156SSadaf Ebrahimi }
65*9a0e4156SSadaf Ebrahimi
66*9a0e4156SSadaf Ebrahimi // nothing match
67*9a0e4156SSadaf Ebrahimi return NULL;
68*9a0e4156SSadaf Ebrahimi }
69*9a0e4156SSadaf Ebrahimi
70*9a0e4156SSadaf Ebrahimi // count number of positive members in a list.
71*9a0e4156SSadaf Ebrahimi // NOTE: list must be guaranteed to end in 0
count_positive(const uint16_t * list)72*9a0e4156SSadaf Ebrahimi unsigned int count_positive(const uint16_t *list)
73*9a0e4156SSadaf Ebrahimi {
74*9a0e4156SSadaf Ebrahimi unsigned int c;
75*9a0e4156SSadaf Ebrahimi
76*9a0e4156SSadaf Ebrahimi for (c = 0; list[c] > 0; c++);
77*9a0e4156SSadaf Ebrahimi
78*9a0e4156SSadaf Ebrahimi return c;
79*9a0e4156SSadaf Ebrahimi }
80*9a0e4156SSadaf Ebrahimi
81*9a0e4156SSadaf Ebrahimi // count number of positive members in a list.
82*9a0e4156SSadaf Ebrahimi // NOTE: list must be guaranteed to end in 0
count_positive8(const unsigned char * list)83*9a0e4156SSadaf Ebrahimi unsigned int count_positive8(const unsigned char *list)
84*9a0e4156SSadaf Ebrahimi {
85*9a0e4156SSadaf Ebrahimi unsigned int c;
86*9a0e4156SSadaf Ebrahimi
87*9a0e4156SSadaf Ebrahimi for (c = 0; list[c] > 0; c++);
88*9a0e4156SSadaf Ebrahimi
89*9a0e4156SSadaf Ebrahimi return c;
90*9a0e4156SSadaf Ebrahimi }
91*9a0e4156SSadaf Ebrahimi
cs_strdup(const char * str)92*9a0e4156SSadaf Ebrahimi char *cs_strdup(const char *str)
93*9a0e4156SSadaf Ebrahimi {
94*9a0e4156SSadaf Ebrahimi size_t len = strlen(str)+ 1;
95*9a0e4156SSadaf Ebrahimi void *new = cs_mem_malloc(len);
96*9a0e4156SSadaf Ebrahimi
97*9a0e4156SSadaf Ebrahimi if (new == NULL)
98*9a0e4156SSadaf Ebrahimi return NULL;
99*9a0e4156SSadaf Ebrahimi
100*9a0e4156SSadaf Ebrahimi return (char *)memmove(new, str, len);
101*9a0e4156SSadaf Ebrahimi }
102*9a0e4156SSadaf Ebrahimi
103*9a0e4156SSadaf Ebrahimi // we need this since Windows doesn't have snprintf()
cs_snprintf(char * buffer,size_t size,const char * fmt,...)104*9a0e4156SSadaf Ebrahimi int cs_snprintf(char *buffer, size_t size, const char *fmt, ...)
105*9a0e4156SSadaf Ebrahimi {
106*9a0e4156SSadaf Ebrahimi int ret;
107*9a0e4156SSadaf Ebrahimi
108*9a0e4156SSadaf Ebrahimi va_list ap;
109*9a0e4156SSadaf Ebrahimi va_start(ap, fmt);
110*9a0e4156SSadaf Ebrahimi ret = cs_vsnprintf(buffer, size, fmt, ap);
111*9a0e4156SSadaf Ebrahimi va_end(ap);
112*9a0e4156SSadaf Ebrahimi
113*9a0e4156SSadaf Ebrahimi return ret;
114*9a0e4156SSadaf Ebrahimi }
115*9a0e4156SSadaf Ebrahimi
arr_exist8(unsigned char * arr,unsigned char max,unsigned int id)116*9a0e4156SSadaf Ebrahimi bool arr_exist8(unsigned char *arr, unsigned char max, unsigned int id)
117*9a0e4156SSadaf Ebrahimi {
118*9a0e4156SSadaf Ebrahimi int i;
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi for (i = 0; i < max; i++) {
121*9a0e4156SSadaf Ebrahimi if (arr[i] == id)
122*9a0e4156SSadaf Ebrahimi return true;
123*9a0e4156SSadaf Ebrahimi }
124*9a0e4156SSadaf Ebrahimi
125*9a0e4156SSadaf Ebrahimi return false;
126*9a0e4156SSadaf Ebrahimi }
127*9a0e4156SSadaf Ebrahimi
arr_exist(uint16_t * arr,unsigned char max,unsigned int id)128*9a0e4156SSadaf Ebrahimi bool arr_exist(uint16_t *arr, unsigned char max, unsigned int id)
129*9a0e4156SSadaf Ebrahimi {
130*9a0e4156SSadaf Ebrahimi int i;
131*9a0e4156SSadaf Ebrahimi
132*9a0e4156SSadaf Ebrahimi for (i = 0; i < max; i++) {
133*9a0e4156SSadaf Ebrahimi if (arr[i] == id)
134*9a0e4156SSadaf Ebrahimi return true;
135*9a0e4156SSadaf Ebrahimi }
136*9a0e4156SSadaf Ebrahimi
137*9a0e4156SSadaf Ebrahimi return false;
138*9a0e4156SSadaf Ebrahimi }
139*9a0e4156SSadaf Ebrahimi
140