diff options
Diffstat (limited to 'src/print_file_contents.c')
-rw-r--r-- | src/print_file_contents.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/print_file_contents.c b/src/print_file_contents.c new file mode 100644 index 0000000..afbe3e3 --- /dev/null +++ b/src/print_file_contents.c @@ -0,0 +1,73 @@ +// vim:ts=4:sw=4:expandtab + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <yajl/yajl_gen.h> +#include <yajl/yajl_version.h> +#include <sys/types.h> + +#include <sys/fcntl.h> +#include <unistd.h> +#include <errno.h> +#include "i3status.h" + +static void *scalloc(size_t size) { + void *result = calloc(size, 1); + if (result == NULL) { + die("Error: out of memory (calloc(%zu))\n", size); + } + return result; +} + +void print_file_contents(yajl_gen json_gen, char *buffer, const char *title, const char *path, const char *format, const char *format_bad, const int max_chars) { + const char *walk = format; + char *outwalk = buffer; + char *buf = scalloc(max_chars * sizeof(char)); + + int n = -1; + int fd = open(path, O_RDONLY); + + INSTANCE(path); + + if (fd > -1) { + n = read(fd, buf, max_chars); + if (n != -1) { + buf[n] = '\0'; + } + (void)close(fd); + START_COLOR("color_good"); + } else if (errno != 0) { + walk = format_bad; + START_COLOR("color_bad"); + } + + for (; *walk != '\0'; walk++) { + if (*walk != '%') { + *(outwalk++) = *walk; + } else if (BEGINS_WITH(walk + 1, "title")) { + outwalk += sprintf(outwalk, "%s", title); + walk += strlen("title"); + } else if (BEGINS_WITH(walk + 1, "content")) { + for (char *s = buf; *s != '\0' && n > 0; s++, n--) { + if (*s != '\n') { + *(outwalk++) = *s; + } + } + walk += strlen("content"); + } else if (BEGINS_WITH(walk + 1, "errno")) { + outwalk += sprintf(outwalk, "%d", errno); + walk += strlen("errno"); + } else if (BEGINS_WITH(walk + 1, "error")) { + outwalk += sprintf(outwalk, "%s", strerror(errno)); + walk += strlen("error"); + } else { + *(outwalk++) = '%'; + } + } + + free(buf); + + END_COLOR; + OUTPUT_FULL_TEXT(buffer); +} |