diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -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; +} |