• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#! /bin/sh
2#
3# Copyright (c) 2018-2019 Gavin D. Howard and contributors.
4#
5# All rights reserved.
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	printf '\nexiting...\n'
63	exit "$2"
64}
65
66die() {
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
85checkcrash() {
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
102checktest()
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
148substring_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' "$_substring_replace_str" | \
160		sed -e "s!$_substring_replace_needle!$_substring_replace_replacement!g")
161
162	printf '%s\n' "$_substring_replace_result"
163}
164
165gen_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}
219