// examples/embed.c -- add scripting to a C program with calog, in ~30 lines. // // The entire embedding surface is calog.h: create a runtime, register a native C // function the host provides, create a script context on an engine that exposes it, // and run a script that calls back into the host. Swap calogJsEngine for // calogLuaEngine / calogSquirrelEngine to change languages -- nothing else changes. #include "calog.h" #include // A host-provided native, callable from any embedded engine: hostLog(message). static int32_t hostLog(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { (void)userData; calogValueNil(result); if (argCount != 1 || args[0].type != calogStringE) { return calogFail(result, calogErrArgE, "hostLog expects one string"); } printf("[host] %s\n", args[0].as.s.bytes); return calogOkE; } int main(void) { CalogT *calog; CalogContextT *ctx; CalogValueT result; const char *expose[] = { "hostLog" }; CalogConfigT config = { expose, 1 }; calog = calogCreate(); calogRegister(calog, "hostLog", hostLog, NULL, 0); calogContextCreate(calog, &calogJsEngine, &config, &ctx); calogContextStart(ctx); calogContextEval(ctx, "hostLog('hello from JavaScript, ' + (6 * 7))", &result); calogValueFree(&result); calogContextDestroy(ctx); calogDestroy(calog); return 0; }