61 lines
818 B
Bash
61 lines
818 B
Bash
|
get_cmd() {
|
||
|
if (( $# )); then
|
||
|
IFS= read -ep "$(build_prompt)" "$1"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
parse_cmd() {
|
||
|
local cmd=( ) arg
|
||
|
declare -n serialized=$1
|
||
|
|
||
|
route_cmd "$2"
|
||
|
|
||
|
serialized=*${#cmd[@]}$'\r\n'
|
||
|
serialized+=${cmd[0]^^}
|
||
|
|
||
|
for arg in "${cmd[@]:1}"; do
|
||
|
serialized+=$arg
|
||
|
done
|
||
|
}
|
||
|
|
||
|
route_cmd() {
|
||
|
case $1 in
|
||
|
[[:space:]]*)
|
||
|
parse_ws "$1"
|
||
|
;;
|
||
|
"")
|
||
|
return 0
|
||
|
;;
|
||
|
*)
|
||
|
parse_word "$1"
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
parse_ws() {
|
||
|
local line=$1
|
||
|
|
||
|
while (( ${#line} )) && [[ $line = [[:space:]]* ]]; do
|
||
|
line=${line:1}
|
||
|
done
|
||
|
|
||
|
route_cmd "$line"
|
||
|
}
|
||
|
|
||
|
parse_word() {
|
||
|
local arg line=$1
|
||
|
|
||
|
while (( ${#line} )); do
|
||
|
local next=${line:0:1}
|
||
|
|
||
|
if [[ $next != [[:space:]] ]]; then
|
||
|
arg+=$next
|
||
|
line=${line:1}
|
||
|
else
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
cmd+=( "\$${#arg}"$'\r\n'"$arg"$'\r\n' )
|
||
|
route_cmd "$line"
|
||
|
}
|