1 /* Capstone Disassembly Engine */ 2 /* By Nguyen Anh Quynh <aquynh (at) 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(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(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(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(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