Try this great tool by denis korpel
https://dkorpel.github.io/ctod/
I've been using it every so often to port C stuff, it's been very
helpful
```D
@nogc nothrow:
extern(C): __gshared:
union JSCFunctionType {
JSCFunction* generic;
JSValue function(JSContext* ctx, JSValueConst this_val, int
argc, JSValueConst* argv, int magic) generic_magic;
JSCFunction* constructor;
JSValue function(JSContext* ctx, JSValueConst new_target, int
argc, JSValueConst* argv, int magic) constructor_magic;
JSCFunction* constructor_or_func;
double function(double) f_f;
double function(double, double) f_f_f;
JSValue function(JSContext* ctx, JSValueConst this_val)
getter;
JSValue function(JSContext* ctx, JSValueConst this_val,
JSValueConst val) setter;
JSValue function(JSContext* ctx, JSValueConst this_val, int
magic) getter_magic;
JSValue function(JSContext* ctx, JSValueConst this_val,
JSValueConst val, int magic) setter_magic;
JSValue function(JSContext* ctx, JSValueConst this_val, int
argc, JSValueConst* argv, int* pdone, int magic) iterator_next;
}
struct JSCFunctionListEntry {
const(char)* name;
ubyte prop_flags;
ubyte def_type;
short magic;
union _U {
struct _Func {
ubyte length; /* XXX: should move outside union */
ubyte cproto; /* XXX: should move outside union */
JSCFunctionType cfunc;
}_Func func;
struct _Getset {
JSCFunctionType get;
JSCFunctionType set;
}_Getset getset;
struct _Alias_ {
const(char)* name;
int base;
}_Alias_ alias_;
struct _Prop_list {
const(JSCFunctionListEntry)* tab;
int len;
}_Prop_list prop_list;
const(char)* str;
int i32;
long i64;
double f64;
}_U u;
}
enum string JS_CFUNC_DEF(string name, string length, string
func1) = `{ ` ~ name ~ `, JS_PROP_WRITABLE |
JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, .u = { .func = { ` ~
length ~ `, JS_CFUNC_generic, { .generic = ` ~ func1 ~ ` } `;
enum string JS_CFUNC_MAGIC_DEF(string name, string length, string
func1, string magic) = `{ ` ~ name ~ `, JS_PROP_WRITABLE |
JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, ` ~ magic ~ `, .u = { .func =
{ ` ~ length ~ `, JS_CFUNC_generic_magic, { .generic_magic = ` ~
func1 ~ ` } `;
enum string JS_CFUNC_SPECIAL_DEF(string name, string length,
string cproto, string func1) = `{ name, JS_PROP_WRITABLE |
JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, .u = { .func = { length,
JS_CFUNC_ ## cproto, { .cproto = func1 } } } }`;
enum string JS_ITERATOR_NEXT_DEF(string name, string length,
string func1, string magic) = `{ ` ~ name ~ `, JS_PROP_WRITABLE |
JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, ` ~ magic ~ `, .u = { .func =
{ ` ~ length ~ `, JS_CFUNC_iterator_next, { .iterator_next = ` ~
func1 ~ ` } `;
enum string JS_CGETSET_DEF(string name, string fgetter, string
fsetter) = `{ ` ~ name ~ `, JS_PROP_CONFIGURABLE, JS_DEF_CGETSET,
0, .u = { .getset = { .get = { .getter = ` ~ fgetter ~ ` }, .set
= { .setter = ` ~ fsetter ~ ` } `;
enum string JS_CGETSET_MAGIC_DEF(string name, string fgetter,
string fsetter, string magic) = `{ ` ~ name ~ `,
JS_PROP_CONFIGURABLE, JS_DEF_CGETSET_MAGIC, ` ~ magic ~ `, .u = {
.getset = { .get = { .getter_magic = ` ~ fgetter ~ ` }, .set = {
.setter_magic = ` ~ fsetter ~ ` } `;
private const(JSCFunctionListEntry)[20] js_std_funcs = [
mixin(JS_CFUNC_DEF!(`"exit"`, `1`, `js_std_exit` )),
mixin(JS_CFUNC_DEF!(`"gc"`, `0`, `js_std_gc` )),
mixin(JS_CFUNC_DEF!(`"evalScript"`, `1`, `js_evalScript` )),
mixin(JS_CFUNC_DEF!(`"loadScript"`, `1`, `js_loadScript` )),
mixin(JS_CFUNC_DEF!(`"getenv"`, `1`, `js_std_getenv` )),
mixin(JS_CFUNC_DEF!(`"setenv"`, `1`, `js_std_setenv` )),
mixin(JS_CFUNC_DEF!(`"unsetenv"`, `1`, `js_std_unsetenv` )),
mixin(JS_CFUNC_DEF!(`"getenviron"`, `1`, `js_std_getenviron`
)),
mixin(JS_CFUNC_DEF!(`"urlGet"`, `1`, `js_std_urlGet` )),
mixin(JS_CFUNC_DEF!(`"loadFile"`, `1`, `js_std_loadFile` )),
mixin(JS_CFUNC_DEF!(`"strerror"`, `1`, `js_std_strerror` )),
mixin(JS_CFUNC_DEF!(`"parseExtJSON"`, `1`,
`js_std_parseExtJSON` )),
/* FILE I/O */
mixin(JS_CFUNC_DEF!(`"open"`, `2`, `js_std_open` )),
mixin(JS_CFUNC_DEF!(`"popen"`, `2`, `js_std_popen` )),
mixin(JS_CFUNC_DEF!(`"fdopen"`, `2`, `js_std_fdopen` )),
mixin(JS_CFUNC_DEF!(`"tmpfile"`, `0`, `js_std_tmpfile` )),
mixin(JS_CFUNC_MAGIC_DEF!(`"puts"`, `1`, `js_std_file_puts`,
`0` )),
mixin(JS_CFUNC_DEF!(`"printf"`, `1`, `js_std_printf` )),
mixin(JS_CFUNC_DEF!(`"sprintf"`, `1`, `js_std_sprintf` )),
];
```