diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index e84afa96e6..069c0a4321 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -81,7 +81,7 @@ static config_file_t *config_file_new_internal( static char *getaline(FILE *file) { - char* newline = (char*)malloc(9); + char* newline = (char*)malloc(9); char* newline_tmp = NULL; size_t cur_size = 8; size_t idx = 0; diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 8c1ec1db9c..3d5862b3da 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -65,6 +65,8 @@ int filestream_read_file(const char *path, void **buf, ssize_t *len); char *filestream_gets(RFILE *stream, char *s, size_t len); +char *filestream_getline(RFILE *stream); + int filestream_getc(RFILE *stream); bool filestream_write_file(const char *path, const void *data, ssize_t size); diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index aec36f6400..275639815b 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -243,6 +243,41 @@ error: return NULL; } +char *filestream_getline(RFILE *stream) +{ + char* newline = (char*)malloc(9); + char* newline_tmp = NULL; + size_t cur_size = 8; + size_t idx = 0; + int in = filestream_getc(stream); + + if (!newline) + return NULL; + + while (in != EOF && in != '\n') + { + if (idx == cur_size) + { + cur_size *= 2; + newline_tmp = (char*)realloc(newline, cur_size + 1); + + if (!newline_tmp) + { + free(newline); + return NULL; + } + + newline = newline_tmp; + } + + newline[idx++] = in; + in = filestream_getc(stream); + } + + newline[idx] = '\0'; + return newline; +} + char *filestream_gets(RFILE *stream, char *s, size_t len) { if (!stream)