mirror of
https://gitlab.com/Theopse/fbi-i18n-zh.git
synced 2025-04-06 03:58:02 +08:00
124 lines
2.9 KiB
C
124 lines
2.9 KiB
C
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <3ds.h>
|
|
|
|
#include "error.h"
|
|
|
|
extern void cleanup();
|
|
|
|
static int util_get_line_length(PrintConsole* console, const char* str) {
|
|
int lineLength = 0;
|
|
while(*str != 0) {
|
|
if(*str == '\n') {
|
|
break;
|
|
}
|
|
|
|
lineLength++;
|
|
if(lineLength >= console->consoleWidth - 1) {
|
|
break;
|
|
}
|
|
|
|
str++;
|
|
}
|
|
|
|
return lineLength;
|
|
}
|
|
|
|
static int util_get_lines(PrintConsole* console, const char* str) {
|
|
int lines = 1;
|
|
int lineLength = 0;
|
|
while(*str != 0) {
|
|
if(*str == '\n') {
|
|
lines++;
|
|
lineLength = 0;
|
|
} else {
|
|
lineLength++;
|
|
if(lineLength >= console->consoleWidth - 1) {
|
|
lines++;
|
|
lineLength = 0;
|
|
}
|
|
}
|
|
|
|
str++;
|
|
}
|
|
|
|
return lines;
|
|
}
|
|
|
|
void error_panic(const char* s, ...) {
|
|
va_list list;
|
|
va_start(list, s);
|
|
|
|
char buf[1024];
|
|
vsnprintf(buf, 1024, s, list);
|
|
|
|
va_end(list);
|
|
|
|
gspWaitForVBlank();
|
|
|
|
u16 width;
|
|
u16 height;
|
|
for(int i = 0; i < 2; i++) {
|
|
memset(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, &width, &height), 0, (size_t) (width * height * 3));
|
|
memset(gfxGetFramebuffer(GFX_TOP, GFX_RIGHT, &width, &height), 0, (size_t) (width * height * 3));
|
|
memset(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, &width, &height), 0, (size_t) (width * height * 3));
|
|
|
|
gfxSwapBuffers();
|
|
}
|
|
|
|
PrintConsole* console = consoleInit(GFX_TOP, NULL);
|
|
|
|
const char* header = "FBI has encountered a fatal error!";
|
|
const char* footer = "Press any button to exit.";
|
|
|
|
printf("\x1b[0;0H");
|
|
for(int i = 0; i < console->consoleWidth; i++) {
|
|
printf("-");
|
|
}
|
|
|
|
printf("\x1b[%d;0H", console->consoleHeight - 1);
|
|
for(int i = 0; i < console->consoleWidth; i++) {
|
|
printf("-");
|
|
}
|
|
|
|
printf("\x1b[0;%dH%s", (console->consoleWidth - util_get_line_length(console, header)) / 2, header);
|
|
printf("\x1b[%d;%dH%s", console->consoleHeight - 1, (console->consoleWidth - util_get_line_length(console, footer)) / 2, footer);
|
|
|
|
int bufRow = (console->consoleHeight - util_get_lines(console, buf)) / 2;
|
|
char* str = buf;
|
|
while(*str != 0) {
|
|
if(*str == '\n') {
|
|
bufRow++;
|
|
str++;
|
|
continue;
|
|
} else {
|
|
int lineLength = util_get_line_length(console, str);
|
|
|
|
char old = *(str + lineLength);
|
|
*(str + lineLength) = '\0';
|
|
printf("\x1b[%d;%dH%s", bufRow, (console->consoleWidth - lineLength) / 2, str);
|
|
*(str + lineLength) = old;
|
|
|
|
bufRow++;
|
|
str += lineLength;
|
|
}
|
|
}
|
|
|
|
gfxFlushBuffers();
|
|
gspWaitForVBlank();
|
|
|
|
while(aptMainLoop()) {
|
|
hidScanInput();
|
|
if(hidKeysDown() & ~KEY_TOUCH) {
|
|
break;
|
|
}
|
|
|
|
gspWaitForVBlank();
|
|
}
|
|
|
|
cleanup();
|
|
exit(1);
|
|
} |