blob: eb7cdc269e580328722564d980dfdc6196f486e2 [file] [log] [blame]
/* screen_buffer.c - MemTest-86 Version 3.3
*
* Released under version 2 of the Gnu Public License.
* By Jani Averbach, Jaa@iki.fi, 2001
*/
#include "test.h"
#include "screen_buffer.h"
#define SCREEN_X 80
#define SCREEN_Y 25
#define Y_SIZE SCREEN_Y
/*
* X-size should by one of by screen size,
* so that there is room for ending '\0'
*/
#define X_SIZE SCREEN_X+1
static char screen_buf[Y_SIZE][X_SIZE];
#ifdef SCRN_DEBUG
char *padding = "12345678901234567890123456789012345678901234567890123456789012345678901234567890";
#define CHECK_BOUNDS(y,x) do {if (y < 0 || Y_SIZE <= y || x < 0 || X_SIZE <= x) print_error("out of index");}while(0)
#else /* ! SCRN_DEBUG */
#define CHECK_BOUNDS(y,x)
#endif /* SCRN_DEBUG */
char
get_scrn_buf(const int y,
const int x)
{
CHECK_BOUNDS(y,x);
return screen_buf[y][x];
}
void
set_scrn_buf(const int y,
const int x,
const char val)
{
CHECK_BOUNDS(y,x);
screen_buf[y][x] = val;
}
void clear_screen_buf(void)
{
int y, x;
for (y=0; y < SCREEN_Y; ++y){
for (x=0; x < SCREEN_X; ++x){
CHECK_BOUNDS(y,x);
screen_buf[y][x] = ' ';
}
CHECK_BOUNDS(y,SCREEN_X);
screen_buf[y][SCREEN_X] = '\0';
}
}
void tty_print_region(const int pi_top,
const int pi_left,
const int pi_bottom,
const int pi_right)
{
int y;
char tmp;
for (y=pi_top; y < pi_bottom; ++y){
CHECK_BOUNDS(y, pi_right);
tmp = screen_buf[y][pi_right];
screen_buf[y][pi_right] = '\0';
CHECK_BOUNDS(y, pi_left);
ttyprint(y, pi_left, &(screen_buf[y][pi_left]));
screen_buf[y][pi_right] = tmp;
}
}
void tty_print_line(
int y, int x, const char *text)
{
for(; *text && (x < SCREEN_X); x++, text++) {
if (*text != screen_buf[y][x]) {
break;
}
}
/* If there is nothing to do return */
if (*text == '\0') {
return;
}
ttyprint(y, x, text);
for(; *text && (x < SCREEN_X); x++, text++) {
screen_buf[y][x] = *text;
}
}
void tty_print_screen(void)
{
#ifdef SCRN_DEBUG
int i;
for (i=0; i < SCREEN_Y; ++i)
ttyprint(i,0, padding);
#endif /* SCRN_DEBUG */
tty_print_region(0, 0, SCREEN_Y, SCREEN_X);
}
void print_error(char *pstr)
{
#ifdef SCRN_DEBUG
ttyprint(0,0, padding);
#endif /* SCRN_DEBUG */
ttyprint(0,35, pstr);
while(1);
}