diff options
author | Orestis Floros <orestisflo@gmail.com> | 2020-05-01 12:15:30 +0200 |
---|---|---|
committer | Orestis Floros <orestisflo@gmail.com> | 2020-05-01 12:16:55 +0200 |
commit | d8e8eb2eef04443d3489d79cf5bf02d8ee2373c2 (patch) | |
tree | 84620675c39db4a78bd1fb7ce52cba83c8b9f56e /src | |
parent | 675c423647864837e1261a01202cd932d548e1cd (diff) |
Move general functions scalloc, sstrdup out of i3status.c
Diffstat (limited to 'src')
-rw-r--r-- | src/general.c | 56 | ||||
-rw-r--r-- | src/print_file_contents.c | 8 |
2 files changed, 56 insertions, 8 deletions
diff --git a/src/general.c b/src/general.c index e3d4f96..c089126 100644 --- a/src/general.c +++ b/src/general.c @@ -6,11 +6,19 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include <glob.h> #include <sys/fcntl.h> #include <sys/stat.h> #include "i3status.h" +#define exit_if_null(pointer, ...) \ + { \ + if (pointer == NULL) \ + die(__VA_ARGS__); \ + } + + /* * Reads size bytes into the destination buffer from filename. * @@ -34,6 +42,54 @@ bool slurp(const char *filename, char *destination, int size) { } /* + * This function resolves ~ in pathnames. + * It may resolve wildcards in the first part of the path, but if no match + * or multiple matches are found, it just returns a copy of path as given. + * + */ +char *resolve_tilde(const char *path) { + static glob_t globbuf; + char *head, *tail, *result = NULL; + + tail = strchr(path, '/'); + head = strndup(path, tail ? (size_t)(tail - path) : strlen(path)); + + int res = glob(head, GLOB_TILDE, NULL, &globbuf); + free(head); + /* no match, or many wildcard matches are bad */ + if (res == GLOB_NOMATCH || globbuf.gl_pathc != 1) + result = sstrdup(path); + else if (res != 0) { + die("glob() failed"); + } else { + head = globbuf.gl_pathv[0]; + result = scalloc(strlen(head) + (tail ? strlen(tail) : 0) + 1); + strcpy(result, head); + if (tail) { + strcat(result, tail); + } + } + globfree(&globbuf); + + return result; +} + +char *sstrdup(const char *str) { + if (str == NULL) { + return NULL; + } + char *result = strdup(str); + exit_if_null(result, "Error: out of memory (strdup())\n"); + return result; +} + +void *scalloc(size_t size) { + void *result = calloc(size, 1); + exit_if_null(result, "Error: out of memory (calloc(%zu))\n", size); + return result; +} + +/* * Skip the given character for exactly 'amount' times, returns * a pointer to the first non-'character' character in 'input'. * diff --git a/src/print_file_contents.c b/src/print_file_contents.c index 65813f5..37701f1 100644 --- a/src/print_file_contents.c +++ b/src/print_file_contents.c @@ -14,14 +14,6 @@ #define STRING_SIZE 10 -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; |