From 1da71680f7695dfe0fd034596e8cc988784d2913 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 12 Jan 2026 05:12:54 +0900 Subject: [PATCH] add getline impl --- engine/include/GearSrc/File.h | 4 ++ engine/{ => resource}/font/8x16.bdf | 0 engine/src/getline.c | 54 +++++++++++++++++++ engine/tools/CMakeLists.txt | 1 + .../gs_dumpfont/{gb_dumpfont.c => main.c} | 8 +-- 5 files changed, 64 insertions(+), 3 deletions(-) rename engine/{ => resource}/font/8x16.bdf (100%) create mode 100644 engine/src/getline.c rename engine/tools/gs_dumpfont/{gb_dumpfont.c => main.c} (90%) diff --git a/engine/include/GearSrc/File.h b/engine/include/GearSrc/File.h index eb88a85..f02fa02 100644 --- a/engine/include/GearSrc/File.h +++ b/engine/include/GearSrc/File.h @@ -8,12 +8,16 @@ extern "C" { #endif +/* file.c */ GSDECL GSFile GSFileOpen(GSEngine engine, const char* path); GSDECL int GSFileRead(GSFile file, void* out, int size); GSDECL void GSFileSeek(GSFile file, int pos); GSDECL unsigned int GSFileSize(GSFile file); GSDECL void GSFileClose(GSFile file); +/* getline.c */ +GSDECL int GSFileGetLine(char** lineptr, int* n, FILE* fp); + #ifdef __cplusplus } #endif diff --git a/engine/font/8x16.bdf b/engine/resource/font/8x16.bdf similarity index 100% rename from engine/font/8x16.bdf rename to engine/resource/font/8x16.bdf diff --git a/engine/src/getline.c b/engine/src/getline.c new file mode 100644 index 0000000..0fc4600 --- /dev/null +++ b/engine/src/getline.c @@ -0,0 +1,54 @@ +#include + +#define GETLINE_MINSIZE 16 + +int GSFileGetLine(char** lineptr, int* n, FILE* fp) { + int ch; + int i = 0; + char free_on_err = 0; + char* p; + + if(lineptr == NULL || n == NULL || fp == NULL) { + return -1; + } + if(*lineptr == NULL) { + *n = GETLINE_MINSIZE; + *lineptr = (char*)malloc(sizeof(char) * (*n)); + if(*lineptr == NULL) { + return -1; + } + free_on_err = 1; + } + + for(i = 0;; i++) { + ch = fgetc(fp); + while(i >= (*n) - 2) { + *n *= 2; + p = realloc(*lineptr, sizeof(char) * (*n)); + if(p == NULL) { + if(free_on_err) + free(*lineptr); + return -1; + } + *lineptr = p; + } + if(ch == EOF) { + if(i == 0) { + if(free_on_err) + free(*lineptr); + return -1; + } + (*lineptr)[i] = '\0'; + *n = i; + return i; + } + + if(ch == '\n') { + (*lineptr)[i] = '\n'; + (*lineptr)[i + 1] = '\0'; + *n = i + 1; + return i + 1; + } + (*lineptr)[i] = (char)ch; + } +} diff --git a/engine/tools/CMakeLists.txt b/engine/tools/CMakeLists.txt index abc8f3c..455658f 100644 --- a/engine/tools/CMakeLists.txt +++ b/engine/tools/CMakeLists.txt @@ -5,6 +5,7 @@ include(GNUInstallDirs) macro(compile_tool name) file(GLOB ${name}_SRC ${name}/*.c) add_executable(${name} ${${name}_SRC}) + target_link_libraries(${name} PRIVATE GearSrc) install_target(${name}) endmacro() diff --git a/engine/tools/gs_dumpfont/gb_dumpfont.c b/engine/tools/gs_dumpfont/main.c similarity index 90% rename from engine/tools/gs_dumpfont/gb_dumpfont.c rename to engine/tools/gs_dumpfont/main.c index b3414f8..8528462 100644 --- a/engine/tools/gs_dumpfont/gb_dumpfont.c +++ b/engine/tools/gs_dumpfont/main.c @@ -2,14 +2,16 @@ #include #include +#include + #include #define CHECK(s) ((linelen > strlen(s)) && memcmp(line, s, strlen(s)) == 0) int main() { char* line = NULL; - size_t linesize; - ssize_t linelen; + int linesize; + int linelen; int iw, ih; unsigned char* font = NULL; int c; @@ -17,7 +19,7 @@ int main() { int y = 0; int w, h; - while((linelen = getline(&line, &linesize, stdin)) != -1) { + while((linelen = GSFileGetLine(&line, &linesize, stdin)) != -1) { linelen--; line[linelen] = 0;