diff options
author | Harry Jeffery <harry@exec64.co.uk> | 2016-01-15 16:16:10 +0000 |
---|---|---|
committer | Harry Jeffery <harry@exec64.co.uk> | 2016-01-15 16:16:10 +0000 |
commit | 58fe28b650dfcdd3efe78fb0559cab5b7e811bb5 (patch) | |
tree | 73d290727b720e39b36c8165e1ea9202374726f3 /src/util.c | |
parent | efa33ab844a09f05907a5de2d66ed7331c4f8ec9 (diff) | |
parent | 1ae8a7fe6030771352e347e7564639ea181802ba (diff) | |
download | imv-58fe28b650dfcdd3efe78fb0559cab5b7e811bb5.tar.gz |
Merge pull request #76 from czarkoff/loader
Loading image data from standard input
Diffstat (limited to 'src/util.c')
-rw-r--r-- | src/util.c | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -16,9 +16,36 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "util.h" - +#include <unistd.h> +#include <stddef.h> +#include <errno.h> #include <fontconfig/fontconfig.h> +size_t read_from_stdin(void **buffer) { + size_t len = 0; + ssize_t r; + size_t step = 1024; /* Arbitrary value of 1 KiB */ + void *p; + + errno = 0; /* clear errno */ + + for(*buffer = NULL; (*buffer = realloc((p = *buffer), len + step)); + len += (size_t)r) { + if((r = read(STDIN_FILENO, (uint8_t *)*buffer + len, step)) <= 0) { + break; + } + } + + /* realloc(3) leaves old buffer allocated in case of error */ + if(*buffer == NULL && p != NULL) { + int save = errno; + free(p); + errno = save; + len = 0; + } + return len; +} + TTF_Font *load_font(const char *font_spec) { int font_size; |