#include "master.hpp"

namespace factor
{

/* Fill in a PPC function descriptor */
void *fill_function_descriptor(void *ptr, void *code)
{
	void **descriptor = (void **)ptr;
	descriptor[0] = code;
	descriptor[1] = NULL;
	descriptor[2] = NULL;
	return descriptor;
}

/* Get a field from a PPC function descriptor */
void *function_descriptor_field(void *ptr, size_t idx)
{
	return ptr ? ((void **) ptr)[idx] : ptr;
}

/* If memory allocation fails, bail out */
vm_char *safe_strdup(const vm_char *str)
{
	vm_char *ptr = STRDUP(str);
	if(!ptr) fatal_error("Out of memory in safe_strdup", 0);
	return ptr;
}

cell read_cell_hex()
{
	cell cell;
	std::cin >> std::hex >> cell >> std::dec;
	if(!std::cin.good()) exit(1);
	return cell;
}

/* On Windows, memcpy() is in a different DLL and the non-optimizing
compiler can't find it */
VM_C_API void *factor_memcpy(void *dst, void *src, size_t len)
{
	return memcpy(dst,src,len);
}

}