X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Futil.c;h=a59283a8dd044a788a645b3296b481bcce4c621d;hb=51d230ad4ca1bc4202ffb1b7e9157944542e3596;hp=32c3c57e15d5bd2f206bab5a1984a00e19dff06a;hpb=a7e8c4dd466741d02873a81766192198dad6d570;p=i3%2Fi3 diff --git a/src/util.c b/src/util.c index 32c3c57e..a59283a8 100644 --- a/src/util.c +++ b/src/util.c @@ -475,3 +475,43 @@ bool parse_long(const char *str, long *out, int base) { *out = result; return true; } + +/* + * Slurp reads path in its entirety into buf, returning the length of the file + * or -1 if the file could not be read. buf is set to a buffer of appropriate + * size, or NULL if -1 is returned. + * + */ +ssize_t slurp(const char *path, char **buf) { + FILE *f; + if ((f = fopen(path, "r")) == NULL) { + ELOG("Cannot open file \"%s\": %s\n", path, strerror(errno)); + return -1; + } + struct stat stbuf; + if (fstat(fileno(f), &stbuf) != 0) { + ELOG("Cannot fstat() \"%s\": %s\n", path, strerror(errno)); + fclose(f); + return -1; + } + /* Allocate one extra NUL byte to make the buffer usable with C string + * functions. yajl doesn’t need this, but this makes slurp safer. */ + *buf = scalloc(stbuf.st_size + 1, 1); + size_t n = fread(*buf, 1, stbuf.st_size, f); + fclose(f); + if ((ssize_t)n != stbuf.st_size) { + ELOG("File \"%s\" could not be read entirely: got %zd, want %" PRIi64 "\n", path, n, (int64_t)stbuf.st_size); + free(*buf); + *buf = NULL; + return -1; + } + return (ssize_t)n; +} + +/* + * Convert a direction to its corresponding orientation. + * + */ +orientation_t orientation_from_direction(direction_t direction) { + return (direction == D_LEFT || direction == D_RIGHT) ? HORIZ : VERT; +}