From 99147312ce6ffd3a3b70e10aacc9b64a63b6aefe Mon Sep 17 00:00:00 2001 From: Alexander Strasser Date: Sat, 27 Apr 2019 23:15:08 +0200 Subject: configure: print_in_columns: Replace pr with awk Get rid of pr dependency and write the columns strictly alphabetical without page size considerations (POSIX specifies 66 lines as default). Setting the page size via pr's -l option was considered, but as there is issue #5680 which wants to avoid pr mainly because it's not in busybox, we chose to replace pr instead. Before pr would attempt to write pages, thus if a page boundary was reached, the output looked confusing as one couldn't see there was a new page and the alphabetical order was disrupted when scanning down one of the columns. This change is based on a shell implementation submitted before by Yejun. Possible differences to the current version using pr: 1. pr implementations should truncate items to not overflow columns; depending on how it's done not truncating shall be better IMHO. 2. pr implementations might balance columns differently; we use minimum number of lines and might end up not using all columns or might have lesser entries in the last column(s) 3. we use spaces only for padding the columns; at least the GNU pr version on my system also by default stuffs in tabs in addition to a single space in between columns. I don't see that this behaviour is demanded by POSIX, though I might be very well overlooking things. Anyway for our use case I can't see a need for having the additional tabs, or why it would be better compared to padding with spaces only. Fixes output for sizes with width < column width, too. Fixes remaining part of ticket #5680 Contributor: Guo, Yejun --- configure | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'configure') diff --git a/configure b/configure index d885690..7cea9d4 100755 --- a/configure +++ b/configure @@ -3843,8 +3843,22 @@ die_unknown(){ } print_in_columns() { - cols=$(expr $ncols / 24) - cat | tr ' ' '\n' | sort | pr -r "-$cols" -w $ncols -t + tr ' ' '\n' | sort | tr '\r\n' ' ' | awk -v col_width=24 -v width="$ncols" ' + { + num_cols = width > col_width ? int(width / col_width) : 1; + num_rows = int((NF + num_cols-1) / num_cols); + y = x = 1; + for (y = 1; y <= num_rows; y++) { + i = y; + for (x = 1; x <= num_cols; x++) { + if (i <= NF) { + line = sprintf("%s%-" col_width "s", line, $i); + } + i = i + num_rows; + } + print line; line = ""; + } + }' | sed 's/ *$//' } show_list() { -- cgit v1.1