diff --git a/file.c b/file.c index 18f3f76..3b5b366 100644 --- a/file.c +++ b/file.c @@ -157,4 +157,66 @@ void fileRewind(file_t *ctx) { uint64_t fileTell(file_t *ctx) { return (uint64_t)ftell((FILE*)ctx->handle); } -#endif \ No newline at end of file +#endif + +static fread_buf_t _readWholeInternal(file_t *ctx, bool null_terminated) { + fread_buf_t contents = {0}; + uint64_t fsize = 0; + + if(!fileSeekEnd(ctx)) { + err("file: couldn't read until end"); + goto failed; + } + + fsize = fileTell(ctx); + fileRewind(ctx); + + contents.len = fsize; + contents.buf = malloc(fsize + null_terminated); + if(!contents.buf) { + err("file: couldn't allocate buffer"); + goto failed; + } + + size_t read = fileRead(ctx, contents.buf, fsize); + if(read != fsize) { + err("file: read wrong amount of bytes: %zu instead of %zu", read, fsize); + goto failed_free; + } + + if(null_terminated) { + contents.buf[contents.len] = '\0'; + } + +failed: + return contents; +failed_free: + free(contents.buf); + return contents; +} + +fread_buf_t fileReadWhole(const char *fname) { + file_t fp = fileOpen(fname, FILE_READ); + fread_buf_t contents = fileReadWholeFP(&fp); + fileClose(&fp); + return contents; +} + +fread_buf_t fileReadWholeFP(file_t *ctx) { + return _readWholeInternal(ctx, false); +} + +str_t fileReadWholeText(const char *fname) { + file_t fp = fileOpen(fname, FILE_READ); + str_t contents = fileReadWholeFPText(&fp); + fileClose(&fp); + return contents; +} + +str_t fileReadWholeFPText(file_t *ctx) { + fread_buf_t contents = _readWholeInternal(ctx, true); + return (str_t) { + .buf = contents.buf, + .len = contents.len + }; +} \ No newline at end of file diff --git a/file.h b/file.h index 7044772..332fd37 100644 --- a/file.h +++ b/file.h @@ -15,6 +15,11 @@ typedef struct { void *handle; } file_t; +typedef struct { + char *buf; + size_t len; +} fread_buf_t; + file_t fileOpen(const char *fname, int mode); void fileClose(file_t *ctx); @@ -33,6 +38,12 @@ void fileRewind(file_t *ctx); uint64_t fileTell(file_t *ctx); +fread_buf_t fileReadWhole(const char *fname); +fread_buf_t fileReadWholeFP(file_t *ctx); + +str_t fileReadWholeText(const char *fname); +str_t fileReadWholeFPText(file_t *ctx); + #ifdef __cplusplus } // extern "C" #endif \ No newline at end of file diff --git a/tracelog.c b/tracelog.c index 43a84f7..156adac 100644 --- a/tracelog.c +++ b/tracelog.c @@ -2,7 +2,6 @@ #include #include -#include #include #ifdef _WIN32 @@ -50,7 +49,14 @@ bool use_newline = true; -void traceLog(LogLevel level, const char *fmt, ...) { +void traceLog(int level, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + traceLogVaList(level, fmt, args); + va_end(args); +} + +void traceLogVaList(int level, const char *fmt, va_list args) { char buffer[MAX_TRACELOG_MSG_LENGTH]; memset(buffer, 0, sizeof(buffer)); @@ -68,10 +74,7 @@ void traceLog(LogLevel level, const char *fmt, ...) { size_t offset = strlen(beg); strncpy(buffer, beg, sizeof(buffer)); - va_list args; - va_start(args, fmt); vsnprintf(buffer + offset, sizeof(buffer) - offset, fmt, args); - va_end(args); #ifdef TLOG_VS OutputDebugStringA(buffer); diff --git a/tracelog.h b/tracelog.h index 554099f..1628423 100644 --- a/tracelog.h +++ b/tracelog.h @@ -11,15 +11,17 @@ extern "C" { */ #include +#include -typedef enum { +enum { LogAll, LogTrace, LogDebug, LogInfo, LogWarning, LogError, LogFatal -} LogLevel; +}; -void traceLog(LogLevel level, const char *fmt, ...); +void traceLog(int level, const char *fmt, ...); +void traceLogVaList(int level, const char *fmt, va_list args); void traceUseNewline(bool use_newline); -#define tall(...) traceLog(LogAll, __VA_ARGS__) +#define tall(...) traceLog(LogAll, __VA_ARGS__) #define trace(...) traceLog(LogTrace, __VA_ARGS__) #define debug(...) traceLog(LogDebug, __VA_ARGS__) #define info(...) traceLog(LogInfo, __VA_ARGS__)