diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | main.c | 35 | ||||
-rw-r--r-- | options.c | 3 | ||||
-rw-r--r-- | options.h | 1 | ||||
-rw-r--r-- | util.c | 40 | ||||
-rw-r--r-- | util.h | 3 |
6 files changed, 68 insertions, 16 deletions
@@ -1,6 +1,6 @@ all: sxiv -VERSION=git-20110211 +VERSION=git-20110214 CC?=gcc PREFIX?=/usr/local @@ -81,7 +81,7 @@ int main(int argc, char **argv) { exit(1); } - if (options->recursive) + if (options->recursive || options->from_stdin) filecnt = FNAME_CNT; else filecnt = options->filecnt; @@ -89,15 +89,22 @@ int main(int argc, char **argv) { filenames = (const char**) s_malloc(filecnt * sizeof(const char*)); fileidx = 0; - for (i = 0; i < options->filecnt; ++i) { - filename = options->filenames[i]; - if (!stat(filename, &fstats) && S_ISDIR(fstats.st_mode)) { - if (options->recursive) - read_dir_rec(filename); - else - warn("ignoring directory: %s", filename); - } else { - check_append(filename); + if (options->from_stdin) { + while ((filename = readline(stdin))) { + if (!check_append(filename)) + free((void*) filename); + } + } else { + for (i = 0; i < options->filecnt; ++i) { + filename = options->filenames[i]; + if (!stat(filename, &fstats) && S_ISDIR(fstats.st_mode)) { + if (options->recursive) + read_dir_rec(filename); + else + warn("ignoring directory: %s", filename); + } else { + check_append(filename); + } } } @@ -132,8 +139,8 @@ void update_title() { size = filesize; size_readable(&size, &unit); n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", - fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, - filenames[fileidx]); + fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, + filenames[fileidx]); } else { n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] broken: %s", fileidx + 1, filecnt, filenames[fileidx]); @@ -156,7 +163,7 @@ int check_append(const char *filename) { if (fileidx == filecnt) { filecnt *= 2; filenames = (const char**) s_realloc(filenames, - filecnt * sizeof(const char*)); + filecnt * sizeof(const char*)); } filenames[fileidx++] = filename; return 1; @@ -200,7 +207,7 @@ void read_dir_rec(const char *dirname) { if (diridx == dircnt) { dircnt *= 2; dirnames = (const char**) s_realloc(dirnames, - dircnt * sizeof(const char*)); + dircnt * sizeof(const char*)); } dirnames[diridx++] = filename; } else { @@ -19,6 +19,7 @@ #define _XOPEN_SOURCE #include <stdlib.h> +#include <string.h> #include <stdio.h> #include <unistd.h> @@ -106,4 +107,6 @@ void parse_options(int argc, char **argv) { _options.filenames = (const char**) argv + optind; _options.filecnt = argc - optind; + _options.from_stdin = _options.filecnt == 1 && + strcmp(_options.filenames[0], "-") == 0; } @@ -24,6 +24,7 @@ typedef struct options_s { const char **filenames; int filecnt; + unsigned char from_stdin; scalemode_t scalemode; float zoom; @@ -17,11 +17,13 @@ */ #include <stdlib.h> -#include <stdio.h> +#include <string.h> #include "options.h" #include "util.h" +#define FNAME_LEN 10 + void cleanup(); void* s_malloc(size_t size) { @@ -75,3 +77,39 @@ void size_readable(float *size, const char **unit) { *size /= 1024; *unit = units[MIN(i, LEN(units) - 1)]; } + +char* readline(FILE *stream) { + size_t len; + char *buf, *s, *end; + + if (!stream || feof(stream) || ferror(stream)) + return NULL; + + len = FNAME_LEN; + s = buf = (char*) s_malloc(len * sizeof(char)); + + do { + *s = '\0'; + fgets(s, len - (s - buf), stream); + if ((end = strchr(s, '\n'))) { + *end = '\0'; + } else if (strlen(s) + 1 == len - (s - buf)) { + buf = (char*) s_realloc(buf, 2 * len * sizeof(char)); + s = buf + len - 1; + len *= 2; + } else { + s += strlen(s); + } + } while (!end && !feof(stream) && !ferror(stream)); + + if (!ferror(stream) && *buf) { + s = (char*) s_malloc((strlen(buf) + 1) * sizeof(char)); + strcpy(s, buf); + } else { + s = NULL; + } + + free(buf); + + return s; +} @@ -19,6 +19,7 @@ #ifndef UTIL_H #define UTIL_H +#include <stdio.h> #include <stdarg.h> #define ABS(a) ((a) < 0 ? (-(a)) : (a)) @@ -34,4 +35,6 @@ void die(const char*, ...); void size_readable(float*, const char**); +char* readline(FILE*); + #endif /* UTIL_H */ |