1*5a6e8488SAndroid Build Coastguard Worker#! /bin/sh 2*5a6e8488SAndroid Build Coastguard Worker# 3*5a6e8488SAndroid Build Coastguard Worker# SPDX-License-Identifier: BSD-2-Clause 4*5a6e8488SAndroid Build Coastguard Worker# 5*5a6e8488SAndroid Build Coastguard Worker# Copyright (c) 2018-2024 Gavin D. Howard and contributors. 6*5a6e8488SAndroid Build Coastguard Worker# 7*5a6e8488SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 8*5a6e8488SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 9*5a6e8488SAndroid Build Coastguard Worker# 10*5a6e8488SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright notice, this 11*5a6e8488SAndroid Build Coastguard Worker# list of conditions and the following disclaimer. 12*5a6e8488SAndroid Build Coastguard Worker# 13*5a6e8488SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright notice, 14*5a6e8488SAndroid Build Coastguard Worker# this list of conditions and the following disclaimer in the documentation 15*5a6e8488SAndroid Build Coastguard Worker# and/or other materials provided with the distribution. 16*5a6e8488SAndroid Build Coastguard Worker# 17*5a6e8488SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*5a6e8488SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*5a6e8488SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*5a6e8488SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*5a6e8488SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*5a6e8488SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*5a6e8488SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*5a6e8488SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*5a6e8488SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*5a6e8488SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*5a6e8488SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*5a6e8488SAndroid Build Coastguard Worker# 29*5a6e8488SAndroid Build Coastguard Worker 30*5a6e8488SAndroid Build Coastguard Worker# This script is NOT meant to be run! It is meant to be sourced by other 31*5a6e8488SAndroid Build Coastguard Worker# scripts. 32*5a6e8488SAndroid Build Coastguard Worker 33*5a6e8488SAndroid Build Coastguard Worker# Reads and follows a link until it finds a real file. This is here because the 34*5a6e8488SAndroid Build Coastguard Worker# readlink utility is not part of the POSIX standard. Sigh... 35*5a6e8488SAndroid Build Coastguard Worker# @param f The link to find the original file for. 36*5a6e8488SAndroid Build Coastguard Workerreadlink() { 37*5a6e8488SAndroid Build Coastguard Worker 38*5a6e8488SAndroid Build Coastguard Worker _readlink_f="$1" 39*5a6e8488SAndroid Build Coastguard Worker shift 40*5a6e8488SAndroid Build Coastguard Worker 41*5a6e8488SAndroid Build Coastguard Worker _readlink_arrow="-> " 42*5a6e8488SAndroid Build Coastguard Worker _readlink_d=$(dirname "$_readlink_f") 43*5a6e8488SAndroid Build Coastguard Worker 44*5a6e8488SAndroid Build Coastguard Worker _readlink_lsout="" 45*5a6e8488SAndroid Build Coastguard Worker _readlink_link="" 46*5a6e8488SAndroid Build Coastguard Worker 47*5a6e8488SAndroid Build Coastguard Worker _readlink_lsout=$(ls -dl "$_readlink_f") 48*5a6e8488SAndroid Build Coastguard Worker _readlink_link=$(printf '%s' "${_readlink_lsout#*$_readlink_arrow}") 49*5a6e8488SAndroid Build Coastguard Worker 50*5a6e8488SAndroid Build Coastguard Worker while [ -z "${_readlink_lsout##*$_readlink_arrow*}" ]; do 51*5a6e8488SAndroid Build Coastguard Worker _readlink_f="$_readlink_d/$_readlink_link" 52*5a6e8488SAndroid Build Coastguard Worker _readlink_d=$(dirname "$_readlink_f") 53*5a6e8488SAndroid Build Coastguard Worker _readlink_lsout=$(ls -dl "$_readlink_f") 54*5a6e8488SAndroid Build Coastguard Worker _readlink_link=$(printf '%s' "${_readlink_lsout#*$_readlink_arrow}") 55*5a6e8488SAndroid Build Coastguard Worker done 56*5a6e8488SAndroid Build Coastguard Worker 57*5a6e8488SAndroid Build Coastguard Worker printf '%s' "${_readlink_f##*$_readlink_d/}" 58*5a6e8488SAndroid Build Coastguard Worker} 59*5a6e8488SAndroid Build Coastguard Worker 60*5a6e8488SAndroid Build Coastguard Worker# Quick function for exiting with an error. 61*5a6e8488SAndroid Build Coastguard Worker# @param 1 A message to print. 62*5a6e8488SAndroid Build Coastguard Worker# @param 2 The exit code to use. 63*5a6e8488SAndroid Build Coastguard Workererr_exit() { 64*5a6e8488SAndroid Build Coastguard Worker 65*5a6e8488SAndroid Build Coastguard Worker if [ "$#" -ne 2 ]; then 66*5a6e8488SAndroid Build Coastguard Worker printf 'Invalid number of args to err_exit\n' 67*5a6e8488SAndroid Build Coastguard Worker exit 1 68*5a6e8488SAndroid Build Coastguard Worker fi 69*5a6e8488SAndroid Build Coastguard Worker 70*5a6e8488SAndroid Build Coastguard Worker printf '%s\n' "$1" 71*5a6e8488SAndroid Build Coastguard Worker exit "$2" 72*5a6e8488SAndroid Build Coastguard Worker} 73*5a6e8488SAndroid Build Coastguard Worker 74*5a6e8488SAndroid Build Coastguard Worker# Function for checking the "d"/"dir" argument of scripts. This function expects 75*5a6e8488SAndroid Build Coastguard Worker# a usage() function to exist in the caller. 76*5a6e8488SAndroid Build Coastguard Worker# @param 1 The argument to check. 77*5a6e8488SAndroid Build Coastguard Workercheck_d_arg() { 78*5a6e8488SAndroid Build Coastguard Worker 79*5a6e8488SAndroid Build Coastguard Worker if [ "$#" -ne 1 ]; then 80*5a6e8488SAndroid Build Coastguard Worker printf 'Invalid number of args to check_d_arg\n' 81*5a6e8488SAndroid Build Coastguard Worker exit 1 82*5a6e8488SAndroid Build Coastguard Worker fi 83*5a6e8488SAndroid Build Coastguard Worker 84*5a6e8488SAndroid Build Coastguard Worker _check_d_arg_arg="$1" 85*5a6e8488SAndroid Build Coastguard Worker shift 86*5a6e8488SAndroid Build Coastguard Worker 87*5a6e8488SAndroid Build Coastguard Worker if [ "$_check_d_arg_arg" != "bc" ] && [ "$_check_d_arg_arg" != "dc" ]; then 88*5a6e8488SAndroid Build Coastguard Worker _check_d_arg_msg=$(printf 'Invalid d arg: %s\nMust be either "bc" or "dc".\n\n' \ 89*5a6e8488SAndroid Build Coastguard Worker "$_check_d_arg_arg") 90*5a6e8488SAndroid Build Coastguard Worker usage "$_check_d_arg_msg" 91*5a6e8488SAndroid Build Coastguard Worker fi 92*5a6e8488SAndroid Build Coastguard Worker} 93*5a6e8488SAndroid Build Coastguard Worker 94*5a6e8488SAndroid Build Coastguard Worker# Function for checking the boolean arguments of scripts. This function expects 95*5a6e8488SAndroid Build Coastguard Worker# a usage() function to exist in the caller. 96*5a6e8488SAndroid Build Coastguard Worker# @param 1 The argument to check. 97*5a6e8488SAndroid Build Coastguard Workercheck_bool_arg() { 98*5a6e8488SAndroid Build Coastguard Worker 99*5a6e8488SAndroid Build Coastguard Worker if [ "$#" -ne 1 ]; then 100*5a6e8488SAndroid Build Coastguard Worker printf 'Invalid number of args to check_bool_arg\n' 101*5a6e8488SAndroid Build Coastguard Worker exit 1 102*5a6e8488SAndroid Build Coastguard Worker fi 103*5a6e8488SAndroid Build Coastguard Worker 104*5a6e8488SAndroid Build Coastguard Worker _check_bool_arg_arg="$1" 105*5a6e8488SAndroid Build Coastguard Worker shift 106*5a6e8488SAndroid Build Coastguard Worker 107*5a6e8488SAndroid Build Coastguard Worker if [ "$_check_bool_arg_arg" != "0" ] && [ "$_check_bool_arg_arg" != "1" ]; then 108*5a6e8488SAndroid Build Coastguard Worker _check_bool_arg_msg=$(printf 'Invalid bool arg: %s\nMust be either "0" or "1".\n\n' \ 109*5a6e8488SAndroid Build Coastguard Worker "$_check_bool_arg_arg") 110*5a6e8488SAndroid Build Coastguard Worker usage "$_check_bool_arg_msg" 111*5a6e8488SAndroid Build Coastguard Worker fi 112*5a6e8488SAndroid Build Coastguard Worker} 113*5a6e8488SAndroid Build Coastguard Worker 114*5a6e8488SAndroid Build Coastguard Worker# Function for checking the executable arguments of scripts. This function 115*5a6e8488SAndroid Build Coastguard Worker# expects a usage() function to exist in the caller. 116*5a6e8488SAndroid Build Coastguard Worker# @param 1 The argument to check. 117*5a6e8488SAndroid Build Coastguard Workercheck_exec_arg() { 118*5a6e8488SAndroid Build Coastguard Worker 119*5a6e8488SAndroid Build Coastguard Worker if [ "$#" -ne 1 ]; then 120*5a6e8488SAndroid Build Coastguard Worker printf 'Invalid number of args to check_exec_arg\n' 121*5a6e8488SAndroid Build Coastguard Worker exit 1 122*5a6e8488SAndroid Build Coastguard Worker fi 123*5a6e8488SAndroid Build Coastguard Worker 124*5a6e8488SAndroid Build Coastguard Worker _check_exec_arg_arg="$1" 125*5a6e8488SAndroid Build Coastguard Worker shift 126*5a6e8488SAndroid Build Coastguard Worker 127*5a6e8488SAndroid Build Coastguard Worker if [ ! -x "$_check_exec_arg_arg" ]; then 128*5a6e8488SAndroid Build Coastguard Worker if ! command -v "$_check_exec_arg_arg" >/dev/null 2>&1; then 129*5a6e8488SAndroid Build Coastguard Worker _check_exec_arg_msg=$(printf 'Invalid exec arg: %s\nMust be an executable file.\n\n' \ 130*5a6e8488SAndroid Build Coastguard Worker "$_check_exec_arg_arg") 131*5a6e8488SAndroid Build Coastguard Worker usage "$_check_exec_arg_msg" 132*5a6e8488SAndroid Build Coastguard Worker fi 133*5a6e8488SAndroid Build Coastguard Worker fi 134*5a6e8488SAndroid Build Coastguard Worker} 135*5a6e8488SAndroid Build Coastguard Worker 136*5a6e8488SAndroid Build Coastguard Worker# Function for checking the file arguments of scripts. This function expects a 137*5a6e8488SAndroid Build Coastguard Worker# usage() function to exist in the caller. 138*5a6e8488SAndroid Build Coastguard Worker# @param 1 The argument to check. 139*5a6e8488SAndroid Build Coastguard Workercheck_file_arg() { 140*5a6e8488SAndroid Build Coastguard Worker 141*5a6e8488SAndroid Build Coastguard Worker if [ "$#" -ne 1 ]; then 142*5a6e8488SAndroid Build Coastguard Worker printf 'Invalid number of args to check_file_arg\n' 143*5a6e8488SAndroid Build Coastguard Worker exit 1 144*5a6e8488SAndroid Build Coastguard Worker fi 145*5a6e8488SAndroid Build Coastguard Worker 146*5a6e8488SAndroid Build Coastguard Worker _check_file_arg_arg="$1" 147*5a6e8488SAndroid Build Coastguard Worker shift 148*5a6e8488SAndroid Build Coastguard Worker 149*5a6e8488SAndroid Build Coastguard Worker if [ ! -f "$_check_file_arg_arg" ]; then 150*5a6e8488SAndroid Build Coastguard Worker _check_file_arg_msg=$(printf 'Invalid file arg: %s\nMust be a file.\n\n' \ 151*5a6e8488SAndroid Build Coastguard Worker "$_check_file_arg_arg") 152*5a6e8488SAndroid Build Coastguard Worker usage "$_check_file_arg_msg" 153*5a6e8488SAndroid Build Coastguard Worker fi 154*5a6e8488SAndroid Build Coastguard Worker} 155*5a6e8488SAndroid Build Coastguard Worker 156*5a6e8488SAndroid Build Coastguard Worker# Check the return code on a test and exit with a fail if it's non-zero. 157*5a6e8488SAndroid Build Coastguard Worker# @param d The calculator under test. 158*5a6e8488SAndroid Build Coastguard Worker# @param err The return code. 159*5a6e8488SAndroid Build Coastguard Worker# @param name The name of the test. 160*5a6e8488SAndroid Build Coastguard Workerchecktest_retcode() { 161*5a6e8488SAndroid Build Coastguard Worker 162*5a6e8488SAndroid Build Coastguard Worker _checktest_retcode_d="$1" 163*5a6e8488SAndroid Build Coastguard Worker shift 164*5a6e8488SAndroid Build Coastguard Worker 165*5a6e8488SAndroid Build Coastguard Worker _checktest_retcode_err="$1" 166*5a6e8488SAndroid Build Coastguard Worker shift 167*5a6e8488SAndroid Build Coastguard Worker 168*5a6e8488SAndroid Build Coastguard Worker _checktest_retcode_name="$1" 169*5a6e8488SAndroid Build Coastguard Worker shift 170*5a6e8488SAndroid Build Coastguard Worker 171*5a6e8488SAndroid Build Coastguard Worker if [ "$_checktest_retcode_err" -ne 0 ]; then 172*5a6e8488SAndroid Build Coastguard Worker printf 'FAIL!!!\n' 173*5a6e8488SAndroid Build Coastguard Worker err_exit "$_checktest_retcode_d failed test '$_checktest_retcode_name' with error code $_checktest_retcode_err" 1 174*5a6e8488SAndroid Build Coastguard Worker fi 175*5a6e8488SAndroid Build Coastguard Worker} 176*5a6e8488SAndroid Build Coastguard Worker 177*5a6e8488SAndroid Build Coastguard Worker# Check the result of a test. First, it checks the error code using 178*5a6e8488SAndroid Build Coastguard Worker# checktest_retcode(). Then it checks the output against the expected output 179*5a6e8488SAndroid Build Coastguard Worker# and fails if it doesn't match. 180*5a6e8488SAndroid Build Coastguard Worker# @param d The calculator under test. 181*5a6e8488SAndroid Build Coastguard Worker# @param err The error code. 182*5a6e8488SAndroid Build Coastguard Worker# @param name The name of the test. 183*5a6e8488SAndroid Build Coastguard Worker# @param test_path The path to the test. 184*5a6e8488SAndroid Build Coastguard Worker# @param results_name The path to the file with the expected result. 185*5a6e8488SAndroid Build Coastguard Workerchecktest() { 186*5a6e8488SAndroid Build Coastguard Worker 187*5a6e8488SAndroid Build Coastguard Worker _checktest_d="$1" 188*5a6e8488SAndroid Build Coastguard Worker shift 189*5a6e8488SAndroid Build Coastguard Worker 190*5a6e8488SAndroid Build Coastguard Worker _checktest_err="$1" 191*5a6e8488SAndroid Build Coastguard Worker shift 192*5a6e8488SAndroid Build Coastguard Worker 193*5a6e8488SAndroid Build Coastguard Worker _checktest_name="$1" 194*5a6e8488SAndroid Build Coastguard Worker shift 195*5a6e8488SAndroid Build Coastguard Worker 196*5a6e8488SAndroid Build Coastguard Worker _checktest_test_path="$1" 197*5a6e8488SAndroid Build Coastguard Worker shift 198*5a6e8488SAndroid Build Coastguard Worker 199*5a6e8488SAndroid Build Coastguard Worker _checktest_results_name="$1" 200*5a6e8488SAndroid Build Coastguard Worker shift 201*5a6e8488SAndroid Build Coastguard Worker 202*5a6e8488SAndroid Build Coastguard Worker checktest_retcode "$_checktest_d" "$_checktest_err" "$_checktest_name" 203*5a6e8488SAndroid Build Coastguard Worker 204*5a6e8488SAndroid Build Coastguard Worker _checktest_diff=$(diff "$_checktest_test_path" "$_checktest_results_name") 205*5a6e8488SAndroid Build Coastguard Worker 206*5a6e8488SAndroid Build Coastguard Worker _checktest_err="$?" 207*5a6e8488SAndroid Build Coastguard Worker 208*5a6e8488SAndroid Build Coastguard Worker if [ "$_checktest_err" -ne 0 ]; then 209*5a6e8488SAndroid Build Coastguard Worker printf 'FAIL!!!\n' 210*5a6e8488SAndroid Build Coastguard Worker printf '%s\n' "$_checktest_diff" 211*5a6e8488SAndroid Build Coastguard Worker err_exit "$_checktest_d failed test $_checktest_name" 1 212*5a6e8488SAndroid Build Coastguard Worker fi 213*5a6e8488SAndroid Build Coastguard Worker} 214*5a6e8488SAndroid Build Coastguard Worker 215*5a6e8488SAndroid Build Coastguard Worker# Die. With a message. 216*5a6e8488SAndroid Build Coastguard Worker# @param d The calculator under test. 217*5a6e8488SAndroid Build Coastguard Worker# @param msg The message to print. 218*5a6e8488SAndroid Build Coastguard Worker# @param name The name of the test. 219*5a6e8488SAndroid Build Coastguard Worker# @param err The return code from the test. 220*5a6e8488SAndroid Build Coastguard Workerdie() { 221*5a6e8488SAndroid Build Coastguard Worker 222*5a6e8488SAndroid Build Coastguard Worker _die_d="$1" 223*5a6e8488SAndroid Build Coastguard Worker shift 224*5a6e8488SAndroid Build Coastguard Worker 225*5a6e8488SAndroid Build Coastguard Worker _die_msg="$1" 226*5a6e8488SAndroid Build Coastguard Worker shift 227*5a6e8488SAndroid Build Coastguard Worker 228*5a6e8488SAndroid Build Coastguard Worker _die_name="$1" 229*5a6e8488SAndroid Build Coastguard Worker shift 230*5a6e8488SAndroid Build Coastguard Worker 231*5a6e8488SAndroid Build Coastguard Worker _die_err="$1" 232*5a6e8488SAndroid Build Coastguard Worker shift 233*5a6e8488SAndroid Build Coastguard Worker 234*5a6e8488SAndroid Build Coastguard Worker _die_str=$(printf '\n%s %s on test:\n\n %s\n' "$_die_d" "$_die_msg" "$_die_name") 235*5a6e8488SAndroid Build Coastguard Worker 236*5a6e8488SAndroid Build Coastguard Worker err_exit "$_die_str" "$_die_err" 237*5a6e8488SAndroid Build Coastguard Worker} 238*5a6e8488SAndroid Build Coastguard Worker 239*5a6e8488SAndroid Build Coastguard Worker# Check that a test did not crash and die if it did. 240*5a6e8488SAndroid Build Coastguard Worker# @param d The calculator under test. 241*5a6e8488SAndroid Build Coastguard Worker# @param error The error code. 242*5a6e8488SAndroid Build Coastguard Worker# @param name The name of the test. 243*5a6e8488SAndroid Build Coastguard Workercheckcrash() { 244*5a6e8488SAndroid Build Coastguard Worker 245*5a6e8488SAndroid Build Coastguard Worker _checkcrash_d="$1" 246*5a6e8488SAndroid Build Coastguard Worker shift 247*5a6e8488SAndroid Build Coastguard Worker 248*5a6e8488SAndroid Build Coastguard Worker _checkcrash_error="$1" 249*5a6e8488SAndroid Build Coastguard Worker shift 250*5a6e8488SAndroid Build Coastguard Worker 251*5a6e8488SAndroid Build Coastguard Worker _checkcrash_name="$1" 252*5a6e8488SAndroid Build Coastguard Worker shift 253*5a6e8488SAndroid Build Coastguard Worker 254*5a6e8488SAndroid Build Coastguard Worker 255*5a6e8488SAndroid Build Coastguard Worker if [ "$_checkcrash_error" -gt 127 ]; then 256*5a6e8488SAndroid Build Coastguard Worker die "$_checkcrash_d" "crashed ($_checkcrash_error)" \ 257*5a6e8488SAndroid Build Coastguard Worker "$_checkcrash_name" "$_checkcrash_error" 258*5a6e8488SAndroid Build Coastguard Worker fi 259*5a6e8488SAndroid Build Coastguard Worker} 260*5a6e8488SAndroid Build Coastguard Worker 261*5a6e8488SAndroid Build Coastguard Worker# Check that a test had an error or crash. 262*5a6e8488SAndroid Build Coastguard Worker# @param d The calculator under test. 263*5a6e8488SAndroid Build Coastguard Worker# @param error The error code. 264*5a6e8488SAndroid Build Coastguard Worker# @param name The name of the test. 265*5a6e8488SAndroid Build Coastguard Worker# @param out The file that the test results were output to. 266*5a6e8488SAndroid Build Coastguard Worker# @param exebase The name of the executable. 267*5a6e8488SAndroid Build Coastguard Workercheckerrtest() 268*5a6e8488SAndroid Build Coastguard Worker{ 269*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_d="$1" 270*5a6e8488SAndroid Build Coastguard Worker shift 271*5a6e8488SAndroid Build Coastguard Worker 272*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_error="$1" 273*5a6e8488SAndroid Build Coastguard Worker shift 274*5a6e8488SAndroid Build Coastguard Worker 275*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_name="$1" 276*5a6e8488SAndroid Build Coastguard Worker shift 277*5a6e8488SAndroid Build Coastguard Worker 278*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_out="$1" 279*5a6e8488SAndroid Build Coastguard Worker shift 280*5a6e8488SAndroid Build Coastguard Worker 281*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_exebase="$1" 282*5a6e8488SAndroid Build Coastguard Worker shift 283*5a6e8488SAndroid Build Coastguard Worker 284*5a6e8488SAndroid Build Coastguard Worker checkcrash "$_checkerrtest_d" "$_checkerrtest_error" "$_checkerrtest_name" 285*5a6e8488SAndroid Build Coastguard Worker 286*5a6e8488SAndroid Build Coastguard Worker if [ "$_checkerrtest_error" -eq 0 ]; then 287*5a6e8488SAndroid Build Coastguard Worker die "$_checkerrtest_d" "returned no error" "$_checkerrtest_name" 127 288*5a6e8488SAndroid Build Coastguard Worker fi 289*5a6e8488SAndroid Build Coastguard Worker 290*5a6e8488SAndroid Build Coastguard Worker # This is to check for memory errors with Valgrind, which is told to return 291*5a6e8488SAndroid Build Coastguard Worker # 100 on memory errors. 292*5a6e8488SAndroid Build Coastguard Worker if [ "$_checkerrtest_error" -eq 100 ]; then 293*5a6e8488SAndroid Build Coastguard Worker 294*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_output=$(cat "$_checkerrtest_out") 295*5a6e8488SAndroid Build Coastguard Worker _checkerrtest_fatal_error="Fatal error" 296*5a6e8488SAndroid Build Coastguard Worker 297*5a6e8488SAndroid Build Coastguard Worker if [ "${_checkerrtest_output##*$_checkerrtest_fatal_error*}" ]; then 298*5a6e8488SAndroid Build Coastguard Worker printf "%s\n" "$_checkerrtest_output" 299*5a6e8488SAndroid Build Coastguard Worker die "$_checkerrtest_d" "had memory errors on a non-fatal error" \ 300*5a6e8488SAndroid Build Coastguard Worker "$_checkerrtest_name" "$_checkerrtest_error" 301*5a6e8488SAndroid Build Coastguard Worker fi 302*5a6e8488SAndroid Build Coastguard Worker fi 303*5a6e8488SAndroid Build Coastguard Worker 304*5a6e8488SAndroid Build Coastguard Worker if [ ! -s "$_checkerrtest_out" ]; then 305*5a6e8488SAndroid Build Coastguard Worker die "$_checkerrtest_d" "produced no error message" "$_checkerrtest_name" "$_checkerrtest_error" 306*5a6e8488SAndroid Build Coastguard Worker fi 307*5a6e8488SAndroid Build Coastguard Worker 308*5a6e8488SAndroid Build Coastguard Worker # To display error messages, uncomment this line. This is useful when 309*5a6e8488SAndroid Build Coastguard Worker # debugging. 310*5a6e8488SAndroid Build Coastguard Worker #cat "$_checkerrtest_out" 311*5a6e8488SAndroid Build Coastguard Worker} 312*5a6e8488SAndroid Build Coastguard Worker 313*5a6e8488SAndroid Build Coastguard Worker# Replace a substring in a string with another. This function is the *real* 314*5a6e8488SAndroid Build Coastguard Worker# workhorse behind configure.sh's generation of a Makefile. 315*5a6e8488SAndroid Build Coastguard Worker# 316*5a6e8488SAndroid Build Coastguard Worker# This function uses a sed call that uses exclamation points `!` as delimiters. 317*5a6e8488SAndroid Build Coastguard Worker# As a result, needle can never contain an exclamation point. Oh well. 318*5a6e8488SAndroid Build Coastguard Worker# 319*5a6e8488SAndroid Build Coastguard Worker# @param str The string that will have any of the needle replaced by 320*5a6e8488SAndroid Build Coastguard Worker# replacement. 321*5a6e8488SAndroid Build Coastguard Worker# @param needle The needle to replace in str with replacement. 322*5a6e8488SAndroid Build Coastguard Worker# @param replacement The replacement for needle in str. 323*5a6e8488SAndroid Build Coastguard Workersubstring_replace() { 324*5a6e8488SAndroid Build Coastguard Worker 325*5a6e8488SAndroid Build Coastguard Worker _substring_replace_str="$1" 326*5a6e8488SAndroid Build Coastguard Worker shift 327*5a6e8488SAndroid Build Coastguard Worker 328*5a6e8488SAndroid Build Coastguard Worker _substring_replace_needle="$1" 329*5a6e8488SAndroid Build Coastguard Worker shift 330*5a6e8488SAndroid Build Coastguard Worker 331*5a6e8488SAndroid Build Coastguard Worker _substring_replace_replacement="$1" 332*5a6e8488SAndroid Build Coastguard Worker shift 333*5a6e8488SAndroid Build Coastguard Worker 334*5a6e8488SAndroid Build Coastguard Worker _substring_replace_result=$(printf '%s\n' "$_substring_replace_str" | \ 335*5a6e8488SAndroid Build Coastguard Worker sed -e "s!$_substring_replace_needle!$_substring_replace_replacement!g") 336*5a6e8488SAndroid Build Coastguard Worker 337*5a6e8488SAndroid Build Coastguard Worker printf '%s' "$_substring_replace_result" 338*5a6e8488SAndroid Build Coastguard Worker} 339*5a6e8488SAndroid Build Coastguard Worker 340*5a6e8488SAndroid Build Coastguard Worker# Generates an NLS path based on the locale and executable name. 341*5a6e8488SAndroid Build Coastguard Worker# 342*5a6e8488SAndroid Build Coastguard Worker# This is a monstrosity for a reason. 343*5a6e8488SAndroid Build Coastguard Worker# 344*5a6e8488SAndroid Build Coastguard Worker# @param nlspath The $NLSPATH 345*5a6e8488SAndroid Build Coastguard Worker# @param locale The locale. 346*5a6e8488SAndroid Build Coastguard Worker# @param execname The name of the executable. 347*5a6e8488SAndroid Build Coastguard Workergen_nlspath() { 348*5a6e8488SAndroid Build Coastguard Worker 349*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath="$1" 350*5a6e8488SAndroid Build Coastguard Worker shift 351*5a6e8488SAndroid Build Coastguard Worker 352*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_locale="$1" 353*5a6e8488SAndroid Build Coastguard Worker shift 354*5a6e8488SAndroid Build Coastguard Worker 355*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_execname="$1" 356*5a6e8488SAndroid Build Coastguard Worker shift 357*5a6e8488SAndroid Build Coastguard Worker 358*5a6e8488SAndroid Build Coastguard Worker # Split the locale into its modifier and other parts. 359*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_char="@" 360*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_modifier="${_gen_nlspath_locale#*$_gen_nlspath_char}" 361*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_tmplocale="${_gen_nlspath_locale%%$_gen_nlspath_char*}" 362*5a6e8488SAndroid Build Coastguard Worker 363*5a6e8488SAndroid Build Coastguard Worker # Split the locale into charset and other parts. 364*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_char="." 365*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_charset="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}" 366*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_tmplocale="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}" 367*5a6e8488SAndroid Build Coastguard Worker 368*5a6e8488SAndroid Build Coastguard Worker # Check for an empty charset. 369*5a6e8488SAndroid Build Coastguard Worker if [ "$_gen_nlspath_charset" = "$_gen_nlspath_tmplocale" ]; then 370*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_charset="" 371*5a6e8488SAndroid Build Coastguard Worker fi 372*5a6e8488SAndroid Build Coastguard Worker 373*5a6e8488SAndroid Build Coastguard Worker # Split the locale into territory and language. 374*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_char="_" 375*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_territory="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}" 376*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_language="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}" 377*5a6e8488SAndroid Build Coastguard Worker 378*5a6e8488SAndroid Build Coastguard Worker # Check for empty territory and language. 379*5a6e8488SAndroid Build Coastguard Worker if [ "$_gen_nlspath_territory" = "$_gen_nlspath_tmplocale" ]; then 380*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_territory="" 381*5a6e8488SAndroid Build Coastguard Worker fi 382*5a6e8488SAndroid Build Coastguard Worker 383*5a6e8488SAndroid Build Coastguard Worker if [ "$_gen_nlspath_language" = "$_gen_nlspath_tmplocale" ]; then 384*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_language="" 385*5a6e8488SAndroid Build Coastguard Worker fi 386*5a6e8488SAndroid Build Coastguard Worker 387*5a6e8488SAndroid Build Coastguard Worker # Prepare to replace the format specifiers. This is done by wrapping the in 388*5a6e8488SAndroid Build Coastguard Worker # pipe characters. It just makes it easier to split them later. 389*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_needles="%%:%L:%N:%l:%t:%c" 390*5a6e8488SAndroid Build Coastguard Worker 391*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_needles=$(printf '%s' "$_gen_nlspath_needles" | tr ':' '\n') 392*5a6e8488SAndroid Build Coastguard Worker 393*5a6e8488SAndroid Build Coastguard Worker for _gen_nlspath_i in $_gen_nlspath_needles; do 394*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "$_gen_nlspath_i" "|$_gen_nlspath_i|") 395*5a6e8488SAndroid Build Coastguard Worker done 396*5a6e8488SAndroid Build Coastguard Worker 397*5a6e8488SAndroid Build Coastguard Worker # Replace all the format specifiers. 398*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%%" "%") 399*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%L" "$_gen_nlspath_locale") 400*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%N" "$_gen_nlspath_execname") 401*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%l" "$_gen_nlspath_language") 402*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%t" "$_gen_nlspath_territory") 403*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%c" "$_gen_nlspath_charset") 404*5a6e8488SAndroid Build Coastguard Worker 405*5a6e8488SAndroid Build Coastguard Worker # Get rid of pipe characters. 406*5a6e8488SAndroid Build Coastguard Worker _gen_nlspath_nlspath=$(printf '%s' "$_gen_nlspath_nlspath" | tr -d '|') 407*5a6e8488SAndroid Build Coastguard Worker 408*5a6e8488SAndroid Build Coastguard Worker # Return the result. 409*5a6e8488SAndroid Build Coastguard Worker printf '%s' "$_gen_nlspath_nlspath" 410*5a6e8488SAndroid Build Coastguard Worker} 411*5a6e8488SAndroid Build Coastguard Worker 412*5a6e8488SAndroid Build Coastguard WorkerALL=0 413*5a6e8488SAndroid Build Coastguard WorkerNOSKIP=1 414*5a6e8488SAndroid Build Coastguard WorkerSKIP=2 415*5a6e8488SAndroid Build Coastguard Worker 416*5a6e8488SAndroid Build Coastguard Worker# Filters text out of a file according to the build type. 417*5a6e8488SAndroid Build Coastguard Worker# @param in File to filter. 418*5a6e8488SAndroid Build Coastguard Worker# @param out File to write the filtered output to. 419*5a6e8488SAndroid Build Coastguard Worker# @param type Build type. 420*5a6e8488SAndroid Build Coastguard Workerfilter_text() { 421*5a6e8488SAndroid Build Coastguard Worker 422*5a6e8488SAndroid Build Coastguard Worker _filter_text_in="$1" 423*5a6e8488SAndroid Build Coastguard Worker shift 424*5a6e8488SAndroid Build Coastguard Worker 425*5a6e8488SAndroid Build Coastguard Worker _filter_text_out="$1" 426*5a6e8488SAndroid Build Coastguard Worker shift 427*5a6e8488SAndroid Build Coastguard Worker 428*5a6e8488SAndroid Build Coastguard Worker _filter_text_buildtype="$1" 429*5a6e8488SAndroid Build Coastguard Worker shift 430*5a6e8488SAndroid Build Coastguard Worker 431*5a6e8488SAndroid Build Coastguard Worker # Set up some local variables. 432*5a6e8488SAndroid Build Coastguard Worker _filter_text_status="$ALL" 433*5a6e8488SAndroid Build Coastguard Worker _filter_text_last_line="" 434*5a6e8488SAndroid Build Coastguard Worker 435*5a6e8488SAndroid Build Coastguard Worker # We need to set IFS, so we store it here for restoration later. 436*5a6e8488SAndroid Build Coastguard Worker _filter_text_ifs="$IFS" 437*5a6e8488SAndroid Build Coastguard Worker 438*5a6e8488SAndroid Build Coastguard Worker # Remove the file- that will be generated. 439*5a6e8488SAndroid Build Coastguard Worker rm -rf "$_filter_text_out" 440*5a6e8488SAndroid Build Coastguard Worker 441*5a6e8488SAndroid Build Coastguard Worker # Here is the magic. This loop reads the template line-by-line, and based on 442*5a6e8488SAndroid Build Coastguard Worker # _filter_text_status, either prints it to the markdown manual or not. 443*5a6e8488SAndroid Build Coastguard Worker # 444*5a6e8488SAndroid Build Coastguard Worker # Here is how the template is set up: it is a normal markdown file except 445*5a6e8488SAndroid Build Coastguard Worker # that there are sections surrounded tags that look like this: 446*5a6e8488SAndroid Build Coastguard Worker # 447*5a6e8488SAndroid Build Coastguard Worker # {{ <build_type_list> }} 448*5a6e8488SAndroid Build Coastguard Worker # ... 449*5a6e8488SAndroid Build Coastguard Worker # {{ end }} 450*5a6e8488SAndroid Build Coastguard Worker # 451*5a6e8488SAndroid Build Coastguard Worker # Those tags mean that whatever build types are found in the 452*5a6e8488SAndroid Build Coastguard Worker # <build_type_list> get to keep that section. Otherwise, skip. 453*5a6e8488SAndroid Build Coastguard Worker # 454*5a6e8488SAndroid Build Coastguard Worker # Obviously, the tag itself and its end are not printed to the markdown 455*5a6e8488SAndroid Build Coastguard Worker # manual. 456*5a6e8488SAndroid Build Coastguard Worker while IFS= read -r _filter_text_line; do 457*5a6e8488SAndroid Build Coastguard Worker 458*5a6e8488SAndroid Build Coastguard Worker # If we have found an end, reset the status. 459*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_line" = "{{ end }}" ]; then 460*5a6e8488SAndroid Build Coastguard Worker 461*5a6e8488SAndroid Build Coastguard Worker # Some error checking. This helps when editing the templates. 462*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_status" -eq "$ALL" ]; then 463*5a6e8488SAndroid Build Coastguard Worker err_exit "{{ end }} tag without corresponding start tag" 2 464*5a6e8488SAndroid Build Coastguard Worker fi 465*5a6e8488SAndroid Build Coastguard Worker 466*5a6e8488SAndroid Build Coastguard Worker _filter_text_status="$ALL" 467*5a6e8488SAndroid Build Coastguard Worker 468*5a6e8488SAndroid Build Coastguard Worker # We have found a tag that allows our build type to use it. 469*5a6e8488SAndroid Build Coastguard Worker elif [ "${_filter_text_line#\{\{* $_filter_text_buildtype *\}\}}" != "$_filter_text_line" ]; then 470*5a6e8488SAndroid Build Coastguard Worker 471*5a6e8488SAndroid Build Coastguard Worker # More error checking. We don't want tags nested. 472*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_status" -ne "$ALL" ]; then 473*5a6e8488SAndroid Build Coastguard Worker err_exit "start tag nested in start tag" 3 474*5a6e8488SAndroid Build Coastguard Worker fi 475*5a6e8488SAndroid Build Coastguard Worker 476*5a6e8488SAndroid Build Coastguard Worker _filter_text_status="$NOSKIP" 477*5a6e8488SAndroid Build Coastguard Worker 478*5a6e8488SAndroid Build Coastguard Worker # We have found a tag that is *not* allowed for our build type. 479*5a6e8488SAndroid Build Coastguard Worker elif [ "${_filter_text_line#\{\{*\}\}}" != "$_filter_text_line" ]; then 480*5a6e8488SAndroid Build Coastguard Worker 481*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_status" -ne "$ALL" ]; then 482*5a6e8488SAndroid Build Coastguard Worker err_exit "start tag nested in start tag" 3 483*5a6e8488SAndroid Build Coastguard Worker fi 484*5a6e8488SAndroid Build Coastguard Worker 485*5a6e8488SAndroid Build Coastguard Worker _filter_text_status="$SKIP" 486*5a6e8488SAndroid Build Coastguard Worker 487*5a6e8488SAndroid Build Coastguard Worker # This is for normal lines. If we are not skipping, print. 488*5a6e8488SAndroid Build Coastguard Worker else 489*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_status" -ne "$SKIP" ]; then 490*5a6e8488SAndroid Build Coastguard Worker if [ "$_filter_text_line" != "$_filter_text_last_line" ]; then 491*5a6e8488SAndroid Build Coastguard Worker printf '%s\n' "$_filter_text_line" >> "$_filter_text_out" 492*5a6e8488SAndroid Build Coastguard Worker fi 493*5a6e8488SAndroid Build Coastguard Worker _filter_text_last_line="$_filter_text_line" 494*5a6e8488SAndroid Build Coastguard Worker fi 495*5a6e8488SAndroid Build Coastguard Worker fi 496*5a6e8488SAndroid Build Coastguard Worker 497*5a6e8488SAndroid Build Coastguard Worker done < "$_filter_text_in" 498*5a6e8488SAndroid Build Coastguard Worker 499*5a6e8488SAndroid Build Coastguard Worker # Reset IFS. 500*5a6e8488SAndroid Build Coastguard Worker IFS="$_filter_text_ifs" 501*5a6e8488SAndroid Build Coastguard Worker} 502