parent
ca1a9b1f1b
commit
3e8baf4b3e
1 changed files with 121 additions and 0 deletions
@ -0,0 +1,121 @@ |
||||
#!/bin/bash |
||||
|
||||
THIS_SCRIPT_NAME="$(basename ${BASH_SOURCE[0]})" |
||||
|
||||
function pass() { |
||||
: |
||||
} |
||||
|
||||
function print_log() { |
||||
printf "[$THIS_SCRIPT_NAME][$(date --iso-8601=ns)] $1\n" |
||||
} |
||||
|
||||
function log_error() { |
||||
print_log "error: $1" >&2 |
||||
|
||||
if [[ $2 =~ ^[0-9]+$ ]] |
||||
then |
||||
exit $2 |
||||
fi |
||||
} |
||||
|
||||
function print_space_indent() { |
||||
# note: indent_depth has script-wide scope |
||||
printf "%*s" ${1:-$indent_depth} |
||||
} |
||||
|
||||
function print_tab_indent() { |
||||
printf "\t" |
||||
} |
||||
|
||||
function indent() { |
||||
local indent_count=$([[ $1 =~ ^[0-9]+$ ]] && [[ $1 > 0 ]] && echo $1 || echo 1) |
||||
# note: indent_type has script-wide scope |
||||
local cmd_print_indent=$([[ $indent_type == s ]] && echo print_space_indent || echo print_tab_indent) |
||||
|
||||
$cmd_log "indent_count=[$indent_count]" |
||||
|
||||
for ((i=0; i<$indent_count; i++)) |
||||
do |
||||
$cmd_print_indent $2 |
||||
done |
||||
} |
||||
|
||||
# set option defaults before processing options |
||||
cmd_log=print_log |
||||
pm_perfix="\$anvil" |
||||
indent_type=s |
||||
# number of spaces per indent; only when indent_type is space |
||||
indent_depth=4 |
||||
# match subprocesses to skip; skip new, parent, and private subprocesses by default |
||||
ignore_sub_name_pattern="^(new|parent|_[^[:space:]]+)$" |
||||
|
||||
while getopts ":i:no:p:" option |
||||
do |
||||
case "$option" in |
||||
i) |
||||
if [[ $OPTARG =~ ^[0-9]+$ ]] && [[ $OPTARG > 0 ]] |
||||
then |
||||
indent_depth=$OPTARG |
||||
elif [[ $OPTARG == t ]] |
||||
then |
||||
indent_type=t |
||||
fi |
||||
;; |
||||
n) |
||||
cmd_log=pass |
||||
;; |
||||
o) |
||||
pm_perfix="$OPTARG" |
||||
;; |
||||
p) |
||||
ignore_sub_name_pattern="$OPTARG" |
||||
;; |
||||
:) |
||||
log_error "option [$OPTARG] missing argument" 1 |
||||
;; |
||||
[?]) |
||||
log_error "unrecognized option [$OPTARG]" 1 |
||||
;; |
||||
esac |
||||
done |
||||
|
||||
shift $(($OPTIND - 1)) |
||||
|
||||
# get positional parameters after processing options |
||||
pm_path="$1" |
||||
|
||||
$cmd_log "pm_path=[$pm_path]" |
||||
$cmd_log "pm_perfix=[$pm_perfix]" |
||||
$cmd_log "indent_depth=[$indent_depth]" |
||||
$cmd_log "ignore_sub_name_pattern=[$ignore_sub_name_pattern]" |
||||
|
||||
pm_name="$( \ |
||||
sed -E -n "s@^[[:space:]]*package[[:space:]]+([^[:space:]]+::)+([^[:space:]]+);.*\$@\2@p" "$pm_path" \ |
||||
)" |
||||
|
||||
$cmd_log "pm_name=[$pm_name]" |
||||
|
||||
pm_dispatch_table="my \$pm_${pm_name,,}_dispatch_table = {"; |
||||
|
||||
for sub_name in $(sed -E -n "s@^[[:space:]]*sub[[:space:]]+([^[:space:]]+).*\$@\1@p" "$pm_path") |
||||
do |
||||
if ! [[ "$sub_name" =~ $ignore_sub_name_pattern ]] |
||||
then |
||||
cat << EOF |
||||
sub ${sub_name} |
||||
{ |
||||
$(indent)my \$parameters = shift; |
||||
$(indent)${pm_perfix}->${pm_name}->${sub_name}(\$parameters); |
||||
} |
||||
|
||||
EOF |
||||
|
||||
pm_dispatch_table="${pm_dispatch_table}\n$(indent)'${sub_name}' => \&${sub_name}," |
||||
else |
||||
$cmd_log "subprocess [$sub_name] skipped" |
||||
fi |
||||
done |
||||
|
||||
printf "${pm_dispatch_table%,}\n};\n" |
||||
|
Loading…
Reference in new issue