#include #include #include #include #include #include "defs.h" #include "fns.h" #include "types.h" #include "nls.h" static void * default_alloc(void *aux, size_t size) { return malloc(size); } static void default_free(void *aux, void *p) { free(p); } static void default_debug(void *aux, char *msg) { printf("DEBUG: %s\n", msg); } static void default_fatal(void *aux, char *msg) { printf("FATAL: %s\n", msg); exit(EXIT_FAILURE); } void aplwc_boot(void) { init_nls(); } void aplwc_init_fns(APLWCFunctions *fns) { fns->alloc = default_alloc; fns->free = default_free; fns->debug = default_debug; fns->fatal = default_fatal; } APLWC * aplwc_init(APLWCFunctions *fns, void *aux) { size_t size = sizeof(APLWC) + (APLWC_ALIGNMENT - 1) + WS_START_SIZE + (WS_ALIGNMENT - 1); intptr_t base = (intptr_t)fns->alloc(aux, size); intptr_t aligned; aligned = base; if((aligned % APLWC_ALIGNMENT) != 0) aligned += APLWC_ALIGNMENT - (aligned % APLWC_ALIGNMENT); APLWC *aplwc = (APLWC *)aligned; aplwc->base = (void*)base; aplwc->fns = fns; aplwc->aux = aux; aligned += sizeof(APLWC); if((aligned % WS_ALIGNMENT) != 0) aligned += WS_ALIGNMENT - (aligned % WS_ALIGNMENT); aplwc->ws = (void*)aligned; aplwc->ws_size = size - (aligned - base); DEBUG(_("initialized")); return aplwc; } void aplwc_exit(APLWC *aplwc) { DEBUG(_("exiting")); CALLFN(free, aplwc->base); }