static PyObject* evaluate_snippet(PyObject* self, PyObject* args, PyObject *keywds) { const char *filename, *src; char *out; unsigned max_stack = 500, gc_min_objects = 1000, max_trace = 20; double gc_growth_trigger = 2; int debug_ast = 0, error; PyObject *ext_vars = NULL; struct jsonlangVm *vm; static char *kwlist[] = {"filename", "src", "max_stack", "gc_min_objects", "gc_growth_trigger", "ext_vars", "debug_ast", "max_trace", NULL}; (void) self; if (!PyArg_ParseTupleAndKeywords(args, keywds, "ss|IIdOiI", kwlist, &filename, &src, &max_stack, &gc_min_objects, &gc_growth_trigger, &ext_vars, &debug_ast, &max_trace)) { return NULL; } vm = jsonlang_make(); jsonlang_max_stack(vm, max_stack); jsonlang_gc_min_objects(vm, gc_min_objects); jsonlang_max_trace(vm, max_trace); jsonlang_gc_growth_trigger(vm, gc_growth_trigger); jsonlang_debug_ast(vm, debug_ast); if (ext_vars != NULL) { PyObject *key, *val; Py_ssize_t pos = 0; while (PyDict_Next(ext_vars, &pos, &key, &val)) { const char *key_ = PyString_AsString(key); if (key_ == NULL) { jsonlang_destroy(vm); return NULL; } const char *val_ = PyString_AsString(val); if (val_ == NULL) { jsonlang_destroy(vm); return NULL; } jsonlang_ext_var(vm, key_, val_); } } out = jsonlang_evaluate_snippet(vm, filename, src, &error); if (error) { PyErr_SetString(PyExc_RuntimeError, out); jsonlang_realloc(vm, out, 0); jsonlang_destroy(vm); return NULL; } else { PyObject *ret = PyString_FromString(out); jsonlang_realloc(vm, out, 0); jsonlang_destroy(vm); return ret; } }
static PyObject *handle_result(struct JsonlangVm *vm, char *out, int error) { if (error) { PyErr_SetString(PyExc_RuntimeError, out); jsonlang_realloc(vm, out, 0); jsonlang_destroy(vm); return NULL; } else { PyObject *ret = PyString_FromString(out); jsonlang_realloc(vm, out, 0); jsonlang_destroy(vm); return ret; } }
static char *default_import_callback(void *ctx, const char *dir, const char *file, char **found_here_cptr, int *success) { auto *vm = static_cast<JsonlangVm*>(ctx); std::string input, found_here, err_msg; ImportStatus status = try_path(dir, file, input, found_here, err_msg); std::vector<std::string> jpaths(vm->jpaths); // If not found, try library search path. while (status == IMPORT_STATUS_FILE_NOT_FOUND) { if (jpaths.size() == 0) { *success = 0; const char *err = "No match locally or in the Jsonlang library paths."; char *r = jsonlang_realloc(vm, nullptr, std::strlen(err) + 1); std::strcpy(r, err); return r; } status = try_path(jpaths.back(), file, input, found_here, err_msg); jpaths.pop_back(); } if (status == IMPORT_STATUS_IO_ERROR) { *success = 0; return from_string(vm, err_msg); } else { assert(status == IMPORT_STATUS_OK); *success = 1; *found_here_cptr = from_string(vm, found_here); return from_string(vm, input); } }
static char *from_string(JsonlangVm* vm, const std::string &v) { char *r = jsonlang_realloc(vm, nullptr, v.length() + 1); std::strcpy(r, v.c_str()); return r; }
static char *jsonlang_str(struct JsonlangVm *vm, const char *str) { char *out = jsonlang_realloc(vm, NULL, strlen(str) + 1); memcpy(out, str, strlen(str) + 1); return out; }