Hello, below is patch for the applet "paste". It's function when handling multiple files with diffrent lengths is very broken. For visualization I made an asciinema: https://asciinema.org/a/ps8rwjOHmiBDcgUwFWwvdV6Yf Cheers, kroovy
``` >From 59b8ed07f921c1b733f69b052b8fb09cd1698a8c Mon Sep 17 00:00:00 2001 From: kroovy <[email protected]> Date: Thu, 27 Feb 2025 15:59:12 +0100 Subject: [PATCH] paste: rewrite paste_files() to fix handling files with different number of entries --- coreutils/paste.c | 59 +++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/coreutils/paste.c b/coreutils/paste.c index 3e5f20158..5add2370d 100644 --- a/coreutils/paste.c +++ b/coreutils/paste.c @@ -34,37 +34,42 @@ static void paste_files(FILE** files, int file_cnt, char* delims, int del_cnt) { - char *line; - char delim; - int active_files = file_cnt; - int i; - - while (active_files > 0) { - int del_idx = 0; - - for (i = 0; i < file_cnt; ++i) { - if (files[i] == NULL) - continue; - - line = xmalloc_fgetline(files[i]); - if (!line) { - fclose_if_not_stdin(files[i]); - files[i] = NULL; - --active_files; - continue; + char c, d; + size_t i, m; + ssize_t last; + +nextline: + last = -1; + + for (i = 0; i < file_cnt; i++) { + d = delims[i % del_cnt]; + c = 0; + + while ((c = fgetc(files[i])) != 255) { + for (m = last + 1; m < i; m++) { + if (delims[m % del_cnt] != '\0') + fputc(delims[m % del_cnt], stdout); } - fputs_stdout(line); - free(line); - delim = '\n'; - if (i != file_cnt - 1) { - delim = delims[del_idx++]; - if (del_idx == del_cnt) - del_idx = 0; + last = i; + if (c == '\n') { + if (i != file_cnt - 1) + c = d; + fputc(c, stdout); + break; } - if (delim != '\0') - fputc(delim, stdout); + fputc(c, stdout); + } + + if (c == 255 && last != -1) { + if (i == file_cnt - 1) + putchar('\n'); + else if (d != '\0') + fputc(d, stdout); + last++; } } + if (last != -1) + goto nextline; } static void paste_files_separate(FILE** files, char* delims, int del_cnt) -- 2.47.2 ``` _______________________________________________ busybox mailing list [email protected] https://lists.busybox.net/mailman/listinfo/busybox
