aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2021-11-19 11:08:01 +0100
committerN-R-K <79544946+N-R-K@users.noreply.github.com>2021-11-19 12:02:50 +0100
commit2df33208d76159ffacffce3c8a8edc3a5ad7ea7b (patch)
tree8ce2bcd800b175640b07b84235b504ccc4ba8c39 /main.c
parent4a282da692fa7b8471c1399b30010de80448bda9 (diff)
downloadnsxiv-2df33208d76159ffacffce3c8a8edc3a5ad7ea7b.tar.zst
apply -0 to stdin/-i as well
while i was initially against this since it can be done via `xargs -0`. the problem with this approach is that there's a limit to how many args a command can recieve, leading to problem like this [0] when opening large (1k~) amount of images. there's no limit on how big stdin can be, so being able to read a null-separated list from stdin doesn't have this problem. [0]: https://github.com/ranger/ranger/pull/2307#issuecomment-818683515
Diffstat (limited to 'main.c')
-rw-r--r--main.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/main.c b/main.c
index a4af92b..5bab026 100644
--- a/main.c
+++ b/main.c
@@ -105,6 +105,14 @@ void cleanup(void)
win_close(&win);
}
+static bool xgetline(char **lineptr, size_t *n)
+{
+ ssize_t len = getdelim(lineptr, n, options->using_null ? '\0' : '\n', stdin);
+ if (!options->using_null && len > 0 && (*lineptr)[len-1] == '\n')
+ (*lineptr)[len-1] = '\0';
+ return len > 0;
+}
+
void check_add_file(char *filename, bool given)
{
char *path;
@@ -853,7 +861,6 @@ int main(int argc, char *argv[])
{
int i, start;
size_t n;
- ssize_t len;
char *filename;
const char *homedir, *dsuffix = "";
struct stat fstats;
@@ -889,11 +896,8 @@ int main(int argc, char *argv[])
if (options->from_stdin) {
n = 0;
filename = NULL;
- while ((len = getline(&filename, &n, stdin)) > 0) {
- if (filename[len-1] == '\n')
- filename[len-1] = '\0';
+ while (xgetline(&filename, &n))
check_add_file(filename, true);
- }
free(filename);
}