From: Brendan Hansen Date: Tue, 26 Apr 2022 18:41:29 +0000 (-0500) Subject: added most of the ncurses library X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=432ba6341971ffaaae9b040d85da088307b55fd6;p=onyx.git added most of the ncurses library --- diff --git a/core/type_info/helper.onyx b/core/type_info/helper.onyx index 8c9c9ac8..47a3ac89 100644 --- a/core/type_info/helper.onyx +++ b/core/type_info/helper.onyx @@ -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 index 00000000..caff9ee2 --- /dev/null +++ b/modules/ncurses/build.sh @@ -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 index 00000000..d77c728e --- /dev/null +++ b/modules/ncurses/module.onyx @@ -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 index 00000000..cb880b1c --- /dev/null +++ b/modules/ncurses/ncurses.c @@ -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 index 00000000..857b36b6 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 index 00000000..b4249abe --- /dev/null +++ b/scripts/c_binding.onyx @@ -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."); + } + } +}