diff options
-rw-r--r-- | config.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/config.c b/config.c new file mode 100644 index 0000000..d1bdb10 --- /dev/null +++ b/config.c @@ -0,0 +1,82 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +char *read_file(const char *filename, long *size) { + /* Open the file. */ + FILE *fp = fopen(filename, "r"); + /* Size of the file, in bytes. */ + long filesize = 0; + + /* Return NULL, if we couldn't open the file. */ + if (fp == NULL) { + fclose(fp); + return NULL; + } + + /* Return NULL, if we couldn't seek to the end of the file. */ + if (fseek(fp, 0L, SEEK_END)) { + fclose(fp); + return NULL; + } + + /* Get the size of the file, in bytes. */ + filesize = ftell(fp); + + /* Return NULL, if the returned size is negative. */ + if (*filesize < 0) { + fclose(fp); + return NULL; + } + + /* Allocate enough space for the entire file, plus one. */ + buf = malloc(filesize+1); + + /* Return NULL, if the buffer wasn't allocated. */ + if (buf == NULL) { + fclose(fp); + free(cfg); + return NULL; + } + + /* Zero out the buffer. */ + memset(buf, 0, filesize+1); + + /* Seek back to the start of the file. */ + rewind(fp); + /* Read the entire file contents into the buffer. */ + fread(buf, sizeof(char), filesize, fp); + /* Close the file. */ + fclose(fp); + + /* Return the filesize, in bytes. */ + *size = filesize; + /* Return the buffer. */ + return buf; +} + +config *parse_config(const char *filename) { + /* Size of the file, in bytes. */ + long filesize = 0; + /* Config settings. */ + config *cfg; + /* Buffer of the file contents. */ + char *buf = read_file(filename, &filesize); + + /* Return NULL, if the buffer wasn't allocated */ + if (buf == NULL) { + return NULL; + } + + cfg = malloc(sizeof(config)); + + /* Return NULL, if cfg wasn't allocated. */ + if (cfg == NULL) { + free(buf); + return NULL; + } + + for (; *buf != '\0'; buf++) { + } +} |