Read filenames from stdin
This commit is contained in:
parent
ea65610747
commit
26cc5aff69
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
|||
all: sxiv
|
||||
|
||||
VERSION=git-20110209
|
||||
VERSION=git-20110214
|
||||
|
||||
CC?=gcc
|
||||
PREFIX?=/usr/local
|
||||
|
|
27
main.c
27
main.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
40
util.c
40
util.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue