summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..54586c4
--- /dev/null
+++ b/util.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "util.h"
+
+int
+read_file(char *path, char **output, size_t * read_size)
+{
+ long file_size;
+ FILE *fp;
+
+ fp = fopen(path, "r");
+ if (fp == NULL)
+ return -1;
+
+ /* get file size */
+ if (fseek(fp, 0L, SEEK_END) != 0)
+ return -1;
+
+ file_size = ftell(fp);
+ if (file_size < 0)
+ return -1;
+
+ /* rewind to file start */
+ if (fseek(fp, 0L, SEEK_SET) != 0)
+ return -1;
+
+ /* create output buffer */
+ *output = malloc(sizeof(char) * (file_size + 1));
+ if (*output == NULL)
+ return -1;
+
+ /* read the file */
+ *read_size = fread(*output, sizeof(char), file_size, fp);
+ if (*read_size == 0 || ferror(fp) != 0) {
+ free(*output);
+ return -1;
+ }
+ /* enforce string termination */
+ (*output)[*read_size] = '\0';
+
+ return 0;
+}