1 | /* Capstone Disassembly Engine */ |
2 | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */ |
3 | |
4 | #if defined(CAPSTONE_HAS_OSXKERNEL) |
5 | #include <libkern/libkern.h> |
6 | #else |
7 | #include <stdlib.h> |
8 | #endif |
9 | #include <string.h> |
10 | |
11 | #include "utils.h" |
12 | |
13 | // create a cache for fast id lookup |
14 | static unsigned short *make_id2insn(const insn_map *insns, unsigned int size) |
15 | { |
16 | // NOTE: assume that the max id is always put at the end of insns array |
17 | unsigned short max_id = insns[size - 1].id; |
18 | unsigned short i; |
19 | |
20 | unsigned short *cache = (unsigned short *)cs_mem_malloc(sizeof(*cache) * (max_id + 1)); |
21 | |
22 | for (i = 1; i < size; i++) |
23 | cache[insns[i].id] = i; |
24 | |
25 | 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 |
30 | unsigned short insn_find(const 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]; |
39 | } |
40 | |
41 | int name2id(const name_map* map, int max, const char *name) |
42 | { |
43 | int i; |
44 | |
45 | for (i = 0; i < max; i++) { |
46 | if (!strcmp(map[i].name, name)) { |
47 | return map[i].id; |
48 | } |
49 | } |
50 | |
51 | // nothing match |
52 | return -1; |
53 | } |
54 | |
55 | // count number of positive members in a list. |
56 | // NOTE: list must be guaranteed to end in 0 |
57 | unsigned int count_positive(const unsigned char *list) |
58 | { |
59 | unsigned int c; |
60 | |
61 | for (c = 0; list[c] > 0; c++); |
62 | |
63 | return c; |
64 | } |
65 | |
66 | char *cs_strdup(const char *str) |
67 | { |
68 | size_t len = strlen(str)+ 1; |
69 | void *new = cs_mem_malloc(len); |
70 | |
71 | if (new == NULL) |
72 | return NULL; |
73 | |
74 | return (char *)memmove(new, str, len); |
75 | } |
76 | |
77 | // we need this since Windows doesnt have snprintf() |
78 | int cs_snprintf(char *buffer, size_t size, const char *fmt, ...) |
79 | { |
80 | int ret; |
81 | |
82 | va_list ap; |
83 | va_start(ap, fmt); |
84 | ret = cs_vsnprintf(buffer, size, fmt, ap); |
85 | va_end(ap); |
86 | |
87 | return ret; |
88 | } |
89 | |