#include #include #include #include #include #include #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, "", 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-1) { set_character('\0', p); p=0; } #ifdef FXCG50 if (dsize(¤t_line->text[0])>396-3) { set_character('\0', p); p=0; } #endif i++; } } void ll_display_custom(log_line* line) { dclear(C_WHITE); for (int i=0; i<8; i++) { #ifdef FX9860G show_line(line, 63 - 8*(i+1)); #endif #ifdef FXCG50 show_line(line, 224 - 13*(i+1)); #endif line=line->previous; if (!line) break; } dupdate(); } void ll_display() { ll_display_custom(current_line); } GNORETURN void ll_panic() { log_line* line=current_line; while (1) { ll_display_custom(line); int key = getkey().key; if (key==KEY_UP) { log_line* linet=line->previous; if (linet) line=linet; } if (key==KEY_DOWN) { log_line* linet=line->next; if (linet) line=linet; } } } void ll_set_panic() { gint_panic_set(ll_panic); }