summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..3232168
--- /dev/null
+++ b/util.c
@@ -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;
+}