Last active
August 4, 2022 07:56
-
-
Save tom-tan/cca1648f2f9fa0fcae63c667de8b21e1 to your computer and use it in GitHub Desktop.
njs をD言語から使いたい
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Author
tom-tan
commented
Aug 4, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment