Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 18 additions & 16 deletions lib/bash/arg/lib_arg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[[ -n "${BASE_BASH_LIBS_ARG_LOADED:-}" ]] && return 0
if [[ "${BASE_BASH_LIBS_STDLIB_LOADED:-}" != "1" ]]; then
printf '%s\n' "Error: lib_arg.sh requires lib_std.sh to be sourced first." >&2
return 1 2>/dev/null || exit 1
return 1 2> /dev/null || exit 1
fi
readonly BASE_BASH_LIBS_ARG_LOADED=1

Expand All @@ -23,9 +23,9 @@ __base_bash_libs_arg_assert_distinct_names__() {
local __base_bash_libs_arg_left_index __base_bash_libs_arg_right_index

for ((__base_bash_libs_arg_left_index = 0; __base_bash_libs_arg_left_index < ${#__base_bash_libs_arg_distinct_names[@]}; __base_bash_libs_arg_left_index++)); do
for ((__base_bash_libs_arg_right_index = __base_bash_libs_arg_left_index + 1;
__base_bash_libs_arg_right_index < ${#__base_bash_libs_arg_distinct_names[@]};
__base_bash_libs_arg_right_index++)); do
for ((__base_bash_libs_arg_right_index = __base_bash_libs_arg_left_index + 1; \
__base_bash_libs_arg_right_index < ${#__base_bash_libs_arg_distinct_names[@]}; \
__base_bash_libs_arg_right_index++)); do
if [[ "${__base_bash_libs_arg_distinct_names[__base_bash_libs_arg_left_index]}" == "${__base_bash_libs_arg_distinct_names[__base_bash_libs_arg_right_index]}" ]]; then
base_std_log_error -l base_bash_libs.arg \
"base_arg_parse: caller-owned variables must be distinct; '${__base_bash_libs_arg_distinct_names[__base_bash_libs_arg_left_index]}' was provided more than once."
Expand Down Expand Up @@ -111,7 +111,7 @@ __base_bash_libs_arg_parse_specs__() {
base_std_log_error -l base_bash_libs.arg "base_arg_parse: option spec '$__base_bash_libs_arg_spec' contains an empty option token."
return 2
fi
IFS='|' read -r -a __base_bash_libs_arg_tokens <<<"$__base_bash_libs_arg_tokens_part"
IFS='|' read -r -a __base_bash_libs_arg_tokens <<< "$__base_bash_libs_arg_tokens_part"
for __base_bash_libs_arg_token in "${__base_bash_libs_arg_tokens[@]+"${__base_bash_libs_arg_tokens[@]}"}"; do
if ! [[ "$__base_bash_libs_arg_token" =~ $__base_bash_libs_arg_token_re ]] || [[ "$__base_bash_libs_arg_token" == *"="* ]]; then
base_std_log_error -l base_bash_libs.arg "base_arg_parse: option spec '$__base_bash_libs_arg_spec' has invalid option token '$__base_bash_libs_arg_token'."
Expand Down Expand Up @@ -256,28 +256,30 @@ base_arg_parse() {
__base_bash_libs_arg_set_assoc_value__ "$__base_bash_libs_arg_options_name" "$__base_bash_libs_arg_option_name" "${__base_bash_libs_arg_options[$__base_bash_libs_arg_option_name]}"
done
fi
eval "$__base_bash_libs_arg_positionals_name=()"
for __base_bash_libs_arg_current in "${__base_bash_libs_arg_positionals[@]+"${__base_bash_libs_arg_positionals[@]}"}"; do
eval "$__base_bash_libs_arg_positionals_name+=(\"\$__base_bash_libs_arg_current\")"
done
if ((${#__base_bash_libs_arg_positionals[@]} > 0)); then
eval "$__base_bash_libs_arg_positionals_name=(\"\${__base_bash_libs_arg_positionals[@]}\")"
else
eval "$__base_bash_libs_arg_positionals_name=()"
fi

for __base_bash_libs_arg_repeatable_name in "${__base_bash_libs_arg_repeatable_names[@]+"${__base_bash_libs_arg_repeatable_names[@]}"}"; do
__base_bash_libs_arg_publish_values=()
# shellcheck disable=SC2199 # The + expansion safely detects Bash 4.2 empty arrays under nounset.
if [[ -n "${__base_bash_libs_arg_repeatable_values[@]+set}" ]]; then
for ((__base_bash_libs_arg_repeatable_index = 0;
__base_bash_libs_arg_repeatable_index < ${#__base_bash_libs_arg_repeatable_values[@]};
__base_bash_libs_arg_repeatable_index += 2)); do
for ((__base_bash_libs_arg_repeatable_index = 0; \
__base_bash_libs_arg_repeatable_index < ${#__base_bash_libs_arg_repeatable_values[@]}; \
__base_bash_libs_arg_repeatable_index += 2)); do
if [[ "${__base_bash_libs_arg_repeatable_values[__base_bash_libs_arg_repeatable_index]}" == "$__base_bash_libs_arg_repeatable_name" ]]; then
__base_bash_libs_arg_repeatable_value="${__base_bash_libs_arg_repeatable_values[__base_bash_libs_arg_repeatable_index + 1]}"
__base_bash_libs_arg_publish_values+=("$__base_bash_libs_arg_repeatable_value")
fi
done
fi
eval "$__base_bash_libs_arg_repeatable_name=()"
for __base_bash_libs_arg_repeatable_value in "${__base_bash_libs_arg_publish_values[@]+"${__base_bash_libs_arg_publish_values[@]}"}"; do
eval "$__base_bash_libs_arg_repeatable_name+=(\"\$__base_bash_libs_arg_repeatable_value\")"
done
if ((${#__base_bash_libs_arg_publish_values[@]} > 0)); then
eval "$__base_bash_libs_arg_repeatable_name=(\"\${__base_bash_libs_arg_publish_values[@]}\")"
else
eval "$__base_bash_libs_arg_repeatable_name=()"
fi
done
return 0
}
39 changes: 20 additions & 19 deletions lib/bash/list/lib_list.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[[ -n "${BASE_BASH_LIBS_LIST_LOADED:-}" ]] && return 0
if [[ "${BASE_BASH_LIBS_STDLIB_LOADED:-}" != "1" ]]; then
printf '%s\n' "Error: lib_list.sh requires lib_std.sh to be sourced first." >&2
return 1 2>/dev/null || exit 1
return 1 2> /dev/null || exit 1
fi
readonly BASE_BASH_LIBS_LIST_LOADED=1

Expand Down Expand Up @@ -46,22 +46,21 @@ base_list_prepend() {
return 2
fi
__base_bash_libs_std_assert_public_variable_names__ base_list_prepend "${1-}" || return 1
local __base_bash_libs_list_array_name="$1" __base_bash_libs_list_item
local -a __base_bash_libs_list_values=() __base_bash_libs_list_current=()
local __base_bash_libs_list_array_name="$1"
local -a __base_bash_libs_list_values=() __base_bash_libs_list_current=() __base_bash_libs_list_combined=()

base_std_assert_variable_name "$__base_bash_libs_list_array_name"
base_std_assert_indexed_array "$__base_bash_libs_list_array_name"
__base_bash_libs_std_assert_writable_output__ base_list_prepend "$__base_bash_libs_list_array_name" || return 1
shift
__base_bash_libs_list_values=("$@")
eval "if [[ -n \"\${${__base_bash_libs_list_array_name}[@]+set}\" ]]; then __base_bash_libs_list_current=(\"\${${__base_bash_libs_list_array_name}[@]}\"); fi"
eval "$__base_bash_libs_list_array_name=()"
for __base_bash_libs_list_item in "${__base_bash_libs_list_values[@]+"${__base_bash_libs_list_values[@]}"}"; do
eval "$__base_bash_libs_list_array_name+=(\"\$__base_bash_libs_list_item\")"
done
for __base_bash_libs_list_item in "${__base_bash_libs_list_current[@]+"${__base_bash_libs_list_current[@]}"}"; do
eval "$__base_bash_libs_list_array_name+=(\"\$__base_bash_libs_list_item\")"
done
__base_bash_libs_list_combined=("${__base_bash_libs_list_values[@]+"${__base_bash_libs_list_values[@]}"}" "${__base_bash_libs_list_current[@]+"${__base_bash_libs_list_current[@]}"}")
if ((${#__base_bash_libs_list_combined[@]} > 0)); then
eval "$__base_bash_libs_list_array_name=(\"\${__base_bash_libs_list_combined[@]}\")"
else
eval "$__base_bash_libs_list_array_name=()"
fi
}

#
Expand All @@ -70,7 +69,7 @@ base_list_prepend() {
base_list_remove() {
base_std_assert_arg_count "$#" 2
__base_bash_libs_std_assert_public_variable_names__ base_list_remove "${1-}" || return 1
local __base_bash_libs_list_array_name="$1" __base_bash_libs_list_needle="$2" __base_bash_libs_list_item
local __base_bash_libs_list_array_name="$1" __base_bash_libs_list_needle="$2"
local -a __base_bash_libs_list_current=() __base_bash_libs_list_filtered=()

base_std_assert_variable_name "$__base_bash_libs_list_array_name"
Expand All @@ -83,10 +82,11 @@ base_list_remove() {
__base_bash_libs_list_filtered+=("$__base_bash_libs_list_item")
done

eval "$__base_bash_libs_list_array_name=()"
for __base_bash_libs_list_item in "${__base_bash_libs_list_filtered[@]+"${__base_bash_libs_list_filtered[@]}"}"; do
eval "$__base_bash_libs_list_array_name+=(\"\$__base_bash_libs_list_item\")"
done
if ((${#__base_bash_libs_list_filtered[@]} > 0)); then
eval "$__base_bash_libs_list_array_name=(\"\${__base_bash_libs_list_filtered[@]}\")"
else
eval "$__base_bash_libs_list_array_name=()"
fi
}

base_list_contains() {
Expand Down Expand Up @@ -126,10 +126,11 @@ base_list_unique() {
__base_bash_libs_list_unique+=("$__base_bash_libs_list_item")
done

eval "$__base_bash_libs_list_result_name=()"
for __base_bash_libs_list_item in "${__base_bash_libs_list_unique[@]+"${__base_bash_libs_list_unique[@]}"}"; do
eval "$__base_bash_libs_list_result_name+=(\"\$__base_bash_libs_list_item\")"
done
if ((${#__base_bash_libs_list_unique[@]} > 0)); then
eval "$__base_bash_libs_list_result_name=(\"\${__base_bash_libs_list_unique[@]}\")"
else
eval "$__base_bash_libs_list_result_name=()"
fi
}

base_list_length() {
Expand Down
Loading