1if [ ! "$_STRINGS_SUBR" ]; then _STRINGS_SUBR=1
2#
3# Copyright (c) 2006-2013 Devin Teske
4# All Rights Reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
--- 10 unchanged lines hidden (view full) ---
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD: head/usr.sbin/bsdconfig/share/strings.subr 249751 2013-04-22 05:52:06Z dteske $
28#
29############################################################ GLOBALS
30
31#
32# Valid characters that can appear in an sh(1) variable name
33#
34# Please note that the character ranges A-Z and a-z should be avoided because
35# these can include accent characters (which are not valid in a variable name).
36# For example, A-Z matches any character that sorts after A but before Z,
37# including A and Z. Although ASCII order would make more sense, that is not
38# how it works.
39#
40VALID_VARNAME_CHARS="0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"
41
42############################################################ FUNCTIONS
43
44# f_substr "$string" $start [ $length ]
45#
46# Simple wrapper to awk(1)'s `substr' function.
47#
48f_substr()
49{
50 local string="$1" start="${2:-0}" len="${3:-0}"
51 echo "$string" | awk "{ print substr(\$0, $start, $len) }"
--- 125 unchanged lines hidden (view full) ---
177{
178 if [ $# -gt 0 ]; then
179 echo "$1" | awk "$f_uridecode_awk"
180 else
181 awk "$f_uridecode_awk"
182 fi
183}
184
185# f_replaceall $string $find $replace [$var_to_set]
186#
187# Replace all occurrences of $find in $sting with $replace. If $var_to_set is
188# either missing or NULL, the variable name is produced on standard out for
189# capturing in a sub-shell (which is less recommended due to performance
190# degradation).
191#
192f_replaceall()
193{
194 local __left="" __right="$1"
195 local __find="$2" __replace="$3" __var_to_set="$4"
196 while :; do
197 case "$__right" in *$__find*)
198 __left="$__left${__right%%$__find*}$__replace"
199 __right="${__right#*$__find}"
200 continue
201 esac
202 break
203 done
204 __left="$__left${__right#*$__find}"
205 if [ "$__var_to_set" ]; then
206 setvar "$__var_to_set" "$__left"
207 else
208 echo "$__left"
209 fi
210}
211
212# f_str2varname $string [$var_to_set]
213#
214# Convert a string into a suitable value to be used as a variable name
215# by converting unsuitable characters into the underscrore [_]. If $var_to_set
216# is either missing or NULL, the variable name is produced on standard out for
217# capturing in a sub-shell (which is less recommended due to performance
218# degradation).
219#
220f_str2varname()
221{
222 local __string="$1" __var_to_set="$2"
223 f_replaceall "$__string" "[!$VALID_VARNAME_CHARS]" "_" "$__var_to_set"
224}
225
226# f_shell_escape $string [$var_to_set]
227#
228# Escape $string for shell eval statement(s) by replacing all single-quotes
229# with a special sequence that creates a compound string when interpolated
230# by eval with surrounding single-quotes.
231#
232# For example:
233#
234# foo="abc'123"
235# f_shell_escape "$foo" bar # bar=[abc'\''123]
236# eval echo \'$foo\' # produces abc'123
237#
238# This is helpful when processing an argument list that has to retain its
239# escaped structure for later evaluations.
240#
241# WARNING: Surrounding single-quotes are not added; this is the responsibility
242# of the code passing the escaped values to eval (which also aids readability).
243#
244f_shell_escape()
245{
246 local __string="$1" __var_to_set="$2"
247 f_replaceall "$__string" "'" "'\\''" "$__var_to_set"
248}
249
250# f_shell_unescape $string [$var_to_set]
251#
252# The antithesis of f_shell_escape(), this function takes an escaped $string
253# and expands it.
254#
255# For example:
256#
257# foo="abc'123"
258# f_shell_escape "$foo" bar # bar=[abc'\''123]
259# f_shell_unescape "$bar" # produces abc'123
260#
261f_shell_unescape()
262{
263 local __string="$1" __var_to_set="$2"
264 f_replaceall "$__string" "'\\''" "'" "$__var_to_set"
265}
266
267############################################################ MAIN
268
269f_dprintf "%s: Successfully loaded." strings.subr
270
271fi # ! $_STRINGS_SUBR
2#
3# Copyright (c) 2006-2013 Devin Teske
4# All Rights Reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
--- 10 unchanged lines hidden (view full) ---
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD: head/usr.sbin/bsdconfig/share/strings.subr 249751 2013-04-22 05:52:06Z dteske $
28#
29############################################################ GLOBALS
30
31#
32# Valid characters that can appear in an sh(1) variable name
33#
34# Please note that the character ranges A-Z and a-z should be avoided because
35# these can include accent characters (which are not valid in a variable name).
36# For example, A-Z matches any character that sorts after A but before Z,
37# including A and Z. Although ASCII order would make more sense, that is not
38# how it works.
39#
40VALID_VARNAME_CHARS="0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"
41
42############################################################ FUNCTIONS
43
44# f_substr "$string" $start [ $length ]
45#
46# Simple wrapper to awk(1)'s `substr' function.
47#
48f_substr()
49{
50 local string="$1" start="${2:-0}" len="${3:-0}"
51 echo "$string" | awk "{ print substr(\$0, $start, $len) }"
--- 125 unchanged lines hidden (view full) ---
177{
178 if [ $# -gt 0 ]; then
179 echo "$1" | awk "$f_uridecode_awk"
180 else
181 awk "$f_uridecode_awk"
182 fi
183}
184
185# f_replaceall $string $find $replace [$var_to_set]
186#
187# Replace all occurrences of $find in $sting with $replace. If $var_to_set is
188# either missing or NULL, the variable name is produced on standard out for
189# capturing in a sub-shell (which is less recommended due to performance
190# degradation).
191#
192f_replaceall()
193{
194 local __left="" __right="$1"
195 local __find="$2" __replace="$3" __var_to_set="$4"
196 while :; do
197 case "$__right" in *$__find*)
198 __left="$__left${__right%%$__find*}$__replace"
199 __right="${__right#*$__find}"
200 continue
201 esac
202 break
203 done
204 __left="$__left${__right#*$__find}"
205 if [ "$__var_to_set" ]; then
206 setvar "$__var_to_set" "$__left"
207 else
208 echo "$__left"
209 fi
210}
211
212# f_str2varname $string [$var_to_set]
213#
214# Convert a string into a suitable value to be used as a variable name
215# by converting unsuitable characters into the underscrore [_]. If $var_to_set
216# is either missing or NULL, the variable name is produced on standard out for
217# capturing in a sub-shell (which is less recommended due to performance
218# degradation).
219#
220f_str2varname()
221{
222 local __string="$1" __var_to_set="$2"
223 f_replaceall "$__string" "[!$VALID_VARNAME_CHARS]" "_" "$__var_to_set"
224}
225
226# f_shell_escape $string [$var_to_set]
227#
228# Escape $string for shell eval statement(s) by replacing all single-quotes
229# with a special sequence that creates a compound string when interpolated
230# by eval with surrounding single-quotes.
231#
232# For example:
233#
234# foo="abc'123"
235# f_shell_escape "$foo" bar # bar=[abc'\''123]
236# eval echo \'$foo\' # produces abc'123
237#
238# This is helpful when processing an argument list that has to retain its
239# escaped structure for later evaluations.
240#
241# WARNING: Surrounding single-quotes are not added; this is the responsibility
242# of the code passing the escaped values to eval (which also aids readability).
243#
244f_shell_escape()
245{
246 local __string="$1" __var_to_set="$2"
247 f_replaceall "$__string" "'" "'\\''" "$__var_to_set"
248}
249
250# f_shell_unescape $string [$var_to_set]
251#
252# The antithesis of f_shell_escape(), this function takes an escaped $string
253# and expands it.
254#
255# For example:
256#
257# foo="abc'123"
258# f_shell_escape "$foo" bar # bar=[abc'\''123]
259# f_shell_unescape "$bar" # produces abc'123
260#
261f_shell_unescape()
262{
263 local __string="$1" __var_to_set="$2"
264 f_replaceall "$__string" "'\\''" "'" "$__var_to_set"
265}
266
267############################################################ MAIN
268
269f_dprintf "%s: Successfully loaded." strings.subr
270
271fi # ! $_STRINGS_SUBR