summaryrefslogblamecommitdiffstats
path: root/libterm/term_io.c
blob: d305f51b9f638d090c23d44ed4517c66d64f71fd (plain) (tree)
1
2
3
4
5
6
7
8
9







                                              
                    












                                                        



















                                                         

                                          
                                                                  

                                       
























                                                 

















                                                                            













                                        



                                        
 
































                                                                          
                                             





                                                    



                                                                                 





                                                                     



























                                                                                   






                                                                
                                                       





                                                             
                                                            












                                                               

                                                                                                         
























                                                                                     














                                                          
#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;
}