Skip to content

Instantly share code, notes, and snippets.

@tom-tan
Last active August 4, 2022 07:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tom-tan/cca1648f2f9fa0fcae63c667de8b21e1 to your computer and use it in GitHub Desktop.
Save tom-tan/cca1648f2f9fa0fcae63c667de8b21e1 to your computer and use it in GitHub Desktop.
njs をD言語から使いたい
#include <njs_main.h>
/// 実際には use_njs.dpp として使う
// workaround
//
alias u_char = ubyte;
int main(string[] args)
{
import std : toStringz;
import core.stdc.stdlib : EXIT_SUCCESS, EXIT_FAILURE;
njs_vm_t* vm;
njs_int_t ret = NJS_OK;
njs_vm_opt_t vm_options;
njs_vm_opt_init(&vm_options);
enum Mode
{
command = "string",
shell = "shell",
}
auto mode = Mode.command;
vm_options.file.start = cast(u_char*)mode.toStringz;
vm_options.file.length = mode.length;
vm_options.init = 1;
vm_options.backtrace = 1;
vm_options.quiet = 0;
vm_options.sandbox = 1;
vm_options.unhandled_rejection = NJS_VM_OPT_UNHANDLED_REJECTION_IGNORE;
vm = njs_create_vm(&vm_options);
if (vm !is null) {
foreach (com; args[1..$])
{
ret = njs_process_script(vm, com);
}
njs_vm_destroy(vm);
}
return (ret == NJS_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}
njs_vm_t *
njs_create_vm(njs_vm_opt_t *vm_options)
{
import std : enforce;
return enforce(njs_vm_create(vm_options), "failed to create vm");
}
void
njs_output(njs_vm_t *vm, njs_int_t ret)
{
import std : enforce, writefln;
njs_str_t out_;
if (ret == NJS_OK) {
enforce(
njs_vm_retval_dump(vm, &out_, 1) == NJS_OK,
"Shell:failed to get retval from VM"
);
writefln!"evaled: `%s`"(out_.to!string);
} else {
njs_vm_retval_string(vm, &out_);
throw new Exception(out_.to!string);
}
}
auto to(T: string)(njs_str_t chars)
{
import std.conv : castFrom;
return castFrom!(u_char[]).to!string(chars.start[0..chars.length]);
}
njs_int_t
njs_process_script(njs_vm_t *vm, const string script_)
{
import std : enforce, toStringz;
auto script = script_.toStringz;
auto start = cast(u_char*)(script);
auto end = cast(u_char*)(script+script_.length);
njs_int_t ret;
ret = njs_vm_compile(vm, &start, end);
if (ret == NJS_OK) {
assert(start is end);
ret = njs_vm_start(vm);
}
njs_output(vm, ret);
return ret;
}
@tom-tan
Copy link
Author

tom-tan commented Aug 4, 2022

$ d++ -L-lnjs -L-lpcre2-8 --compiler=ldc2 --include-path=njs/src/ --include-path=njs/build/ --ignore-system-paths use_njs.dpp
$ ./use_njs "1+1" "2+4"
evaled: `2`
evaled: `6`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment