コード例 #1
0
ファイル: _jsonlang.c プロジェクト: iqstack/jsonlang
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;
    }
}
コード例 #2
0
ファイル: _jsonlang.c プロジェクト: hanscj1/jsonlang
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;
    }
}
コード例 #3
0
ファイル: libjsonlang.cpp プロジェクト: hanscj1/jsonlang
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);
    }
}
コード例 #4
0
ファイル: libjsonlang.cpp プロジェクト: hanscj1/jsonlang
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;
}
コード例 #5
0
ファイル: _jsonlang.c プロジェクト: hanscj1/jsonlang
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;
}