#include #include #include #include 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; /* Buffer of the file contents. */ char *buf; /* 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; } char *find_line(char *str) { for (; *str != '\n' && *str != '\0'; str++); return str; } 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 = find_line(buf)) { char *value; char *name = strtok_r(buf, "=", &value); } }