added most of the ncurses library
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 26 Apr 2022 18:41:29 +0000 (13:41 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 26 Apr 2022 18:41:29 +0000 (13:41 -0500)
core/type_info/helper.onyx
modules/ncurses/build.sh [new file with mode: 0755]
modules/ncurses/module.onyx [new file with mode: 0644]
modules/ncurses/ncurses.c [new file with mode: 0644]
modules/ncurses/onyx_ncurses.so [new file with mode: 0755]
scripts/c_binding.onyx [new file with mode: 0644]

index 8c9c9ac818d85142aa6d22286ad43ade3e689a93..47a3ac89c66ccb1055385e2f6ca263bd88dea2b9 100644 (file)
@@ -125,6 +125,12 @@ write_type_name :: (writer: ^io.Writer, t: type_expr) {
     }
 }
 
+is_pointer :: (t: type_expr) -> bool {
+    if t == rawptr do return true;
+    info := get_type_info(t);
+    return info.kind == .Pointer;
+}
+
 size_of :: (t: type_expr) -> u32 {
     info := get_type_info(t);
     if info == null do return 0;
@@ -318,4 +324,4 @@ for_all_types :: macro (body: Code) {
 
         #unquote body;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/ncurses/build.sh b/modules/ncurses/build.sh
new file mode 100755 (executable)
index 0000000..caff9ee
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+onyx run scripts/c_binding.onyx modules/ncurses/module.onyx > modules/ncurses/ncurses.c
+gcc -shared -fPIC -I include -I lib/common/include -O2 modules/ncurses/ncurses.c -o modules/ncurses/onyx_ncurses.so -lncurses
diff --git a/modules/ncurses/module.onyx b/modules/ncurses/module.onyx
new file mode 100644 (file)
index 0000000..d77c728
--- /dev/null
@@ -0,0 +1,352 @@
+package ncurses
+
+use package core {cptr, conv, string}
+
+
+WINDOW :: #distinct u64
+SCREEN :: #distinct u64
+
+chtype :: u32
+
+attr_t :: u32
+A_NORMAL :: 0
+A_ATTRIBUTES :: 0xffffff00
+A_CHARTEXT   :: 0xff
+A_COLOR      :: 0xff00
+A_STANDOUT   :: 0x00010000
+A_UNDERLINE  :: 0x00020000
+A_REVERSE    :: 0x00040000
+A_BLINK      :: 0x00080000
+A_DIM        :: 0x00100000
+A_BOLD       :: 0x00200000
+A_ALTCHARSET :: 0x00400000
+A_INVIS      :: 0x00800000
+A_PROTECT    :: 0x01000000
+A_HORIZONTAL :: 0x02000000
+A_LEFT       :: 0x04000000
+A_LOW        :: 0x08000000
+A_RIGHT      :: 0x10000000
+A_TOP        :: 0x20000000
+A_VERTICAL   :: 0x40000000
+A_ITALIC     :: 0x80000000
+
+#library "onyx_ncurses"
+#foreign "onyx_ncurses" {
+
+/*
+use CBindings
+CBindings :: struct {
+    name :: "onyx_ncurses"
+    file_prefix :: """
+#include "ncurses.h"
+
+WINDOW *__get_stdscr() {
+    return stdscr;
+}
+
+void __get_yx    (WINDOW *w, int *y, int *x) { getyx(w, *y, *x); }
+void __get_par_yx(WINDOW *w, int *y, int *x) { getparyx(w, *y, *x); }
+void __get_beg_yx(WINDOW *w, int *y, int *x) { getbegyx(w, *y, *x); }
+void __get_max_yx(WINDOW *w, int *y, int *x) { getmaxyx(w, *y, *x); }
+
+chtype __ACS_LOOKUP(int a) { return NCURSES_ACS(a); }
+
+"""
+    cast_map :: (#type struct {type: type_expr; name: str;}).[
+        .{ WINDOW, "WINDOW *" },
+    ]
+*/
+
+    // initscr
+    initscr   :: () -> WINDOW ---
+    endwin    :: () -> i32    ---
+    isendwin  :: () -> bool   ---
+    newterm   :: (type: cstr, out_fd, in_fd: ^u32) -> SCREEN ---
+    set_term  :: (new: SCREEN) -> SCREEN ---
+    delscreen :: (sp: SCREEN) -> void ---
+
+    // color
+    start_color :: () -> i32 ---
+    has_colors  :: () -> bool ---
+    can_change_color :: () -> bool ---
+    init_pair  :: (pair: i32, foreground: i32, background: i32) -> i32 ---
+    init_color :: (color: i32, r, g, b: i32) -> i32 ---
+    color_content :: (color: i32, r, g, b: ^i32) -> i32 ---
+    pair_content  :: (pair: i32, f, b: ^i32) -> i32 ---
+    reset_color_pairs :: () -> void ---
+    COLOR_PAIR :: (color: i32) -> i32 ---
+    PAIR_NUMBER :: (pair: i32) -> i32 ---
+
+    // inopts
+    cbreak :: () -> i32 ---
+    nocbreak :: () -> i32 ---
+    echo :: () -> i32 ---
+    noecho :: () -> i32 ---
+    intrflush :: (w: WINDOW, bf: bool) -> i32 ---
+    keypad :: (w: WINDOW, bf: bool) -> i32 ---
+    meta :: (w: WINDOW, bf: bool) -> i32 ---
+    nodelay :: (w: WINDOW, bf: bool) -> i32 ---
+    notimeout :: (w: WINDOW, bf: bool) -> i32 ---
+    nl :: () -> i32 ---
+    nonl :: () -> i32 ---
+    raw :: () -> i32 ---
+    noraw :: () -> i32 ---
+    qiflush :: () -> void ---
+    noqiflush :: () -> void ---
+    halfdelay :: (tenths: i32) -> i32 ---
+    timeout :: (delay: i32) -> void ---
+    wtimeout :: (w: WINDOW, delay: i32) -> void ---
+    typeahead :: (fd: i32) -> i32 ---
+
+    // outopts
+    clearkok :: (w: WINDOW, bf: bool) -> i32 ---
+    idlok :: (w: WINDOW, bf: bool) -> i32 ---
+    idcok :: (w: WINDOW, bf: bool) -> void ---
+    immedok :: (w: WINDOW, bf: bool) -> void ---
+    leaveok :: (w: WINDOW, bf: bool) -> i32 ---
+    scrollok :: (w: WINDOW, bf: bool) -> i32 ---
+    setscrreg :: (top, bot: i32) -> i32 ---
+    wsetscrreg :: (w: WINDOW, top, bot: i32) -> i32 ---
+
+    // attr
+    attr_get  :: (attr: ^attr_t, pair: ^u16, opts: ^void) -> i32 ---
+    wattr_get :: (w: WINDOW, attr: ^attr_t, pair: ^u16, opts: ^void) -> i32 ---
+    attr_set  :: (attr: ^attr_t, pair: u16, opts: ^void) -> i32 ---
+    wattr_set :: (w: WINDOW, attr: attr_t, pair: u16, opts: ^void) -> i32 ---
+    attr_off  :: (attr: attr_t, opts: ^void) -> i32 ---
+    wattr_off :: (w: WINDOW, attr: attr_t, opts: ^void) -> i32 ---
+    attr_on   :: (attr: attr_t, opts: ^void) -> i32 ---
+    wattr_on  :: (w: WINDOW, attr: attr_t, opts: ^void) -> i32 ---
+    attroff   :: (attr: attr_t) -> i32 ---
+    wattroff  :: (w: WINDOW, attr: attr_t) -> i32 ---
+    attron    :: (attr: attr_t) -> i32 ---
+    wattron   :: (w: WINDOW, attr: attr_t) -> i32 ---
+    attrset   :: (attr: attr_t) -> i32 ---
+    wattrset  :: (w: WINDOW, attr: attr_t) -> i32 ---
+    chgat     :: (n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 ---
+    wchgat    :: (w: WINDOW, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 ---
+    mvchgat   :: (y, x: i32, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 ---
+    mvmchgat  :: (w: WINDOW, y, x: i32, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 ---
+    color_set  :: (pair: u16, opts: ^void) -> i32 ---
+    wcolor_set :: (w: WINDOW, pair: u16, opts: ^void) -> i32 ---
+    standend  :: () -> i32 ---
+    wstandend :: (w: WINDOW) -> i32 ---
+    standout  :: () -> i32 ---
+    wstandout :: (w: WINDOW) -> i32 ---
+
+    // util
+    unctrl     :: (c: chtype) -> cptr(u8) ---
+    // wunctrl   :: (c: ^u8) -> cptr(u8) ---
+    keyname    :: (c: i32) -> cptr(u8) ---
+    key_name   :: (w: i32) -> cptr(u8) ---
+    filter     :: () -> void ---
+    nofilter   :: () -> void ---
+    use_env    :: (f: bool) -> void ---
+    use_tioctl :: (f: bool) -> void ---
+    // putwin     :: (w: WINDOW, filep: u32) -> i32 ---
+    getwin     :: (filep: u32) -> WINDOW ---
+    delay_output :: (ms: i32) -> i32 ---
+    flushinp   :: () -> i32 ---
+
+    // kernel
+    def_prog_mode :: () -> i32 ---
+    def_shell_mode :: () -> i32 ---
+    reset_prog_mode :: () -> i32 ---
+    reset_shell_mode :: () -> i32 ---
+    resetty :: () -> i32 ---
+    savetty :: () -> i32 ---
+    getsyx  :: (y, x: i32) -> void ---
+    setsyx  :: (y, x: i32) -> void ---
+    // ripoffline :: (line: i32, init: (WINDOW, i32) -> i32) -> i32 ---
+    curs_set :: (visibility: i32) -> i32 ---
+    napms :: (ms: i32) -> i32 ---
+
+    // refresh
+    refresh :: () -> i32 ---
+    wrefresh :: (w: WINDOW) -> i32 ---
+    wnoutrefresh :: (w: WINDOW) -> i32 ---
+    doupdate :: () -> i32 ---
+    redrawwin :: (w: WINDOW) -> i32 ---
+    wredrawln :: (w: WINDOW, beg_line, num_lines: i32) -> i32 ---
+
+    // addch
+    addch :: (ch: chtype) -> i32 ---
+    waddch :: (w: WINDOW, ch: chtype) -> i32 ---
+    mvaddch :: (y, x: i32, ch: chtype) -> i32 ---
+    mvwaddch :: (w: WINDOW, y, x: i32, ch: chtype) -> i32 ---
+    echochar :: (ch: chtype) -> i32 ---
+    wechochar :: (w: WINDOW, ch: chtype) -> i32 ---
+
+    // addchstr
+    addchstr :: (chstr: ^chtype) -> i32 ---
+    addchnstr :: (chstr: [] chtype) -> i32 ---
+    waddchstr :: (w: WINDOW, chstr: ^chtype) -> i32 ---
+    waddchnstr :: (w: WINDOW, chstr: [] chtype) -> i32 ---
+    mvaddchstr :: (y, x: i32, chstr: ^chtype) -> i32 ---
+    mvaddchnstr :: (y, x: i32, chstr: [] chtype) -> i32 ---
+    mvwaddchstr :: (w: WINDOW, y, x: i32, chstr: ^chtype) -> i32 ---
+    mvwaddchnstr :: (w: WINDOW, y, x: i32, chstr: [] chtype) -> i32 ---
+
+    // addstr
+    addstr :: (chstr: cstr) -> i32 ---
+    addnstr :: (chstr: str) -> i32 ---
+    waddstr :: (w: WINDOW, chstr: cstr) -> i32 ---
+    waddnstr :: (w: WINDOW, chstr: str) -> i32 ---
+    mvaddstr :: (y, x: i32, chstr: cstr) -> i32 ---
+    mvaddnstr :: (y, x: i32, chstr: str) -> i32 ---
+    mvwaddstr :: (w: WINDOW, y, x: i32, chstr: cstr) -> i32 ---
+    mvwaddnstr :: (w: WINDOW, y, x: i32, chstr: str) -> i32 ---
+
+    // clear
+    erase :: () -> i32 ---
+    werase :: (w: WINDOW) -> i32 ---
+    clear :: () -> i32 ---
+    wclear :: (w: WINDOW) -> i32 ---
+    clrtobot :: () -> i32 ---
+    wclrtobot :: (w: WINDOW) -> i32 ---
+    clrtoeol :: () -> i32 ---
+    wclrtoeol :: (w: WINDOW) -> i32 ---
+
+    // opaque
+    is_cleared :: (w: WINDOW) -> bool ---
+    is_idcok :: (w: WINDOW) -> bool ---
+    is_idlok :: (w: WINDOW) -> bool ---
+    is_immedok :: (w: WINDOW) -> bool ---
+    is_keypad :: (w: WINDOW) -> bool ---
+    is_leaveok :: (w: WINDOW) -> bool ---
+    is_nodelay :: (w: WINDOW) -> bool ---
+    is_notimeout :: (w: WINDOW) -> bool ---
+    is_pad :: (w: WINDOW) -> bool ---
+    is_scrollok :: (w: WINDOW) -> bool ---
+    is_subwin :: (w: WINDOW) -> bool ---
+    is_syncok :: (w: WINDOW) -> bool ---
+    wgetparent :: (w: WINDOW) -> WINDOW ---
+    wgetdelay  :: (w: WINDOW) -> i32 ---
+    @TODO // Why doesn't this one work?
+    // wgetscrreg :: (w: WINDOW, top, bottom: ^i32) -> void ---
+
+    // window
+    newwin :: (nlines, ncols, y, x: i32) -> WINDOW ---
+    delwin :: (w: WINDOW) -> i32 ---
+    mvwin  :: (w: WINDOW, y, x: i32) -> i32 ---
+    subwin :: (w: WINDOW, nlines, ncols, y, x: i32) -> WINDOW ---
+    derwin :: (w: WINDOW, nlines, ncols, y, x: i32) -> WINDOW ---
+    mvderwin :: (w: WINDOW, parent_y, parent_x: i32) -> i32 ---
+    dupwin :: (w: WINDOW) -> WINDOW ---
+    wsyncup :: (w: WINDOW) -> void ---
+    syncok :: (w: WINDOW, bf: bool) -> i32 ---
+    wcursyncup :: (w: WINDOW) -> void ---
+    wsyncdown :: (w: WINDOW) -> void ---
+
+    // touch
+    touchline :: (w: WINDOW, start, count: i32) -> i32 ---
+    touchwin  :: (w: WINDOW) -> i32 ---
+    wtouchln  :: (w: WINDOW, y, b, changed: i32) -> i32 ---
+    untouchwin :: (w: WINDOW) -> i32 ---
+    is_linetouched :: (w: WINDOW, line: i32) -> bool ---
+    is_wintouched :: (w: WINDOW) -> bool ---
+
+    // bkgd
+    bkgdset :: (ch: chtype) -> void ---
+    wbkgdset :: (w: WINDOW, ch: chtype) -> void ---
+    bkgd :: (bh: chtype) -> i32 ---
+    wbkgd :: (w: WINDOW, ch: chtype) -> i32 ---
+    getbkgd :: (w: WINDOW) -> chtype ---
+
+    // inch
+    inch :: () -> chtype ---
+    winch :: (w: WINDOW) -> chtype ---
+    mvinch :: (y, x: i32) -> chtype ---
+    mvwinch :: (w: WINDOW, y, x: i32) -> chtype ---
+
+    // getch
+    getch :: () -> i32 ---
+    wgetch :: (w: WINDOW) -> i32 ---
+    mvgetch :: (y, x: i32) -> i32 ---
+    mvwgetch :: (y, x: i32, w: WINDOW) -> i32 ---
+    ungetch :: (ch: i32) -> i32 ---
+    has_key :: (ch: i32) -> i32 ---
+
+    // getyx
+    __get_yx     :: (w: WINDOW, y, x: ^i32) -> void ---
+    __get_par_yx :: (w: WINDOW, y, x: ^i32) -> void --- 
+    __get_beg_yx :: (w: WINDOW, y, x: ^i32) -> void --- 
+    __get_max_yx :: (w: WINDOW, y, x: ^i32) -> void --- 
+
+    // getstr
+    // The API for these is horrible for use in Onyx.
+    // Use ogetstr and family for a better API.
+    getstr   :: (s: cstr) -> i32 ---  // Wildly unsafe!
+    getnstr  :: (s: str) -> i32 ---
+    wgetstr  :: (w: WINDOW, s: cstr) -> i32 ---
+    wgetnstr :: (w: WINDOW, s: str) -> i32 ---
+    mvgetstr   :: (y, x: i32, s: cstr) -> i32 ---  // Wildly unsafe!
+    mvgetnstr  :: (y, x: i32, s: str) -> i32 ---
+    mvwgetstr  :: (w: WINDOW, y, x: i32, s: cstr) -> i32 ---
+    mvwgetnstr :: (w: WINDOW, y, x: i32, s: str) -> i32 ---
+
+    // border
+    border :: (ls, rs, ts, bs, tl, tr, bl, br: chtype) -> i32 ---
+    wborder :: (w: WINDOW, ls, rs, ts, bs, tl, tr, bl, br: chtype) -> i32 ---
+    box :: (w: WINDOW, verch, horch: chtype) -> i32 ---
+    hline  :: (ch: chtype, n: i32) -> i32 ---
+    whline :: (w: WINDOW, ch: chtype, n: i32) -> i32 ---
+    vline  :: (ch: chtype, n: i32) -> i32 ---
+    wvline :: (w: WINDOW, ch: chtype, n: i32) -> i32 ---
+    mvhline  :: (y, x: i32, ch: chtype, n: i32) -> i32 ---
+    mvwhline :: (w: WINDOW, y, x: i32, ch: chtype, n: i32) -> i32 ---
+    mvvline  :: (y, x: i32, ch: chtype, n: i32) -> i32 ---
+    mvwvline :: (w: WINDOW, y, x: i32, ch: chtype, n: i32) -> i32 ---
+
+
+    // variables
+    __get_stdscr :: () -> WINDOW ---
+    NCURSES_ACS  :: (a: i32) -> chtype ---
+}
+
+stdscr    :: __get_stdscr
+getyx     :: __get_yx
+getparyx  :: __get_par_yx
+getbegyx  :: __get_beg_yx
+getmaxyx  :: __get_max_yx
+
+ogetstr :: ($max_length: i32) -> str {
+    buf: [max_length] u8;
+    err := getnstr(buf);
+    return string.alloc_copy(string.from_cstr(~~ buf));
+}
+
+printw :: (fmt: str, args: ..any) {
+    buf: [1024] u8;
+    to_output := conv.format_va(buf, fmt, args);
+    addnstr(to_output);
+}
+
+wprintw :: (w: WINDOW, fmt: str, args: ..any) {
+    buf: [1024] u8;
+    to_output := conv.format_va(buf, fmt, args);
+    waddnstr(w, to_output);
+}
+
+mvprintw :: (y, x: i32, fmt: str, args: ..any) {
+    buf: [1024] u8;
+    to_output := conv.format_va(buf, fmt, args);
+    mvaddnstr(y, x, to_output);
+}
+
+mvwprintw :: (w: WINDOW, y, x: i32, fmt: str, args: ..any) {
+    buf: [1024] u8;
+    to_output := conv.format_va(buf, fmt, args);
+    mvwaddnstr(w, y, x, to_output);
+}
+
+
+COLOR_BLACK    :: 0
+COLOR_RED      :: 1
+COLOR_GREEN    :: 2
+COLOR_YELLOW :: 3
+COLOR_BLUE :: 4
+COLOR_MAGENTA :: 5
+COLOR_CYAN :: 6
+COLOR_WHITE :: 7
+
diff --git a/modules/ncurses/ncurses.c b/modules/ncurses/ncurses.c
new file mode 100644 (file)
index 0000000..cb880b1
--- /dev/null
@@ -0,0 +1,1190 @@
+
+#include "ncurses.h"
+
+WINDOW *__get_stdscr() {
+    return stdscr;
+}
+
+void __get_yx    (WINDOW *w, int *y, int *x) { getyx(w, *y, *x); }
+void __get_par_yx(WINDOW *w, int *y, int *x) { getparyx(w, *y, *x); }
+void __get_beg_yx(WINDOW *w, int *y, int *x) { getbegyx(w, *y, *x); }
+void __get_max_yx(WINDOW *w, int *y, int *x) { getmaxyx(w, *y, *x); }
+
+chtype __ACS_LOOKUP(int a) { return NCURSES_ACS(a); }
+
+
+
+#define ONYX_LIBRARY_NAME onyx_ncurses
+#include "onyx_library.h"
+
+#define P(i, k) (params->data[i].of.k)
+
+ONYX_DEF(initscr, (), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(initscr());
+    return NULL;
+}
+
+ONYX_DEF(endwin, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(endwin());
+    return NULL;
+}
+
+ONYX_DEF(isendwin, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(isendwin());
+    return NULL;
+}
+
+ONYX_DEF(newterm, (WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(newterm(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(set_term, (WASM_I64), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(set_term(P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(delscreen, (WASM_I64), ()) {
+    delscreen(P(0, i64));
+    return NULL;
+}
+
+ONYX_DEF(start_color, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(start_color());
+    return NULL;
+}
+
+ONYX_DEF(has_colors, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(has_colors());
+    return NULL;
+}
+
+ONYX_DEF(can_change_color, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(can_change_color());
+    return NULL;
+}
+
+ONYX_DEF(init_pair, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(init_pair(P(0, i32), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(init_color, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(init_color(P(0, i32), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(color_content, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(color_content(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(pair_content, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(pair_content(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(reset_color_pairs, (), ()) {
+    reset_color_pairs();
+    return NULL;
+}
+
+ONYX_DEF(COLOR_PAIR, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(COLOR_PAIR(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(PAIR_NUMBER, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(PAIR_NUMBER(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(cbreak, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(cbreak());
+    return NULL;
+}
+
+ONYX_DEF(nocbreak, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(nocbreak());
+    return NULL;
+}
+
+ONYX_DEF(echo, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(echo());
+    return NULL;
+}
+
+ONYX_DEF(noecho, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(noecho());
+    return NULL;
+}
+
+ONYX_DEF(intrflush, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(intrflush((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(keypad, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(keypad((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(meta, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(meta((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(nodelay, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(nodelay((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(notimeout, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(notimeout((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(nl, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(nl());
+    return NULL;
+}
+
+ONYX_DEF(nonl, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(nonl());
+    return NULL;
+}
+
+ONYX_DEF(raw, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(raw());
+    return NULL;
+}
+
+ONYX_DEF(noraw, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(noraw());
+    return NULL;
+}
+
+ONYX_DEF(qiflush, (), ()) {
+    qiflush();
+    return NULL;
+}
+
+ONYX_DEF(noqiflush, (), ()) {
+    noqiflush();
+    return NULL;
+}
+
+ONYX_DEF(halfdelay, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(halfdelay(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(timeout, (WASM_I32), ()) {
+    timeout(P(0, i32));
+    return NULL;
+}
+
+ONYX_DEF(wtimeout, (WASM_I64, WASM_I32), ()) {
+    wtimeout((WINDOW *) P(0, i64), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(typeahead, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(typeahead(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(clearkok, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(clearkok((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(idlok, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(idlok((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(idcok, (WASM_I64, WASM_I32), ()) {
+    idcok((WINDOW *) P(0, i64), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(immedok, (WASM_I64, WASM_I32), ()) {
+    immedok((WINDOW *) P(0, i64), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(leaveok, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(leaveok((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(scrollok, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(scrollok((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(setscrreg, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(setscrreg(P(0, i32), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wsetscrreg, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wsetscrreg((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(attr_get, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attr_get(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wattr_get, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattr_get((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(attr_set, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attr_set(ONYX_PTR(P(0, i32)), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wattr_set, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattr_set((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(attr_off, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attr_off(P(0, i32), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wattr_off, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattr_off((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(attr_on, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attr_on(P(0, i32), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wattr_on, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattr_on((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(attroff, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attroff(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wattroff, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattroff((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(attron, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attron(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wattron, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattron((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(attrset, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(attrset(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wattrset, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wattrset((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(chgat, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(chgat(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wchgat, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wchgat((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), ONYX_PTR(P(4, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvchgat, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvchgat(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), ONYX_PTR(P(5, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvmchgat, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvmchgat((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), ONYX_PTR(P(6, i32))));
+    return NULL;
+}
+
+ONYX_DEF(color_set, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(color_set(P(0, i32), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wcolor_set, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wcolor_set((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(standend, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(standend());
+    return NULL;
+}
+
+ONYX_DEF(wstandend, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wstandend((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(standout, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(standout());
+    return NULL;
+}
+
+ONYX_DEF(wstandout, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wstandout((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(unctrl, (WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(unctrl(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(keyname, (WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(keyname(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(key_name, (WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(key_name(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(filter, (), ()) {
+    filter();
+    return NULL;
+}
+
+ONYX_DEF(nofilter, (), ()) {
+    nofilter();
+    return NULL;
+}
+
+ONYX_DEF(use_env, (WASM_I32), ()) {
+    use_env(P(0, i32));
+    return NULL;
+}
+
+ONYX_DEF(use_tioctl, (WASM_I32), ()) {
+    use_tioctl(P(0, i32));
+    return NULL;
+}
+
+ONYX_DEF(getwin, (WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(getwin(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(delay_output, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(delay_output(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(flushinp, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(flushinp());
+    return NULL;
+}
+
+ONYX_DEF(def_prog_mode, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(def_prog_mode());
+    return NULL;
+}
+
+ONYX_DEF(def_shell_mode, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(def_shell_mode());
+    return NULL;
+}
+
+ONYX_DEF(reset_prog_mode, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(reset_prog_mode());
+    return NULL;
+}
+
+ONYX_DEF(reset_shell_mode, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(reset_shell_mode());
+    return NULL;
+}
+
+ONYX_DEF(resetty, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(resetty());
+    return NULL;
+}
+
+ONYX_DEF(savetty, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(savetty());
+    return NULL;
+}
+
+ONYX_DEF(getsyx, (WASM_I32, WASM_I32), ()) {
+    getsyx(P(0, i32), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(setsyx, (WASM_I32, WASM_I32), ()) {
+    setsyx(P(0, i32), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(curs_set, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(curs_set(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(napms, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(napms(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(refresh, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(refresh());
+    return NULL;
+}
+
+ONYX_DEF(wrefresh, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wrefresh((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wnoutrefresh, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wnoutrefresh((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(doupdate, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(doupdate());
+    return NULL;
+}
+
+ONYX_DEF(redrawwin, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(redrawwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wredrawln, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wredrawln((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(addch, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(addch(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(waddch, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(waddch((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvaddch, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvaddch(P(0, i32), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwaddch, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwaddch((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(echochar, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(echochar(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wechochar, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wechochar((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(addchstr, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(addchstr(ONYX_PTR(P(0, i32))));
+    return NULL;
+}
+
+ONYX_DEF(addchnstr, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(addchnstr(ONYX_PTR(P(0, i32)), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(waddchstr, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(waddchstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(waddchnstr, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(waddchnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvaddchstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvaddchstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvaddchnstr, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvaddchnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwaddchstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwaddchstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvwaddchnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwaddchnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(addstr, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(addstr(ONYX_PTR(P(0, i32))));
+    return NULL;
+}
+
+ONYX_DEF(addnstr, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(addnstr(ONYX_PTR(P(0, i32)), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(waddstr, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(waddstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(waddnstr, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(waddnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvaddstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvaddstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvaddnstr, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvaddnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwaddstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwaddstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvwaddnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwaddnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(erase, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(erase());
+    return NULL;
+}
+
+ONYX_DEF(werase, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(werase((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(clear, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(clear());
+    return NULL;
+}
+
+ONYX_DEF(wclear, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wclear((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(clrtobot, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(clrtobot());
+    return NULL;
+}
+
+ONYX_DEF(wclrtobot, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wclrtobot((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(clrtoeol, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(clrtoeol());
+    return NULL;
+}
+
+ONYX_DEF(wclrtoeol, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wclrtoeol((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_cleared, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_cleared((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_idcok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_idcok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_idlok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_idlok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_immedok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_immedok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_keypad, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_keypad((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_leaveok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_leaveok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_nodelay, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_nodelay((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_notimeout, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_notimeout((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_pad, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_pad((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_scrollok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_scrollok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_subwin, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_subwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_syncok, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_syncok((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wgetparent, (WASM_I64), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(wgetparent((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wgetdelay, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wgetdelay((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(newwin, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(newwin(P(0, i32), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(delwin, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(delwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(mvwin, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(subwin, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(subwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(derwin, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(derwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvderwin, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvderwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(dupwin, (WASM_I64), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(dupwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wsyncup, (WASM_I64), ()) {
+    wsyncup((WINDOW *) P(0, i64));
+    return NULL;
+}
+
+ONYX_DEF(syncok, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(syncok((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wcursyncup, (WASM_I64), ()) {
+    wcursyncup((WINDOW *) P(0, i64));
+    return NULL;
+}
+
+ONYX_DEF(wsyncdown, (WASM_I64), ()) {
+    wsyncdown((WINDOW *) P(0, i64));
+    return NULL;
+}
+
+ONYX_DEF(touchline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(touchline((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(touchwin, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(touchwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(wtouchln, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wtouchln((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(untouchwin, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(untouchwin((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(is_linetouched, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_linetouched((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(is_wintouched, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(is_wintouched((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(bkgdset, (WASM_I32), ()) {
+    bkgdset(P(0, i32));
+    return NULL;
+}
+
+ONYX_DEF(wbkgdset, (WASM_I64, WASM_I32), ()) {
+    wbkgdset((WINDOW *) P(0, i64), P(1, i32));
+    return NULL;
+}
+
+ONYX_DEF(bkgd, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(bkgd(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wbkgd, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wbkgd((WINDOW *) P(0, i64), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(getbkgd, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(getbkgd((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(inch, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(inch());
+    return NULL;
+}
+
+ONYX_DEF(winch, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(winch((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(mvinch, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvinch(P(0, i32), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwinch, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwinch((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(getch, (), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(getch());
+    return NULL;
+}
+
+ONYX_DEF(wgetch, (WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wgetch((WINDOW *) P(0, i64)));
+    return NULL;
+}
+
+ONYX_DEF(mvgetch, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvgetch(P(0, i32), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwgetch, (WASM_I32, WASM_I32, WASM_I64), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwgetch(P(0, i32), P(1, i32), (WINDOW *) P(2, i64)));
+    return NULL;
+}
+
+ONYX_DEF(ungetch, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(ungetch(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(has_key, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(has_key(P(0, i32)));
+    return NULL;
+}
+
+ONYX_DEF(__get_yx, (WASM_I64, WASM_I32, WASM_I32), ()) {
+    __get_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(__get_par_yx, (WASM_I64, WASM_I32, WASM_I32), ()) {
+    __get_par_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(__get_beg_yx, (WASM_I64, WASM_I32, WASM_I32), ()) {
+    __get_beg_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(__get_max_yx, (WASM_I64, WASM_I32, WASM_I32), ()) {
+    __get_max_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(getstr, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(getstr(ONYX_PTR(P(0, i32))));
+    return NULL;
+}
+
+ONYX_DEF(getnstr, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(getnstr(ONYX_PTR(P(0, i32)), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wgetstr, (WASM_I64, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wgetstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32))));
+    return NULL;
+}
+
+ONYX_DEF(wgetnstr, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wgetnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvgetstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvgetstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvgetnstr, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvgetnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwgetstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwgetstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))));
+    return NULL;
+}
+
+ONYX_DEF(mvwgetnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwgetnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(border, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(border(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wborder, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wborder((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32)));
+    return NULL;
+}
+
+ONYX_DEF(box, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(box((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(hline, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(hline(P(0, i32), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(whline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(whline((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(vline, (WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(vline(P(0, i32), P(1, i32)));
+    return NULL;
+}
+
+ONYX_DEF(wvline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(wvline((WINDOW *) P(0, i64), P(1, i32), P(2, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvhline, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvhline(P(0, i32), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwhline, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwhline((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvvline, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvvline(P(0, i32), P(1, i32), P(2, i32), P(3, i32)));
+    return NULL;
+}
+
+ONYX_DEF(mvwvline, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(mvwvline((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32)));
+    return NULL;
+}
+
+ONYX_DEF(__get_stdscr, (), (WASM_I64)) {
+    results->data[0] = WASM_I64_VAL(__get_stdscr());
+    return NULL;
+}
+
+ONYX_DEF(NCURSES_ACS, (WASM_I32), (WASM_I32)) {
+    results->data[0] = WASM_I32_VAL(NCURSES_ACS(P(0, i32)));
+    return NULL;
+}
+
+
+
+ONYX_LIBRARY {
+    ONYX_FUNC(initscr)
+    ONYX_FUNC(endwin)
+    ONYX_FUNC(isendwin)
+    ONYX_FUNC(newterm)
+    ONYX_FUNC(set_term)
+    ONYX_FUNC(delscreen)
+    ONYX_FUNC(start_color)
+    ONYX_FUNC(has_colors)
+    ONYX_FUNC(can_change_color)
+    ONYX_FUNC(init_pair)
+    ONYX_FUNC(init_color)
+    ONYX_FUNC(color_content)
+    ONYX_FUNC(pair_content)
+    ONYX_FUNC(reset_color_pairs)
+    ONYX_FUNC(COLOR_PAIR)
+    ONYX_FUNC(PAIR_NUMBER)
+    ONYX_FUNC(cbreak)
+    ONYX_FUNC(nocbreak)
+    ONYX_FUNC(echo)
+    ONYX_FUNC(noecho)
+    ONYX_FUNC(intrflush)
+    ONYX_FUNC(keypad)
+    ONYX_FUNC(meta)
+    ONYX_FUNC(nodelay)
+    ONYX_FUNC(notimeout)
+    ONYX_FUNC(nl)
+    ONYX_FUNC(nonl)
+    ONYX_FUNC(raw)
+    ONYX_FUNC(noraw)
+    ONYX_FUNC(qiflush)
+    ONYX_FUNC(noqiflush)
+    ONYX_FUNC(halfdelay)
+    ONYX_FUNC(timeout)
+    ONYX_FUNC(wtimeout)
+    ONYX_FUNC(typeahead)
+    ONYX_FUNC(clearkok)
+    ONYX_FUNC(idlok)
+    ONYX_FUNC(idcok)
+    ONYX_FUNC(immedok)
+    ONYX_FUNC(leaveok)
+    ONYX_FUNC(scrollok)
+    ONYX_FUNC(setscrreg)
+    ONYX_FUNC(wsetscrreg)
+    ONYX_FUNC(attr_get)
+    ONYX_FUNC(wattr_get)
+    ONYX_FUNC(attr_set)
+    ONYX_FUNC(wattr_set)
+    ONYX_FUNC(attr_off)
+    ONYX_FUNC(wattr_off)
+    ONYX_FUNC(attr_on)
+    ONYX_FUNC(wattr_on)
+    ONYX_FUNC(attroff)
+    ONYX_FUNC(wattroff)
+    ONYX_FUNC(attron)
+    ONYX_FUNC(wattron)
+    ONYX_FUNC(attrset)
+    ONYX_FUNC(wattrset)
+    ONYX_FUNC(chgat)
+    ONYX_FUNC(wchgat)
+    ONYX_FUNC(mvchgat)
+    ONYX_FUNC(mvmchgat)
+    ONYX_FUNC(color_set)
+    ONYX_FUNC(wcolor_set)
+    ONYX_FUNC(standend)
+    ONYX_FUNC(wstandend)
+    ONYX_FUNC(standout)
+    ONYX_FUNC(wstandout)
+    ONYX_FUNC(unctrl)
+    ONYX_FUNC(keyname)
+    ONYX_FUNC(key_name)
+    ONYX_FUNC(filter)
+    ONYX_FUNC(nofilter)
+    ONYX_FUNC(use_env)
+    ONYX_FUNC(use_tioctl)
+    ONYX_FUNC(getwin)
+    ONYX_FUNC(delay_output)
+    ONYX_FUNC(flushinp)
+    ONYX_FUNC(def_prog_mode)
+    ONYX_FUNC(def_shell_mode)
+    ONYX_FUNC(reset_prog_mode)
+    ONYX_FUNC(reset_shell_mode)
+    ONYX_FUNC(resetty)
+    ONYX_FUNC(savetty)
+    ONYX_FUNC(getsyx)
+    ONYX_FUNC(setsyx)
+    ONYX_FUNC(curs_set)
+    ONYX_FUNC(napms)
+    ONYX_FUNC(refresh)
+    ONYX_FUNC(wrefresh)
+    ONYX_FUNC(wnoutrefresh)
+    ONYX_FUNC(doupdate)
+    ONYX_FUNC(redrawwin)
+    ONYX_FUNC(wredrawln)
+    ONYX_FUNC(addch)
+    ONYX_FUNC(waddch)
+    ONYX_FUNC(mvaddch)
+    ONYX_FUNC(mvwaddch)
+    ONYX_FUNC(echochar)
+    ONYX_FUNC(wechochar)
+    ONYX_FUNC(addchstr)
+    ONYX_FUNC(addchnstr)
+    ONYX_FUNC(waddchstr)
+    ONYX_FUNC(waddchnstr)
+    ONYX_FUNC(mvaddchstr)
+    ONYX_FUNC(mvaddchnstr)
+    ONYX_FUNC(mvwaddchstr)
+    ONYX_FUNC(mvwaddchnstr)
+    ONYX_FUNC(addstr)
+    ONYX_FUNC(addnstr)
+    ONYX_FUNC(waddstr)
+    ONYX_FUNC(waddnstr)
+    ONYX_FUNC(mvaddstr)
+    ONYX_FUNC(mvaddnstr)
+    ONYX_FUNC(mvwaddstr)
+    ONYX_FUNC(mvwaddnstr)
+    ONYX_FUNC(erase)
+    ONYX_FUNC(werase)
+    ONYX_FUNC(clear)
+    ONYX_FUNC(wclear)
+    ONYX_FUNC(clrtobot)
+    ONYX_FUNC(wclrtobot)
+    ONYX_FUNC(clrtoeol)
+    ONYX_FUNC(wclrtoeol)
+    ONYX_FUNC(is_cleared)
+    ONYX_FUNC(is_idcok)
+    ONYX_FUNC(is_idlok)
+    ONYX_FUNC(is_immedok)
+    ONYX_FUNC(is_keypad)
+    ONYX_FUNC(is_leaveok)
+    ONYX_FUNC(is_nodelay)
+    ONYX_FUNC(is_notimeout)
+    ONYX_FUNC(is_pad)
+    ONYX_FUNC(is_scrollok)
+    ONYX_FUNC(is_subwin)
+    ONYX_FUNC(is_syncok)
+    ONYX_FUNC(wgetparent)
+    ONYX_FUNC(wgetdelay)
+    ONYX_FUNC(newwin)
+    ONYX_FUNC(delwin)
+    ONYX_FUNC(mvwin)
+    ONYX_FUNC(subwin)
+    ONYX_FUNC(derwin)
+    ONYX_FUNC(mvderwin)
+    ONYX_FUNC(dupwin)
+    ONYX_FUNC(wsyncup)
+    ONYX_FUNC(syncok)
+    ONYX_FUNC(wcursyncup)
+    ONYX_FUNC(wsyncdown)
+    ONYX_FUNC(touchline)
+    ONYX_FUNC(touchwin)
+    ONYX_FUNC(wtouchln)
+    ONYX_FUNC(untouchwin)
+    ONYX_FUNC(is_linetouched)
+    ONYX_FUNC(is_wintouched)
+    ONYX_FUNC(bkgdset)
+    ONYX_FUNC(wbkgdset)
+    ONYX_FUNC(bkgd)
+    ONYX_FUNC(wbkgd)
+    ONYX_FUNC(getbkgd)
+    ONYX_FUNC(inch)
+    ONYX_FUNC(winch)
+    ONYX_FUNC(mvinch)
+    ONYX_FUNC(mvwinch)
+    ONYX_FUNC(getch)
+    ONYX_FUNC(wgetch)
+    ONYX_FUNC(mvgetch)
+    ONYX_FUNC(mvwgetch)
+    ONYX_FUNC(ungetch)
+    ONYX_FUNC(has_key)
+    ONYX_FUNC(__get_yx)
+    ONYX_FUNC(__get_par_yx)
+    ONYX_FUNC(__get_beg_yx)
+    ONYX_FUNC(__get_max_yx)
+    ONYX_FUNC(getstr)
+    ONYX_FUNC(getnstr)
+    ONYX_FUNC(wgetstr)
+    ONYX_FUNC(wgetnstr)
+    ONYX_FUNC(mvgetstr)
+    ONYX_FUNC(mvgetnstr)
+    ONYX_FUNC(mvwgetstr)
+    ONYX_FUNC(mvwgetnstr)
+    ONYX_FUNC(border)
+    ONYX_FUNC(wborder)
+    ONYX_FUNC(box)
+    ONYX_FUNC(hline)
+    ONYX_FUNC(whline)
+    ONYX_FUNC(vline)
+    ONYX_FUNC(wvline)
+    ONYX_FUNC(mvhline)
+    ONYX_FUNC(mvwhline)
+    ONYX_FUNC(mvvline)
+    ONYX_FUNC(mvwvline)
+    ONYX_FUNC(__get_stdscr)
+    ONYX_FUNC(NCURSES_ACS)
+    NULL
+};
\ No newline at end of file
diff --git a/modules/ncurses/onyx_ncurses.so b/modules/ncurses/onyx_ncurses.so
new file mode 100755 (executable)
index 0000000..857b36b
Binary files /dev/null and b/modules/ncurses/onyx_ncurses.so differ
diff --git a/scripts/c_binding.onyx b/scripts/c_binding.onyx
new file mode 100644 (file)
index 0000000..b4249ab
--- /dev/null
@@ -0,0 +1,193 @@
+#load "core/std"
+
+use package core
+use package simd
+
+CBindings :: (package ncurses).CBindings
+
+#if !#defined(CBindings) {
+    #error "Expected to find CBindings structure";
+}
+
+
+
+main :: (args: [] cstr) {
+    println(CBindings.file_prefix);
+
+    printf("""
+#define ONYX_LIBRARY_NAME {}
+#include "onyx_library.h"
+
+#define P(i, k) (params->data[i].of.k)
+
+""", CBindings.name);
+
+    use type_info;
+    bind_info := cast(^Type_Info_Struct) get_type_info(CBindings);
+    for bind_info.methods {
+        method_type := it.func.type;
+        method_info := cast (^Type_Info_Function) get_type_info(method_type);
+        assert(method_info.kind == .Function, "Expected function type.");
+
+        printf("ONYX_DEF({}, (", it.name);
+        i := 0;
+        for method_info.parameter_types {
+            print_type_encoding(it);
+
+            if i != method_info.parameter_types.count - 1 {
+                print(", ");
+            }
+            i += 1;
+        }
+
+        print("), (");
+        print_type_encoding(method_info.return_type);
+        print(")) {\n");
+        print_body(it.name, method_info);
+        print("}\n\n");
+    }
+
+    print("\n\n");
+    print("ONYX_LIBRARY {\n");
+    for bind_info.methods {
+        printf("    ONYX_FUNC({})\n", it.name);
+    }
+    print("    NULL\n");
+    print("};");
+}
+
+print_body :: (method_name, method_info) => {
+    use type_info;
+    call := io.dynamic_string_stream_make();
+    defer io.dynamic_string_stream_free(^call);
+    callw := io.writer_make(^call);
+
+    param_num := 0;
+    for method_info.parameter_types {
+        if get_type_info(it).kind == .Slice {
+            io.write_format(^callw, "ONYX_PTR(P({}, i32)), P({}, i32)", param_num, param_num + 1);
+            param_num += 1;
+
+        } elseif is_pointer(it) {
+            io.write_format(^callw, "ONYX_PTR(P({}, i32))", param_num);
+
+        } else {
+            matched := false;
+            for^ m: CBindings.cast_map {
+                if m.type == it {
+                    io.write_format(^callw, "({}) P({}, {})", m.name, param_num, type_to_wasm_type(it));
+                    matched = true;
+                    break;
+                }
+            }
+            
+            if !matched do io.write_format(^callw, "P({}, {})", param_num, type_to_wasm_type(it));
+        }
+
+        io.write_format(^callw, ", ");
+        param_num += 1;
+    }
+
+    call_str := call->to_str();
+    wasm_return_type := type_to_wasm_type(method_info.return_type);
+    switch wasm_return_type {
+        case ""    do printf("    {}({});\n", method_name, call_str[0..call_str.count-2]);
+        case "i32" do printf("    results->data[0] = WASM_I32_VAL({}({}));\n", method_name, call_str[0..call_str.count-2]);
+        case "i64" do printf("    results->data[0] = WASM_I64_VAL({}({}));\n", method_name, call_str[0..call_str.count-2]);
+        case "f32" do printf("    results->data[0] = WASM_F32_VAL({}({}));\n", method_name, call_str[0..call_str.count-2]);
+        case "f64" do printf("    results->data[0] = WASM_F64_VAL({}({}));\n", method_name, call_str[0..call_str.count-2]);
+    }
+
+    printf("    return NULL;\n");
+}
+
+type_to_wasm_type :: (t: type_expr) -> str {
+    use type_info;
+
+    param_info := get_type_info(t);
+    switch param_info.kind {
+        case .Basic do switch t {
+            case bool do return "i32";
+            case i8   do return "i32";
+            case u8   do return "i32";
+            case i16  do return "i32";
+            case u16  do return "i32";
+            case i32  do return "i32";
+            case u32  do return "i32";
+            case i64  do return "i64";
+            case u64  do return "i64";
+
+            case f32  do return "f32";
+            case f64  do return "f64";
+
+            case rawptr do return "i32"; // This will have to depend on the pointer size...
+            
+            case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 do return "v128";
+
+            case type_expr do return "i32";
+        }
+
+        case .Pointer do return "i32"; // This will also have to depend on the pointer size...
+        case .Function do assert(false, "Passing functions between wasm and c is not yet supported.");
+        case .Array do return "i32";
+        case .Slice do assert(false, "ASDFASDF");
+        case .Enum do return type_to_wasm_type((cast(^Type_Info_Enum) param_info).backing_type);
+        case .Distinct do return type_to_wasm_type((cast(^Type_Info_Distinct) param_info).base_type);
+
+        case .Struct {
+            s_info := cast(^Type_Info_Struct) param_info;
+            if s_info.members.count == 1 {
+                return type_to_wasm_type(s_info.members[0].type);
+            }
+
+            assert(false, "Passing structures between wasm and c is not yet supported.");
+        }
+    }
+
+    return "";
+}
+
+print_type_encoding :: (t: type_expr) {
+    use type_info;
+
+    param_info := get_type_info(t);
+    switch param_info.kind {
+        case .Basic do switch t {
+            case bool do print("WASM_I32");
+            case i8   do print("WASM_I32");
+            case u8   do print("WASM_I32");
+            case i16  do print("WASM_I32");
+            case u16  do print("WASM_I32");
+            case i32  do print("WASM_I32");
+            case u32  do print("WASM_I32");
+            case i64  do print("WASM_I64");
+            case u64  do print("WASM_I64");
+
+            case f32  do print("WASM_F32");
+            case f64  do print("WASM_F64");
+
+            case rawptr do print("WASM_I32"); // This will have to depend on the pointer size...
+            
+            case i8x16, i16x8, i32x4, i64x2, f32x4, f64x2, v128 do print("WASM_V128");
+
+            case type_expr do print("WASM_I32");
+        }
+
+        case .Pointer do print("WASM_I32"); // This will also have to depend on the pointer size...
+        case .Function do assert(false, "Passing functions between wasm and c is not yet supported.");
+        case .Array do print("WASM_I32");
+        case .Slice do print("WASM_I32, WASM_I32");
+        case .Enum do print_type_encoding((cast(^Type_Info_Enum) param_info).backing_type);
+        case .Distinct do print_type_encoding((cast(^Type_Info_Distinct) param_info).base_type);
+
+        case .Struct {
+            s_info := cast(^Type_Info_Struct) param_info;
+            if s_info.members.count == 1 {
+                print_type_encoding(s_info.members[0].type);
+                return;
+            }
+
+            assert(false, "Passing structures between wasm and c is not yet supported.");
+        }
+    }
+}