diff options
author | Krow Savcik <krow@savcik.xyz> | 2025-08-31 15:11:01 +0200 |
---|---|---|
committer | Krow Savcik <krow@savcik.xyz> | 2025-08-31 15:11:01 +0200 |
commit | 0fa7537ce5006a9c99bc7e295a4ae4ff0b920fda (patch) | |
tree | 057a91b30ab61417970c5defe825ce16a094ac39 /util.c |
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 88 |
1 files changed, 88 insertions, 0 deletions
@@ -0,0 +1,88 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> + +#include "util.h" +#include "debug.h" /* Probably shouldn't have debug in utils */ + +char * +s_cpy(const char *str) +{ + if (str == NULL) + return NULL; + + char *ret = malloc(strlen(str) + 1); + if (ret == NULL) + error("Not enough memory\n"); + + strcpy(ret, str); + return ret; +} + +char * +s_con(const char *str, ...) +{ + size_t len; + va_list args; + const char *ar; + char *ret, *p; + + len = strlen(str) + 1; + va_start(args, str); + while (ar = va_arg(args, const char*)) + len += strlen(ar); + va_end(args); + + ret = malloc(len); + if (ret == NULL) + error("Not enough memory\n"); + p = stpcpy(ret, str); + + va_start(args, str); + while (ar = va_arg(args, const char*)) + p = stpcpy(p, ar); + va_end(args); + + return ret; +} + +char * +f_read(const char *path) +{ + FILE *f; + char *buf; + long bsize; + buf = NULL; + if ((f = fopen(path, "r")) == NULL) + goto fread_deffer; + + if (fseek(f, 0L, SEEK_END)) + goto fread_deffer; + + if ((bsize = ftell(f)) == -1) + goto fread_deffer; + + buf = calloc(sizeof(*buf), bsize + 1); + + if (buf == NULL) + goto fread_deffer; + + if (fseek(f, 0L, SEEK_SET)) + goto fread_deffer; + + bsize = (long) fread(buf, sizeof(*buf), bsize, f); + if (ferror(f) != 0) + goto fread_deffer; + + buf[bsize] = '\0'; + fclose(f); + + return buf; +fread_deffer: + if (f) + fclose(f); + if (buf) + free(buf); + return NULL; +} |