1#! /bin/sh 2# 3# SPDX-License-Identifier: BSD-2-Clause 4# 5# Copyright (c) 2018-2021 Gavin D. Howard and contributors. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions are met: 9# 10# * Redistributions of source code must retain the above copyright notice, this 11# list of conditions and the following disclaimer. 12# 13# * Redistributions in binary form must reproduce the above copyright notice, 14# this list of conditions and the following disclaimer in the documentation 15# and/or other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27# POSSIBILITY OF SUCH DAMAGE. 28# 29 30readlink() { 31 32 _readlink_f="$1" 33 shift 34 35 _readlink_arrow="-> " 36 _readlink_d=$(dirname "$_readlink_f") 37 38 _readlink_lsout="" 39 _readlink_link="" 40 41 _readlink_lsout=$(ls -dl "$_readlink_f") 42 _readlink_link=$(printf '%s' "${_readlink_lsout#*$_readlink_arrow}") 43 44 while [ -z "${_readlink_lsout##*$_readlink_arrow*}" ]; do 45 _readlink_f="$_readlink_d/$_readlink_link" 46 _readlink_d=$(dirname "$_readlink_f") 47 _readlink_lsout=$(ls -dl "$_readlink_f") 48 _readlink_link=$(printf '%s' "${_readlink_lsout#*$_readlink_arrow}") 49 done 50 51 printf '%s' "${_readlink_f##*$_readlink_d/}" 52} 53 54err_exit() { 55 56 if [ "$#" -ne 2 ]; then 57 printf 'Invalid number of args to err_exit\n' 58 exit 1 59 fi 60 61 printf '%s\n' "$1" 62 exit "$2" 63} 64 65checktest_retcode() { 66 67 _checktest_retcode_d="$1" 68 shift 69 70 _checktest_retcode_err="$1" 71 shift 72 73 _checktest_retcode_name="$1" 74 shift 75 76 if [ "$_checktest_retcode_err" -ne 0 ]; then 77 printf 'FAIL!!!\n' 78 err_exit "$_checktest_retcode_d failed test '$_checktest_retcode_name' with error code $_checktest_retcode_err" 1 79 fi 80} 81 82checktest() { 83 84 _checktest_d="$1" 85 shift 86 87 _checktest_err="$1" 88 shift 89 90 _checktest_name="$1" 91 shift 92 93 _checktest_test_path="$1" 94 shift 95 96 _checktest_results_name="$1" 97 shift 98 99 checktest_retcode "$_checktest_d" "$_checktest_err" "$_checktest_name" 100 101 _checktest_diff=$(diff "$_checktest_test_path" "$_checktest_results_name") 102 103 _checktest_err="$?" 104 105 if [ "$_checktest_err" -ne 0 ]; then 106 printf 'FAIL!!!\n' 107 printf '%s\n' "$_checktest_diff" 108 err_exit "$_checktest_d failed test $_checktest_name" 1 109 fi 110} 111 112die() { 113 114 _die_d="$1" 115 shift 116 117 _die_msg="$1" 118 shift 119 120 _die_name="$1" 121 shift 122 123 _die_err="$1" 124 shift 125 126 _die_str=$(printf '\n%s %s on test:\n\n %s\n' "$_die_d" "$_die_msg" "$_die_name") 127 128 err_exit "$_die_str" "$_die_err" 129} 130 131checkcrash() { 132 133 _checkcrash_d="$1" 134 shift 135 136 _checkcrash_error="$1" 137 shift 138 139 _checkcrash_name="$1" 140 shift 141 142 if [ "$_checkcrash_error" -gt 127 ]; then 143 die "$_checkcrash_d" "crashed ($_checkcrash_error)" \ 144 "$_checkcrash_name" "$_checkcrash_error" 145 fi 146} 147 148checkerrtest() 149{ 150 _checkerrtest_d="$1" 151 shift 152 153 _checkerrtest_error="$1" 154 shift 155 156 _checkerrtest_name="$1" 157 shift 158 159 _checkerrtest_out="$1" 160 shift 161 162 _checkerrtest_exebase="$1" 163 shift 164 165 checkcrash "$_checkerrtest_d" "$_checkerrtest_error" "$_checkerrtest_name" 166 167 if [ "$_checkerrtest_error" -eq 0 ]; then 168 die "$_checkerrtest_d" "returned no error" "$_checkerrtest_name" 127 169 fi 170 171 if [ "$_checkerrtest_error" -eq 100 ]; then 172 173 _checkerrtest_output=$(cat "$_checkerrtest_out") 174 _checkerrtest_fatal_error="Fatal error" 175 176 if [ "${_checkerrtest_output##*$_checkerrtest_fatal_error*}" ]; then 177 printf "%s\n" "$_checkerrtest_output" 178 die "$_checkerrtest_d" "had memory errors on a non-fatal error" \ 179 "$_checkerrtest_name" "$_checkerrtest_error" 180 fi 181 fi 182 183 if [ ! -s "$_checkerrtest_out" ]; then 184 die "$_checkerrtest_d" "produced no error message" "$_checkerrtest_name" "$_checkerrtest_error" 185 fi 186 187 # Display the error messages if not directly running exe. 188 # This allows the script to print valgrind output. 189 if [ "$_checkerrtest_exebase" != "bc" -a "$_checkerrtest_exebase" != "dc" ]; then 190 cat "$_checkerrtest_out" 191 fi 192} 193 194substring_replace() { 195 196 _substring_replace_str="$1" 197 shift 198 199 _substring_replace_needle="$1" 200 shift 201 202 _substring_replace_replacement="$1" 203 shift 204 205 _substring_replace_result=$(printf '%s\n' "$_substring_replace_str" | \ 206 sed -e "s!$_substring_replace_needle!$_substring_replace_replacement!g") 207 208 printf '%s' "$_substring_replace_result" 209} 210 211gen_nlspath() { 212 213 _gen_nlspath_nlspath="$1" 214 shift 215 216 _gen_nlspath_locale="$1" 217 shift 218 219 _gen_nlspath_execname="$1" 220 shift 221 222 _gen_nlspath_char="@" 223 _gen_nlspath_modifier="${_gen_nlspath_locale#*$_gen_nlspath_char}" 224 _gen_nlspath_tmplocale="${_gen_nlspath_locale%%$_gen_nlspath_char*}" 225 226 _gen_nlspath_char="." 227 _gen_nlspath_charset="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}" 228 _gen_nlspath_tmplocale="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}" 229 230 if [ "$_gen_nlspath_charset" = "$_gen_nlspath_tmplocale" ]; then 231 _gen_nlspath_charset="" 232 fi 233 234 _gen_nlspath_char="_" 235 _gen_nlspath_territory="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}" 236 _gen_nlspath_language="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}" 237 238 if [ "$_gen_nlspath_territory" = "$_gen_nlspath_tmplocale" ]; then 239 _gen_nlspath_territory="" 240 fi 241 242 if [ "$_gen_nlspath_language" = "$_gen_nlspath_tmplocale" ]; then 243 _gen_nlspath_language="" 244 fi 245 246 _gen_nlspath_needles="%%:%L:%N:%l:%t:%c" 247 248 _gen_nlspath_needles=$(printf '%s' "$_gen_nlspath_needles" | tr ':' '\n') 249 250 for _gen_nlspath_i in $_gen_nlspath_needles; do 251 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "$_gen_nlspath_i" "|$_gen_nlspath_i|") 252 done 253 254 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%%" "%") 255 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%L" "$_gen_nlspath_locale") 256 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%N" "$_gen_nlspath_execname") 257 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%l" "$_gen_nlspath_language") 258 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%t" "$_gen_nlspath_territory") 259 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%c" "$_gen_nlspath_charset") 260 261 _gen_nlspath_nlspath=$(printf '%s' "$_gen_nlspath_nlspath" | tr -d '|') 262 263 printf '%s' "$_gen_nlspath_nlspath" 264} 265