Applied, thank you.

On Thu, Nov 13, 2025 at 8:56 AM Ron Yorston <[email protected]> wrote:
>
> If the files being pasted had different numbers of lines the
> output was incorrect.
>
> Rewrite the loop over all lines to allow for this.  Add tests for
> such conditions.
>
> function                                             old     new   delta
> paste_main                                           448     528     +80
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 1/0 up/down: 80/0)               Total: 80 bytes
>
> Signed-off-by: Ron Yorston <[email protected]>
> ---
>  coreutils/paste.c                | 36 +++++++++++++++++++++-----------
>  testsuite/paste/paste-long-short | 19 +++++++++++++++++
>  testsuite/paste/paste-short-long | 19 +++++++++++++++++
>  3 files changed, 62 insertions(+), 12 deletions(-)
>  create mode 100644 testsuite/paste/paste-long-short
>  create mode 100644 testsuite/paste/paste-short-long
>
> diff --git a/coreutils/paste.c b/coreutils/paste.c
> index 3e5f20158..363340e3d 100644
> --- a/coreutils/paste.c
> +++ b/coreutils/paste.c
> @@ -34,27 +34,38 @@
>
>  static void paste_files(FILE** files, int file_cnt, char* delims, int 
> del_cnt)
>  {
> -       char *line;
> +       char **line = xmalloc(file_cnt * sizeof(char *));
>         char delim;
>         int active_files = file_cnt;
>         int i;
>
>         while (active_files > 0) {
>                 int del_idx = 0;
> +               int got_line = FALSE;
>
>                 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;
> +                       if (files[i]) {
> +                               line[i] = xmalloc_fgetline(files[i]);
> +                               if (!line[i]) {
> +                                       fclose_if_not_stdin(files[i]);
> +                                       files[i] = NULL;
> +                                       --active_files;
> +                               } else {
> +                                       got_line = TRUE;
> +                               }
> +                       } else {
> +                               line[i] = NULL;
> +                       }
> +               }
> +
> +               if (!got_line)
> +                       break;
> +
> +               for (i = 0; i < file_cnt; ++i) {
> +                       if (line[i]) {
> +                               fputs_stdout(line[i]);
> +                               free(line[i]);
>                         }
> -                       fputs_stdout(line);
> -                       free(line);
>                         delim = '\n';
>                         if (i != file_cnt - 1) {
>                                 delim = delims[del_idx++];
> @@ -65,6 +76,7 @@ static void paste_files(FILE** files, int file_cnt, char* 
> delims, int del_cnt)
>                                 fputc(delim, stdout);
>                 }
>         }
> +       free(line);
>  }
>
>  static void paste_files_separate(FILE** files, char* delims, int del_cnt)
> diff --git a/testsuite/paste/paste-long-short 
> b/testsuite/paste/paste-long-short
> new file mode 100644
> index 000000000..e626d730e
> --- /dev/null
> +++ b/testsuite/paste/paste-long-short
> @@ -0,0 +1,19 @@
> +cat > foo <<EOF
> +foo1
> +foo2
> +foo3
> +EOF
> +
> +cat > bar <<EOF
> +bar1
> +bar2
> +EOF
> +
> +cat > baz <<EOF
> +foo1   bar1
> +foo2   bar2
> +foo3
> +EOF
> +
> +busybox paste foo bar > qux
> +diff -u baz qux
> diff --git a/testsuite/paste/paste-short-long 
> b/testsuite/paste/paste-short-long
> new file mode 100644
> index 000000000..785da60a7
> --- /dev/null
> +++ b/testsuite/paste/paste-short-long
> @@ -0,0 +1,19 @@
> +cat > foo <<EOF
> +foo1
> +foo2
> +EOF
> +
> +cat > bar <<EOF
> +bar1
> +bar2
> +bar3
> +EOF
> +
> +cat > baz <<EOF
> +foo1   bar1
> +foo2   bar2
> +       bar3
> +EOF
> +
> +busybox paste foo bar > qux
> +diff -u baz qux
> --
> 2.51.1
>
> _______________________________________________
> busybox mailing list
> [email protected]
> https://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
[email protected]
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to