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
14static 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
30unsigned 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
41int 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
57unsigned 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
66char *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()
78int 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