text: /* Capstone Disassembly Engine */
  /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
  
  #if defined(CAPSTONE_HAS_OSXKERNEL)
  #include <Availability.h>
  #include <libkern/libkern.h>
  #else
  #include <stdlib.h>
  #endif
  #include <string.h>
  
  #include "utils.h"
  
  // create a cache for fast id lookup
  static unsigned short *make_id2insn(insn_map *insns, unsigned int size)
  {
  	// NOTE: assume that the max id is always put at the end of insns array
  	unsigned short max_id = insns[size - 1].id;
  	unsigned short i;
  
  	unsigned short *cache = (unsigned short *)cs_mem_calloc(max_id + 1, sizeof(*cache));
  
  	for (i = 1; i < size; i++)
  		cache[insns[i].id] = i;
  
  	return cache;
  }
  
  // look for @id in @insns, given its size in @max. first time call will update @cache.
  // return 0 if not found
  unsigned short insn_find(insn_map *insns, unsigned int max, unsigned int id, unsigned short **cache)
  {
  	if (id > insns[max - 1].id)
  		return 0;
  
  	if (*cache == NULL)
  		*cache = make_id2insn(insns, max);
  
  	return (*cache)[id];
  }
  
  int name2id(name_map* map, int max, const char *name)
  {
  	int i;
  
  	for (i = 0; i < max; i++) {
  		if (!strcmp(map[i].name, name)) {
  			return map[i].id;
  		}
  	}
  
  	// nothing match
  	return -1;
  }
  
  char *id2name(name_map* map, int max, const unsigned int id)
  {
  	int i;
  
  	for (i = 0; i < max; i++) {
  		if (map[i].id == id) {
  			return map[i].name;
  		}
  	}
  
  	// nothing match
  	return NULL;
  }
  
  // count number of positive members in a list.
  // NOTE: list must be guaranteed to end in 0
  unsigned int count_positive(uint16_t *list)
  {
  	unsigned int c;
  
  	for (c = 0; list[c] > 0; c++);
  
  	return c;
  }
  
  // count number of positive members in a list.
  // NOTE: list must be guaranteed to end in 0
  unsigned int count_positive8(unsigned char *list)
  {
  	unsigned int c;
  
  	for (c = 0; list[c] > 0; c++);
  
  	return c;
  }
  
  char *cs_strdup(const char *str)
  {
  	size_t len = strlen(str)+ 1;
  	void *new = cs_mem_malloc(len);
  
  	if (new == NULL)
  		return NULL;
  
  	return (char *)memmove(new, str, len);
  }
  
  // we need this since Windows doesnt have snprintf()
  int cs_snprintf(char *buffer, size_t size, const char *fmt, ...)
  {
  	int ret;
  
  	va_list ap;
  	va_start(ap, fmt);
  	ret = cs_vsnprintf(buffer, size, fmt, ap);
  	va_end(ap);
  
  	return ret;
  }
  
  bool arr_exist8(unsigned char *arr, unsigned char max, unsigned int id)
  {
  	int i;
  
  	for (i = 0; i < max; i++) {
  		if (arr[i] == id)
  			return true;
  	}
  
  	return false;
  }
  
  bool arr_exist(uint16_t *arr, unsigned char max, unsigned int id)
  {
  	int i;
  
  	for (i = 0; i < max; i++) {
  		if (arr[i] == id)
  			return true;
  	}
  
  	return false;
  }
  
  