#include "term_io.h" int term_fprint( screen_mode_e mode, FILE *f ) { int ret=-1; if (f == NULL) return -1; ERROR("\n"); switch ( mode ) { case SCREEN_MODE_80x25: { } break; default: printf("Unknown screen mode\n"); } return ret; } int term_print( term_screen *ts, const char *s, size_t n) { int ret=0; if ( ts == NULL ) return -1; if ( s == NULL ) return -1; if ( n < 1 ) return -1; if ( n > 80*25 ) return -1; ret = write( ts->ofd, s, n ); return ret; } //print data to terminal starting from x,y int term_print_xy( term_screen *ts, const char *buf, size_t size, int init_column, int init_row ) { int ret=-1; if ( buf == NULL ) { return -1; } if ( size <= 0 ) { return -1; } switch ( ts->mode ) { case SCREEN_MODE_80x25: { } break; default: printf("Unknown mode\n"); } return ret; } int term_draw_hline( term_screen *ts, int pc, int pr, const int sz, char ch) { int ret=0; char buf[sz]; memset( buf, ch, sz ); if ( sz > 0) { term_cur_set_c( ts, pc ); term_cur_set_r( ts, pr ); write( ts->ofd, buf, sz ); } else { ret = -1; } return ret; } //read one character from stream int term_getc( term_screen *ts ) { int ret=-1; int fret=-1; char buf; fret = read( ts->ifd, &buf, 1 ); if ( fret == 1 ) ret = buf; return ret; } int term_putc( term_screen *ts, char c ) { int ret = 0; int fret = -1; fret = write( ts->ofd, &c, 1 ); if ( fret != 1 ) { ret = -1; } return ret; } //return amoutn fo characters readed //on error or if nothing is imputed 0 returned int term_readline( term_screen *ts, char *str, size_t str_size, int flag ) { int ret = 0; int max_row, max_column; char *buf = NULL; int buf_size = str_size-1; int buf_curent = 0; int menu_input=0; char menu_cmd = 0; int orig_row; int orig_col; buf = malloc( buf_size ); memset( buf, 0, buf_size ); max_row = term_get_maxrow( ts ); max_column = term_get_maxcol( ts ); orig_row = term_cur_get_r( ts ); orig_col = term_cur_get_c( ts ); menu_cmd = 0; buf_curent = 0; //finsih when escape button is setted while ( menu_cmd != TK_ESC ) { menu_input = term_getc( ts ); if ( menu_input != -1 ) { menu_cmd = (char)menu_input; //add to buffer any printable alpahnumeric char if ( isalpha( menu_cmd ) && (flag == READLINE_TEXT || flag == READLINE_ALPHA || flag == READLINE_HIDDEN) ) { if ( buf_curent < buf_size ) { buf[ buf_curent ] = menu_cmd; buf_curent += 1; } //add to buffer number 0-9 } else if ( isdigit( menu_cmd ) && ( flag == READLINE_TEXT || flag == READLINE_NUMBER || flag == READLINE_HIDDEN )) { if ( buf_curent < buf_size ) { buf[ buf_curent ] = menu_cmd; buf_curent += 1; } //if space allowed } else if ( (menu_cmd == ' ') && (flag == READLINE_TEXT) ) { if ( buf_curent < buf_size ) { buf[ buf_curent ] = menu_cmd; buf_curent += 1; } //remaining printable chars for READLINE_TEXT } else if ( ispunct( menu_cmd ) && (flag == READLINE_TEXT )) { if ( buf_curent < buf_size ) { buf[ buf_curent ] = menu_cmd; buf_curent += 1; } //deleteone char from buffer with backspace } else if ( menu_cmd == TK_BACKSPACE ) { if ( buf_curent > 0) { buf[ buf_curent ] = 0x0; buf_curent -= 1; } //input ready lets finish input } else if ( menu_cmd == TK_ENTER ) { ret = buf_curent; memcpy( str, buf, buf_size ); str[ str_size-1 ] = 0x0; break; //finsih input without saving result } else if ( menu_cmd == TK_ESC ) { ret = -1; } { int i; term_cur_set_r( ts, orig_row ); term_cur_set_c( ts, orig_col ); for (i=0;iofd, format, args); va_end(args); return ret; }