liblog/liblog.c

136 lines
2.1 KiB
C

#include <gint/exc.h>
#include <gint/keyboard.h>
#include <gint/display.h>
#include <gint/std/stdlib.h>
#include <gint/defs/attributes.h>
#include <liblog.h>
#ifdef FX9860G
#define MAX_LENGHT 21
#define WIDTH 8
#endif
#ifdef FXCG50
#define MAX_LENGHT 150
#define WIDTH 17
#endif
typedef struct log_line log_line;
typedef struct log_line
{
void* previous;
#ifdef FXCG50
char text[MAX_LENGHT];
#endif
#ifdef FX9860G
char text[MAX_LENGHT];
#endif
void* next;
} log_line;
static log_line first_line=
{
0,
"<Log beginning>",
0
};
static log_line* current_line=&first_line;
static log_line* add_line()
{
current_line->next = malloc(sizeof(log_line));
log_line* previous = current_line;
current_line = current_line->next;
current_line->previous=previous;
current_line->next=0;
current_line->text[0]=' ';
}
static void clear_log()
{
while (current_line->previous)
{
log_line* next=current_line->previous;
free(current_line);
current_line=next;
}
}
static void show_line(const log_line* l, int y)
{
dtext(1, y, &l->text[0], C_BLACK, C_NONE);
}
static void set_character(char c, int x)
{
if (c=='\0' || c=='\n')
{
current_line->text[x]= '\0';
add_line();
}
else
{
current_line->text[x] = c;
}
}
// log something
void ll_send(const char * txt)
{
add_line();
char c=1;
int i=0;
int p=0;
while (c)
{
c=txt[i];
set_character(c,p);
p++;
if (c=='\0' || c=='\n')
p=0;
if (p==MAX_LENGHT)
{
p=0;
add_line();
}
i++;
}
}
void ll_display()
{
dclear(C_WHITE);
for (int i=0; i<8; i++)
{
#ifdef FX9860G
show_line(current_line, 63 - 8*i);
#endif
#ifdef FXCG50
show_line(current_line, 224 - 13*i);
#endif
current_line=current_line->previous;
if (!current_line)
break;
}
dupdate();
}
GNORETURN void ll_panic()
{
ll_display();
while (1)
getkey();
}
void ll_set_panic()
{
gint_panic_set(ll_panic);
}