From 9b5f6ae5f460c8642286cf174751a317f155d043 Mon Sep 17 00:00:00 2001 From: Dennis Vesterlund Date: Thu, 21 Feb 2019 15:34:32 +0100 Subject: Added function to print content from file (#331) Added a function to print file contents to status bar without newlines. Added tests for print file contents function Added manpage entry for file contents --- src/print_file_contents.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/print_file_contents.c (limited to 'src/print_file_contents.c') 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#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); +} -- cgit v1.2.3