X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Futil.c;h=0d64fc4b2bb70598a4ccb26bb275a64f49d6385d;hb=e1c3ab2bd61a81054b713f735fa31f827d258d76;hp=197f3d8ea17ca09f95b485701357d296feb1190c;hpb=cfe3c8f203bd937ca4cadf7ef6c1bd9b2c603e13;p=lackey diff --git a/src/util.c b/src/util.c index 197f3d8..0d64fc4 100644 --- a/src/util.c +++ b/src/util.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012,2013 Andy Spencer + * Copyright (C) 2012-2013 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -109,6 +109,39 @@ void *alloc0(int size) return data; } +/* File functions */ +char *read_file(const char *path, int *len) +{ + /* we could use stat, but we'll try to be portable */ + FILE *fd = fopen(path, "rt+"); + if (!fd) + return NULL; + + int block = 512; // read size + int size = 512; // buffer size + int slen = 0; // string length + char *buf = malloc(size); + if (!buf) + goto err; + + while (!feof(fd)) { + if (slen + block + 1 > size) { + size *= 2; + buf = realloc(buf, size); + if (!buf) + goto err; + } + slen += fread(&buf[slen], 1, block, fd); + buf[slen] = '\0'; + } + +err: + if (len) + *len = slen; + fclose(fd); + return buf; +} + /* Debugging functions */ void debug(char *fmt, ...) {