fluxion/lib/IOUtils.sh

154 lines
5.0 KiB
Bash
Raw Normal View History

#!/bin/bash
if [ "$IOUtilsVersion" ]; then return 0; fi
readonly IOUtilsVersion="1.0"
IOUtilsHeader="[x] ================================ [x]"
IOUtilsQueryMark="[-] "
IOUtilsPrompt="[$USER@$HOSTNAME]> "
if [ ! "$ArrayUtilsVersion" ]; then source lib/ArrayUtils.sh; fi
function io_input_choice() {
local __io_input_choice__choice
until [ ! -z "$__io_input_choice__choice" ]; do
echo -ne "$IOUtilsPrompt"
local __io_input_choice__input
read __io_input_choice__input
local __io_input_choice__choices
for __io_input_choice__choices in ${@}; do
array_contains $__io_input_choice__choices "$__io_input_choice__input"
if [ $? -eq 0 ]; then
__io_input_choice__choice="$__io_input_choice__input"
break
fi
done
done
IOInputChoice=$__io_input_choice__choice
}
function io_dynamic_output() {
eval 'echo -ne "'${@}'"'
}
function io_input_enumerated_choice() {
local __io_input_enumerated_choice__choices=("${!1}")
local __io_input_enumerated_choice__indexes=($(seq ${#__io_input_numeric_choice__choices[@]}))
io_input_choice __io_input_enumerated_choice__indexes[@]
IOInputEnumeratedChoice=${__io_input_enumerated_choice__choices[$IOInputChoice]}
}
# This function outputs formatted lines of fields.
# The function takes an output file (like stdout),
# a "printf format string," and a variable number
# of indirect-expansion passed arrays (reference).
# NOTICE: At least the first array must be passed!
# Example: /dev/stdout "%s is %s." name[@] mood[@]
function io_output_format_fields() {
# Determine the amount of arguments passed.
local __io_output_format_fields__argument_count=${#@}
# Load locally by indirect expansion, ${! ... },
# and mangle the variable number argument arrays.
local __io_output_format_fields__i
for ((__io_output_format_fields__i = 3; \
__io_output_format_fields__i <= __io_output_format_fields__argument_count; \
__io_output_format_fields__i++)); do
eval "local __io_output_format_fields__field$__io_output_format_fields__i=(\"\${!$__io_output_format_fields__i}\")"
done
# Determine the amount of records/lines to print.
# Notice at least the first array must be passed.
local __io_output_format_fields__record_count=${#__io_output_format_fields__field3[@]}
for ((__io_output_format_fields__i = 0; \
__io_output_format_fields__i < __io_output_format_fields__record_count; \
__io_output_format_fields__i++)); do
local __io_output_format_fields__values="\"\${__io_output_format_fields__field"$( \
seq -s "[$__io_output_format_fields__i]}\" \"\${__io_output_format_fields__field" 3 $__io_output_format_fields__argument_count \
)"[$__io_output_format_fields__i]}\""
eval "printf \"$2\" $__io_output_format_fields__values > $1"
done
}
function io_query_format_fields() {
# Assure we've got required parameters.
if [ ${#@} -lt 2 ]; then
return 1
fi
local __io_query_format_fields__argument_count=${#@}
local __io_query_format_fields__query="$1"
local __io_query_format_fields__format="$2"
# Load locally by indirect expansion, ${! ... },
# and mangle the variable number argument arrays.
local __io_query_format_fields__i
for ((__io_query_format_fields__i = 3; \
__io_query_format_fields__i <= __io_query_format_fields__argument_count; \
__io_query_format_fields__i++)); do
eval "local __io_query_format_fields__f$__io_query_format_fields__i=(\"\${!$__io_query_format_fields__i}\")"
done
local __io_query_format_fields__record_count=${#__io_query_format_fields__f3[@]}
local __io_query_format_fields__indexes=($(seq $__io_query_format_fields__record_count))
if [ ! -z "$1" ]; then
if [ "`type -t $(echo -e "$IOUtilsHeader" | grep -vE '\s')`" = "function" ]; then $IOUtilsHeader;
else echo -e "$IOUtilsHeader"; fi
echo -e "$__io_query_format_fields__query"
echo
fi
io_output_format_fields /dev/stdout "$__io_query_format_fields__format" __io_query_format_fields__indexes[@] ${@:3}
echo
io_input_choice __io_query_format_fields__indexes[@]
IOQueryFormatFields=()
for ((__io_query_format_fields__i = 3; \
__io_query_format_fields__i <= __io_query_format_fields__argument_count; \
__io_query_format_fields__i++)); do
eval "IOQueryFormatFields[${#IOQueryFormatFields[@]}]=\${__io_query_format_fields__f$__io_query_format_fields__i[IOInputChoice - 1]}"
done
}
function io_query_choice() {
# Assure we've got required parameters.
if [ ${#@} -lt 2 ]; then
return 1
fi
__io_query_choice__query=$([ -z "$1" ] && echo -n "" || echo -ne "$FLUXIONVLine $1\n")
io_query_format_fields "$__io_query_choice__query" "\t$CRed[$CYel%d$CRed]$CClr %b\n" $2
IOQueryChoice="${IOQueryFormatFields[0]}"
}
function io_query_file() {
if [ ${#@} -lt 2 ]; then
return 1
fi
local __io_query_file__options
# List a line per line and redirect output.
# readarray __io_query_file__options < $2
mapfile __io_query_file__options < $2
# Strip newline characters from array elements
__io_query_file__options=("${__io_query_file__options[@]/$'\n'}")
io_query_choice "$1" __io_query_file__options[@]
IOQueryFile=$IOQueryChoice
}
# FLUXSCRIPT END