#include #include #include #include #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; }