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

Reply via email to