]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bc/functions.sh
amd64: use register macros for gdb_cpu_getreg()
[FreeBSD/FreeBSD.git] / contrib / bc / functions.sh
1 #! /bin/sh
2 #
3 # SPDX-License-Identifier: BSD-2-Clause
4 #
5 # Copyright (c) 2018-2020 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
30 readlink() {
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
54 err_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         printf '\nexiting...\n'
63         exit "$2"
64 }
65
66 die() {
67
68         _die_d="$1"
69         shift
70
71         _die_msg="$1"
72         shift
73
74         _die_name="$1"
75         shift
76
77         _die_err="$1"
78         shift
79
80         _die_str=$(printf '\n%s %s on test:\n\n    %s\n' "$_die_d" "$_die_msg" "$_die_name")
81
82         err_exit "$_die_str" "$_die_err"
83 }
84
85 checkcrash() {
86
87         _checkcrash_d="$1"
88         shift
89
90         _checkcrash_error="$1"
91         shift
92
93         _checkcrash_name="$1"
94         shift
95
96         if [ "$_checkcrash_error" -gt 127 ]; then
97                 die "$_checkcrash_d" "crashed ($_checkcrash_error)" \
98                         "$_checkcrash_name" "$_checkcrash_error"
99         fi
100 }
101
102 checktest()
103 {
104         _checktest_d="$1"
105         shift
106
107         _checktest_error="$1"
108         shift
109
110         _checktest_name="$1"
111         shift
112
113         _checktest_out="$1"
114         shift
115
116         _checktest_exebase="$1"
117         shift
118
119         checkcrash "$_checktest_d" "$_checktest_error" "$_checktest_name"
120
121         if [ "$_checktest_error" -eq 0 ]; then
122                 die "$_checktest_d" "returned no error" "$_checktest_name" 127
123         fi
124
125         if [ "$_checktest_error" -eq 100 ]; then
126
127                 _checktest_output=$(cat "$_checktest_out")
128                 _checktest_fatal_error="Fatal error"
129
130                 if [ "${_checktest_output##*$_checktest_fatal_error*}" ]; then
131                         printf "%s\n" "$_checktest_output"
132                         die "$_checktest_d" "had memory errors on a non-fatal error" \
133                                 "$_checktest_name" "$_checktest_error"
134                 fi
135         fi
136
137         if [ ! -s "$_checktest_out" ]; then
138                 die "$_checktest_d" "produced no error message" "$_checktest_name" "$_checktest_error"
139         fi
140
141         # Display the error messages if not directly running exe.
142         # This allows the script to print valgrind output.
143         if [ "$_checktest_exebase" != "bc" -a "$_checktest_exebase" != "dc" ]; then
144                 cat "$_checktest_out"
145         fi
146 }
147
148 substring_replace() {
149
150         _substring_replace_str="$1"
151         shift
152
153         _substring_replace_needle="$1"
154         shift
155
156         _substring_replace_replacement="$1"
157         shift
158
159         _substring_replace_result=$(printf '%s\n' "$_substring_replace_str" | \
160                 sed -e "s!$_substring_replace_needle!$_substring_replace_replacement!g")
161
162         printf '%s' "$_substring_replace_result"
163 }
164
165 gen_nlspath() {
166
167         _gen_nlspath_nlspath="$1"
168         shift
169
170         _gen_nlspath_locale="$1"
171         shift
172
173         _gen_nlspath_execname="$1"
174         shift
175
176         _gen_nlspath_char="@"
177         _gen_nlspath_modifier="${_gen_nlspath_locale#*$_gen_nlspath_char}"
178         _gen_nlspath_tmplocale="${_gen_nlspath_locale%%$_gen_nlspath_char*}"
179
180         _gen_nlspath_char="."
181         _gen_nlspath_charset="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}"
182         _gen_nlspath_tmplocale="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}"
183
184         if [ "$_gen_nlspath_charset" = "$_gen_nlspath_tmplocale" ]; then
185                 _gen_nlspath_charset=""
186         fi
187
188         _gen_nlspath_char="_"
189         _gen_nlspath_territory="${_gen_nlspath_tmplocale#*$_gen_nlspath_char}"
190         _gen_nlspath_language="${_gen_nlspath_tmplocale%%$_gen_nlspath_char*}"
191
192         if [ "$_gen_nlspath_territory" = "$_gen_nlspath_tmplocale" ]; then
193                 _gen_nlspath_territory=""
194         fi
195
196         if [ "$_gen_nlspath_language" = "$_gen_nlspath_tmplocale" ]; then
197                 _gen_nlspath_language=""
198         fi
199
200         _gen_nlspath_needles="%%:%L:%N:%l:%t:%c"
201
202         _gen_nlspath_needles=$(printf '%s' "$_gen_nlspath_needles" | tr ':' '\n')
203
204         for _gen_nlspath_i in $_gen_nlspath_needles; do
205                 _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "$_gen_nlspath_i" "|$_gen_nlspath_i|")
206         done
207
208         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%%" "%")
209         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%L" "$_gen_nlspath_locale")
210         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%N" "$_gen_nlspath_execname")
211         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%l" "$_gen_nlspath_language")
212         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%t" "$_gen_nlspath_territory")
213         _gen_nlspath_nlspath=$(substring_replace "$_gen_nlspath_nlspath" "%c" "$_gen_nlspath_charset")
214
215         _gen_nlspath_nlspath=$(printf '%s' "$_gen_nlspath_nlspath" | tr -d '|')
216
217         printf '%s' "$_gen_nlspath_nlspath"
218 }