#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;i<buf_size;i++)
{
if ( i < buf_curent )
{
if ( (flag == READLINE_TEXT) || (flag == READLINE_ALPHA)
|| (flag == READLINE_NUMBER) )
{
term_putc( ts, buf[i] );
} else if ( flag == READLINE_HIDDEN )
{
term_putc( ts, '*');
}
} else
{
term_putc( ts, ' ' );
}
}
term_cur_set_c( ts, orig_col+buf_curent );
term_cur_set_r( ts, orig_row );
}
}
}
if ( buf != NULL)
{
free( buf );
buf = NULL;
}
return ret;
}
//this is to replace printf,flush code
int term_printf( term_screen *ts, const char *format, ...)
{
int ret=0;
va_list args;
va_start(args, format);
vdprintf(ts->ofd, format, args);
va_end(args);
return ret;
}