/nethervm

Standalone QuakeC VM (very WIP).

Primary LanguageCGNU General Public License v3.0GPL-3.0

nethervm

Standalone QuakeC VM.

/**
 * AllocCallback will be used in 3 different ways:
 * 
 * AllocCallback(vm, NULL, size, name) -> Allocate, should return pointer to new memory.
 * AllocCallback(vm, ptr, size, name) -> Reallocate, should reallocate memory at [ptr] and return pointer to new memory.
 * AllocCallback(vm, ptr, 0, name) -> Free memory at [ptr], should return NULL.
 * 
 * The 'vm' can be NULL for the first allocation, which allocates the NVM struct itself.
 */
typedef void*(*AllocCallback)(NVM* vm, void* ptr, size_t size, const char* name);

typedef void(*PrintCallback)(NVM* vm, const char* msg, bool debug);

typedef void(*ErrorCallback)(NVM* vm, const char* msg);

typedef void (*BuiltinFunction)(NVM* vm);

NVM* nvmCreateVM(AllocCallback acb, PrintCallback pcb, ErrorCallback ecb, void* user_data);

void nvmDestroyVM(NVM* vm);

void nvmAddExtBuiltin(NVM* qcvm, int num, const char* name, BuiltinFunction builtin);

void nvmLoadBuiltins(NVM* vm, BuiltinFunction* builtins, size_t num_builtins);

bool nvmLoadProgs(NVM* vm, const char* filename, const char* data, size_t size, bool fatal);

bool nvmAllocEdicts(NVM* vm, size_t count);

func_t nvmFindFunction(NVM* vm, const char* name);

global_t nvmFindGlobal(NVM* vm, const char* name);

field_t nvmFindField(NVM* vm, const char* name);

const char* nvmGetString(NVM* vm, int str_ofs);

void nvmExecuteFunction(NVM* vm, func_t func_ofs);