diff options
Diffstat (limited to 'c_src')
-rw-r--r-- | c_src/Makefile | 4 | ||||
-rw-r--r-- | c_src/slang_drv.c | 341 |
2 files changed, 194 insertions, 151 deletions
diff --git a/c_src/Makefile b/c_src/Makefile index 358a1b6..f032d8e 100644 --- a/c_src/Makefile +++ b/c_src/Makefile @@ -4,7 +4,7 @@ ifeq ($(TYPE),debug) EXTRA_FLAGS = -g else -EXTRA_FLAGS = +EXTRA_FLAGS = endif include ../include.mk @@ -21,7 +21,7 @@ slang_drv.o: slang_drv.c ../priv/slang_drv.so: slang_drv.o mkdir -p ../priv - $(LD_SHARED) -o ../priv/slang_drv.so slang_drv.o \ + $(CC) -shared -o ../priv/slang_drv.so slang_drv.o \ -L/usr/local/lib -lslang clean: diff --git a/c_src/slang_drv.c b/c_src/slang_drv.c index 3466433..101556c 100644 --- a/c_src/slang_drv.c +++ b/c_src/slang_drv.c @@ -1,5 +1,6 @@ #include <stdio.h> +#include <string.h> #include "erl_driver.h" #include <slang.h> #include <signal.h> @@ -184,9 +185,7 @@ -static long sl_start(); -static int sl_stop(), sl_read(); -static struct erl_drv_entry sl_erl_drv_entry; +static ErlDrvEntry sl_erl_drv_entry; static int wait_for = 0; @@ -242,15 +241,15 @@ SLsmg_Char_Type *decode_smg_char_type(char **buf) } -static long sl_start(long port, char *buf) +static ErlDrvData sl_start(ErlDrvPort port, char *buf) { - return port; + return (ErlDrvData)port; } -static int sl_stop(ErlDrvPort port) +static void sl_stop(ErlDrvData port) { - return 1; + return; } static int ret_int_int(ErlDrvPort port, int i, int j) @@ -282,8 +281,9 @@ static int ret_string(ErlDrvPort port, char *str) } -static int sl_output(ErlDrvPort port, char *buf, int len) +static void sl_output(ErlDrvData drv_data, char *buf, int len) { + ErlDrvPort port = (ErlDrvPort)drv_data; int x,y,z,v,w; char *str, *t1, *t2, *t3; int ret; @@ -308,84 +308,89 @@ static int sl_output(ErlDrvPort port, char *buf, int len) flow_ctl = get_int32(buf); buf+= 4; opost = get_int32(buf); buf+= 4; ret = SLang_init_tty (abort_char,flow_ctl, opost); - return ret_int(port, ret); + ret_int(port, ret); + return; } case SET_ABORT_FUNCTION: { SLang_set_abort_signal (NULL); - return ret_int(port, 0); + ret_int(port, 0); + return; } case GETKEY: { unsigned int key; if (SLang_input_pending (0) == 0) { wait_for = GETKEY; driver_select(port, 0, DO_READ, 1); - return 0; + return; } x = SLang_getkey (); - return ret_int(port, x); + ret_int(port, x); + return; } /* read a symbol */ case KP_GETKEY: { if (SLang_input_pending (0) == 0) { wait_for = KP_GETKEY; driver_select(port, 0, DO_READ, 1); - return 0; + return; } x = SLkp_getkey (); - return ret_int(port, x); + ret_int(port, x); + return; } case UNGETKEY: { unsigned char key = (unsigned char) *buf; SLang_ungetkey (key); - return 0; + return; } case RESET_TTY: { SLang_reset_tty(); - return 0; + return; } case KP_INIT: { - return ret_int(port, SLkp_init ()); + ret_int(port, SLkp_init ()); + return; } case SETVAR: { x = get_int32(buf);buf+= 4; y = get_int32(buf); switch (x) { case esl_baud_rate: - SLang_TT_Baud_Rate = y; return 0; + SLang_TT_Baud_Rate = y; return; case esl_read_fd: - return 0; + return; case esl_abort_char: - SLang_Abort_Char = y; return 0; + SLang_Abort_Char = y; return; case esl_ignore_user_abort: - SLang_Ignore_User_Abort=y; return 0; + SLang_Ignore_User_Abort=y; return; case esl_input_buffer_len : - SLang_Input_Buffer_Len=y; return 0; + SLang_Input_Buffer_Len=y; return; case esl_keyboard_quit: - SLKeyBoard_Quit=y; return 0; + SLKeyBoard_Quit=y; return; case esl_last_key_char: - SLang_Last_Key_Char=y; return 0; + SLang_Last_Key_Char=y; return; case esl_rl_eof_char: - SLang_RL_EOF_Char=y; return 0; + SLang_RL_EOF_Char=y; return; case esl_rline_quit: - SLang_Rline_Quit=y; return 0; + SLang_Rline_Quit=y; return; case esl_screen_rows: case esl_screen_cols : - return 0; + return; case esl_tab_width: - SLsmg_Tab_Width=y; return 0; + SLsmg_Tab_Width=y; return; case esl_newline_behaviour: - SLsmg_Newline_Behavior=y; return 0; + SLsmg_Newline_Behavior=y; return; case esl_error: - SLang_Error=y; return 0; + SLang_Error=y; return; case esl_version: - return 0; + return; case esl_backspace_moves : - SLsmg_Backspace_Moves=y; return 0; + SLsmg_Backspace_Moves=y; return; case esl_display_eight_bit: - SLsmg_Display_Eight_Bit=y; return 0; + SLsmg_Display_Eight_Bit=y; return; default: - return 0; + return; } } @@ -393,41 +398,59 @@ static int sl_output(ErlDrvPort port, char *buf, int len) x = get_int32(buf); switch (x) { case esl_baud_rate: - return ret_int(port, SLang_TT_Baud_Rate); + ret_int(port, SLang_TT_Baud_Rate); + return; case esl_read_fd: - return ret_int(port, SLang_TT_Read_FD); + ret_int(port, SLang_TT_Read_FD); + return; case esl_abort_char: - return (ret_int(port, SLang_Abort_Char)); + ret_int(port, SLang_Abort_Char); + return; case esl_ignore_user_abort: - return ret_int(port, SLang_Ignore_User_Abort); + ret_int(port, SLang_Ignore_User_Abort); + return; case esl_input_buffer_len : - return ret_int(port, SLang_Input_Buffer_Len); + ret_int(port, SLang_Input_Buffer_Len); + return; case esl_keyboard_quit: - return ret_int(port, SLKeyBoard_Quit); + ret_int(port, SLKeyBoard_Quit); + return; case esl_last_key_char: - return ret_int(port, SLang_Last_Key_Char); + ret_int(port, SLang_Last_Key_Char); + return; case esl_rl_eof_char: - return ret_int(port, SLang_RL_EOF_Char); + ret_int(port, SLang_RL_EOF_Char); + return; case esl_rline_quit: - return ret_int(port, SLang_Rline_Quit); + ret_int(port, SLang_Rline_Quit); + return; case esl_screen_rows: - return ret_int(port, SLtt_Screen_Rows); + ret_int(port, SLtt_Screen_Rows); + return; case esl_screen_cols : - return ret_int(port, SLtt_Screen_Cols); + ret_int(port, SLtt_Screen_Cols); + return; case esl_tab_width: - return ret_int(port, SLsmg_Tab_Width); + ret_int(port, SLsmg_Tab_Width); + return; case esl_newline_behaviour: - return ret_int(port, SLsmg_Newline_Behavior); + ret_int(port, SLsmg_Newline_Behavior); + return; case esl_error: - return ret_int(port, SLang_Error); + ret_int(port, SLang_Error); + return; case esl_version: - return ret_int(port, SLang_Version); + ret_int(port, SLang_Version); + return; case esl_backspace_moves : - return ret_int(port, SLsmg_Backspace_Moves); + ret_int(port, SLsmg_Backspace_Moves); + return; case esl_display_eight_bit: - return ret_int(port, SLsmg_Display_Eight_Bit); + ret_int(port, SLsmg_Display_Eight_Bit); + return; default: - return ret_int(port, -1); + ret_int(port, -1); + return; } } @@ -444,54 +467,55 @@ static int sl_output(ErlDrvPort port, char *buf, int len) v = get_int32(buf); buf+= 4; ch = *buf; SLsmg_fill_region(x, y,z,v,ch); - return 0; + return; } case SMG_SET_CHAR_SET: { x = get_int32(buf); buf+= 4; SLsmg_set_char_set(x); - return 0; + return; } case SMG_SUSPEND_SMG: { - return ret_int(port, SLsmg_suspend_smg()); + ret_int(port, SLsmg_suspend_smg()); + return; } case SMG_RESUME_SMG: { ret_int(port, SLsmg_resume_smg()); } case SMG_ERASE_EOL: { SLsmg_erase_eol(); - return 0; + return; } case SMG_GOTORC: { x = get_int32(buf); buf+= 4; y = get_int32(buf); buf+= 4; SLsmg_gotorc(x, y); - return 0; + return; } case SMG_ERASE_EOS: { SLsmg_erase_eos(); - return 0; + return; } case SMG_REVERSE_VIDEO: { SLsmg_reverse_video(); - return 0; + return; } case SMG_SET_COLOR: { x = get_int32(buf); buf+= 4; SLsmg_set_color(x); - return 0; + return; } case SMG_NORMAL_VIDEO: { SLsmg_normal_video(); - return 0; + return; } case SMG_WRITE_STRING: { SLsmg_write_string(buf); - return 0; + return; } case SMG_WRITE_CHAR: { ch = *buf; SLsmg_write_char(ch); - return 0; + return; } case SMG_WRITE_WRAPPED_STRING: { t1 = buf; @@ -502,46 +526,51 @@ static int sl_output(ErlDrvPort port, char *buf, int len) v = get_int32(buf); buf+= 4; w = get_int32(buf); buf+= 4; SLsmg_write_wrapped_string(t1, x,y,z,v,w); - return 0; + return; } case SMG_CLS: { SLsmg_cls(); - return 0; + return; } case SMG_REFRESH: { SLsmg_refresh(); - return 0; + return; } case SMG_TOUCH_LINES: { x = get_int32(buf); buf+= 4; y = get_int32(buf); buf+= 4; SLsmg_touch_lines(x, y); - return 0; + return; } case SMG_TOUCH_SCREEN: { #if (SLANG_VERSION < 10400 ) - return ret_int(port, -1); + ret_int(port, -1); + return; #else SLsmg_touch_screen(); #endif - return 0; + return; } case SMG_INIT_SMG: { - return ret_int(port, SLsmg_init_smg()); + ret_int(port, SLsmg_init_smg()); + return; } case SMG_REINIT_SMG: { #if (SLANG_VERSION < 10400 ) - return ret_int(port, -1); + ret_int(port, -1); + return; #else - return ret_int(port, SLsmg_reinit_smg()); + ret_int(port, SLsmg_reinit_smg()); + return; #endif } case SMG_RESET_SMG: { SLsmg_reset_smg(); - return 0; + return; } case SMG_CHAR_AT: { - return ret_int(port, SLsmg_char_at()); + ret_int(port, SLsmg_char_at()); + return; } case SMG_SET_SCREEN_START: { int *ip1, *ip2; @@ -549,24 +578,25 @@ static int sl_output(ErlDrvPort port, char *buf, int len) *ip2 = get_int32(buf); buf+= 4; SLsmg_set_screen_start(ip1, ip2); - return ret_int_int(port, *ip1, *ip2); + ret_int_int(port, *ip1, *ip2); + return; } case SMG_DRAW_HLINE: { x = get_int32(buf); buf+= 4; SLsmg_draw_hline(x); - return 0; + return; } case SMG_DRAW_VLINE: { x = get_int32(buf); buf+= 4; SLsmg_draw_vline(x); - return 0; + return; } case SMG_DRAW_OBJECT: { x = get_int32(buf); buf+= 4; y = get_int32(buf); buf+= 4; x = get_int32(buf); buf+= 4; SLsmg_draw_object(x, y,z); - return 0; + return; } case SMG_DRAW_BOX: { x = get_int32(buf); buf+= 4; @@ -574,26 +604,28 @@ static int sl_output(ErlDrvPort port, char *buf, int len) z = get_int32(buf); buf+= 4; v = get_int32(buf); buf+= 4; SLsmg_draw_box(x, y,z,v); - return 0; + return; } case SMG_GET_COLUMN: { - return ret_int(port, SLsmg_get_column()); + ret_int(port, SLsmg_get_column()); + return; } case SMG_GET_ROW: { - return ret_int(port, SLsmg_get_row()); + ret_int(port, SLsmg_get_row()); + return; } case SMG_FORWARD: { x = get_int32(buf); buf+= 4; SLsmg_forward(x); - return 0; + return; } case SMG_WRITE_COLOR_CHARS: { SLsmg_Char_Type * sl; sl = decode_smg_char_type(&buf); x = get_int32(buf); buf+= 4; SLsmg_write_color_chars(sl, x); - return 0; + return; } case SMG_READ_RAW: { x = get_int32(buf); buf+= 4; @@ -602,14 +634,15 @@ static int sl_output(ErlDrvPort port, char *buf, int len) t1[1] = 1; driver_output(port, t1, y+1); free(t1); - return 0; + return; } case SMG_WRITE_RAW: { SLsmg_Char_Type * sl; sl = decode_smg_char_type(&buf); x = get_int32(buf); y = SLsmg_write_raw(sl, x); - return ret_int(port, y); + ret_int(port, y); + return; } case SMG_SET_COLOR_IN_REGION: { x = get_int32(buf); buf+= 4; @@ -618,7 +651,7 @@ static int sl_output(ErlDrvPort port, char *buf, int len) v = get_int32(buf); buf+= 4; w = get_int32(buf); buf+= 4; SLsmg_set_color_in_region(x, y,z,v,w); - return 0; + return; } @@ -628,72 +661,73 @@ static int sl_output(ErlDrvPort port, char *buf, int len) case TT_FLUSH_OUTPUT: { ret = SLtt_flush_output(); - return ret_int(port, ret); + ret_int(port, ret); + return; } case TT_SET_SCROLL_REGION: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; SLtt_set_scroll_region(x, y); - return 0; + return; } case TT_RESET_SCROLL_REGION: { SLtt_reset_scroll_region(); - return 0; + return; } case TT_REVERSE_VIDEO: { SLtt_reverse_video (get_int32(buf)); - return 0; + return; } case TT_BOLD_VIDEO: { SLtt_begin_insert(); - return 0; + return; } case TT_BEGIN_INSERT: { SLtt_begin_insert(); - return 0; + return; } case TT_END_INSERT: { SLtt_end_insert(); - return 0; + return; } case TT_DEL_EOL: { SLtt_del_eol(); - return 0; + return; } case TT_GOTO_RC: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; SLtt_goto_rc (x, y); - return 0; + return; } case TT_DELETE_NLINES: { SLtt_delete_nlines(get_int32(buf)); - return 0; + return; } case TT_DELETE_CHAR: { SLtt_delete_char(); - return 0; + return; } case TT_ERASE_LINE: { SLtt_erase_line(); - return 0; + return; } case TT_NORMAL_VIDEO: { SLtt_normal_video(); - return 0; + return; } case TT_CLS: { SLtt_cls(); - return 0; + return; } case TT_BEEP: { SLtt_beep(); - return 0; + return; } case TT_REVERSE_INDEX: { SLtt_reverse_index(get_int32(buf)); - return 0; + return; } case TT_SMART_PUTS: { SLsmg_Char_Type *t1 ; @@ -704,116 +738,124 @@ static int sl_output(ErlDrvPort port, char *buf, int len) x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; SLtt_smart_puts(t1, t2,x,y); - return 0; + return; } case TT_WRITE_STRING: { SLtt_write_string (buf); - return 0; + return; } case TT_PUTCHAR: { SLtt_putchar((char) get_int32(buf)); - return 0; + return; } case TT_INIT_VIDEO: { ret = SLtt_init_video (); - return ret_int(port, ret); + ret_int(port, ret); + return; } case TT_RESET_VIDEO: { SLtt_reset_video (); - return 0; + return; } case TT_GET_TERMINFO: { SLtt_get_terminfo(); - return 0; + return; } case TT_GET_SCREEN_SIZE: { SLtt_get_screen_size (); - return 0; + return; } case TT_SET_CURSOR_VISIBILITY: { ret = SLtt_set_cursor_visibility (get_int32(buf)); - return ret_int(port, ret); + ret_int(port, ret); + return; } case TT_SET_MOUSE_MODE: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; ret = SLtt_set_mouse_mode (x,y); - return ret_int(port, ret); + ret_int(port, ret); + return; } case TT_INITIALIZE: { ret =SLtt_initialize (buf); - return ret_int(port, ret); + ret_int(port, ret); + return; } case TT_ENABLE_CURSOR_KEYS: { SLtt_enable_cursor_keys(); - return 0; + return; } case TT_SET_TERM_VTXXX: { - return 0; + return; } case TT_SET_COLOR_ESC: { x = get_int32(buf); buf+=4; SLtt_set_color_esc (x, buf); - return 0; + return; } case TT_WIDE_WIDTH: { SLtt_narrow_width(); - return 0; + return; } case TT_NARROW_WIDTH: { SLtt_narrow_width(); - return 0; + return; } case TT_SET_ALT_CHAR_SET: { SLtt_set_alt_char_set (get_int32(buf)); - return 0; + return; } case TT_WRITE_TO_STATUS_LINE: { x = get_int32(buf); buf+=4; SLtt_write_to_status_line (buf, x); - return 0; + return; } case TT_DISABLE_STATUS_LINE: { SLtt_disable_status_line (); - return 0; + return; } case TT_TGETSTR: { str = SLtt_tgetstr (buf); - return ret_string(port, str); + ret_string(port, str); + return; } case TT_TGETNUM: { x = SLtt_tgetnum (buf); - return ret_int(port, x); + ret_int(port, x); + return; } case TT_TGETFLAG: { x = SLtt_tgetflag (buf); - return ret_int(port, x); + ret_int(port, x); + return; } case TT_TIGETENT: { str = SLtt_tigetent (buf); - return ret_string(port, str); + ret_string(port, str); + return; } case TT_TIGETSTR: { - return 0; + return; } case TT_TIGETNUM: { - return 0; + return; } case SLTT_GET_COLOR_OBJECT: { x = get_int32(buf); buf+=4; y = SLtt_get_color_object (x); - return ret_int(port, y); - return 0; + ret_int(port, y); + return; } case TT_SET_COLOR_OBJECT: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; SLtt_set_color_object (x, y); - return 0; + return; } case TT_SET_COLOR: { x = get_int32(buf); buf+=4; @@ -821,7 +863,7 @@ static int sl_output(ErlDrvPort port, char *buf, int len) t2 = buf + (strlen(t1) + 1); t3 = buf + (strlen(t1) + strlen(t2) + 2); SLtt_set_color (x, t1, t2, t3); - return 0; + return; } case TT_SET_MONO: { x = get_int32(buf); buf+=4; @@ -829,44 +871,46 @@ static int sl_output(ErlDrvPort port, char *buf, int len) buf += strlen(t1) + 1; y = get_int32(buf); SLtt_set_mono (x, t1, y); - return 0; + return; } case TT_ADD_COLOR_ATTRIBUTE: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; SLtt_add_color_attribute (x, y); - return 0; + return; } case TT_SET_COLOR_FGBG: { x = get_int32(buf); buf+=4; y = get_int32(buf); buf+=4; z = get_int32(buf); buf+=4; SLtt_set_color_fgbg (x, y, z); - return 0; + return; } case ISATTY: { x = get_int32(buf); buf+=4; - return ret_int(port, isatty(x)); + ret_int(port, isatty(x)); + return; } case EFORMAT: { fprintf(stderr, "%s", buf); fflush(stderr); - return 0; + return; } case SIGNAL: { x = get_int32(buf); buf+=4; SLsignal(x_to_sig(x), sig_handler); - return 0; + return; } case SIGNAL_CHECK: { /* polled */ if (signal_cought != 0) signal_cought = 0; - return ret_int(port, signal_cought); + ret_int(port, signal_cought); + return; } default: - return 0; + return; } } @@ -874,40 +918,39 @@ static int sl_output(ErlDrvPort port, char *buf, int len) /* pending getkey request */ -sl_ready_input(ErlDrvPort port, int fd) +void sl_ready_input(ErlDrvData drv_data, ErlDrvEvent fd) { + ErlDrvPort port = (ErlDrvPort)drv_data; unsigned int key; driver_select(port, 0, DO_READ, 0); switch (wait_for) { case GETKEY: { key = SLang_getkey (); - return ret_int(port, key); + ret_int(port, key); + return; } case KP_GETKEY: { key = SLkp_getkey (); - return ret_int(port, key); + ret_int(port, key); + return; } - return 0; } } - - /* * Initialize and return a driver entry struct */ -struct erl_drv_entry *driver_init(void *handle) +DRIVER_INIT(slang_drv) { - sl_erl_drv_entry.init = NULL; /* Not used */ + memset(&sl_erl_drv_entry, 0, sizeof(sl_erl_drv_entry)); + sl_erl_drv_entry.start = sl_start; sl_erl_drv_entry.stop = sl_stop; sl_erl_drv_entry.output = sl_output; sl_erl_drv_entry.ready_input = sl_ready_input; - sl_erl_drv_entry.ready_output = NULL; sl_erl_drv_entry.driver_name = "slang_drv"; - sl_erl_drv_entry.finish = NULL; - sl_erl_drv_entry.handle = handle; /* MUST set this!!! */ + return &sl_erl_drv_entry; } |