add getline impl

This commit is contained in:
Nishi 2026-01-12 05:12:54 +09:00
commit 1da71680f7
Signed by: nishi
GPG key ID: 27EF69B208EB9343
5 changed files with 64 additions and 3 deletions

View file

@ -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

54
engine/src/getline.c Normal file
View file

@ -0,0 +1,54 @@
#include <GearSrc/File.h>
#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;
}
}

View file

@ -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()

View file

@ -2,14 +2,16 @@
#include <stdlib.h>
#include <string.h>
#include <GearSrc/File.h>
#include <stb_image_write.h>
#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;