commit:     1124356ee9f4d6065953d8aecf6e06c617e930c1
Author:     Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Mon Jun  3 01:39:20 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Jun 12 07:06:42 2024 +0000
URL:        
https://gitweb.gentoo.org/proj/gentoo-functions.git/commit/?id=1124356e

Add the hr() function to print a horizontal rule

As based on the implementation in Maarten Billemont's bashlib library.

Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>

 functions.sh   | 28 ++++++++++++++++++++++++++++
 test-functions | 24 ++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/functions.sh b/functions.sh
index 30c2447..c077290 100644
--- a/functions.sh
+++ b/functions.sh
@@ -363,6 +363,34 @@ has_systemd()
        test -d /run/systemd
 }
 
+#
+# Prints a horizontal rule. If specified, the first parameter shall be taken as
+# a string to be repeated in the course of composing the rule. Otherwise, it
+# shall default to the <hyphen-minus>. If specified, the second parameter shall
+# define the length of the rule in characters. Otherwise, it shall default to
+# the width of the terminal if such can be determined, or 80 if it cannot be.
+#
+hr()
+{
+       local length
+
+       if is_int "$2"; then
+               length=$2
+       elif _update_tty_level <&1; [ "${genfun_tty}" -eq 2 ]; then
+               length=${genfun_cols}
+       else
+               length=80
+       fi
+       PATTERN=${1:--} awk -v "width=${length}" -f - <<-'EOF'
+               BEGIN {
+                       while (length(rule) < width) {
+                               rule = rule substr(ENVIRON["PATTERN"], 1, width 
- length(rule))
+                       }
+                       print rule
+               }
+       EOF
+}
+
 #
 # Determines whether the first parameter is a valid identifier (variable name).
 #

diff --git a/test-functions b/test-functions
index bbb74f1..d90462e 100755
--- a/test-functions
+++ b/test-functions
@@ -484,6 +484,29 @@ test_trim() {
        iterate_tests 4 "$@"
 }
 
+test_hr() {
+       # shellcheck disable=2183
+       set -- \
+               eq  0  "$(printf '%80s' | tr ' ' -)"  N/A  N/A  \
+               eq  0  "$(printf '%80s' | tr ' ' -)"  -    N/A  \
+               eq  0  ''                             -    0    \
+               eq  0  -                              -    1    \
+               eq  0  -----                          -    5    \
+               eq  0  ''                             xyz  0    \
+               eq  0  x                              xyz  1    \
+               eq  0  xyzxy                          xyz  5
+
+       callback() {
+               shift
+               expected=$1
+               shift
+               test_description="hr $(_print_args "$@")"
+               test "$(hr "$@")" = "${expected}"
+       }
+
+       iterate_tests 5 "$@"
+}
+
 iterate_tests() {
        slice_width=$1
        shift
@@ -547,6 +570,7 @@ test_edo || rc=1
 test_srandom || rc=1
 test_newest || rc=1
 test_trim || rc=1
+test_hr || rc=1
 
 cleanup_tmpdir
 

Reply via email to