summaryrefslogtreecommitdiff
path: root/Completion/User/_gprof
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User/_gprof')
-rw-r--r--Completion/User/_gprof60
1 files changed, 53 insertions, 7 deletions
diff --git a/Completion/User/_gprof b/Completion/User/_gprof
index 0a1d621be..659e921e8 100644
--- a/Completion/User/_gprof
+++ b/Completion/User/_gprof
@@ -1,12 +1,58 @@
#compdef gprof
-_arguments -s -{a,b,c,D,h,i,l,L,s,T,v,w,x,y,z} \
- -{A,C,e,E,f,F,J,n,N,O,p,P,q,Q,Z}:'function name: _exec_funcs' \
+local curcontext="$curcontext" state line ret=1
+typeset -A opt_args
+
+_arguments -C -s -{a,b,c,D,h,i,l,L,s,T,v,w,x,y,z} \
+ -{A,C,e,E,f,F,J,n,N,O,p,P,q,Q,Z}:'function name:->funcs' \
'-I:directory:_dir_list' \
- '-d-:debug level:' '-k:function names: _exec_funcs -p' \
+ '-d-:debug level:' '-k:function names:->pair' \
'-m:minimum execution count:' \
- ':executable:_files -g *(*)' \
- ':profile file:_files -g gmon.*' \
+ ':executable:_files -g \*\(\*\)' \
+ ':profile file:_files -g gmon.\*' \
-- -s '(#--[no-] --)' \
- '*=name*:function name: _exec_funcs' \
- '*=dirs*:directory:_dir_list'
+ '*=name*:function name:->funcs' \
+ '*=dirs*:directory:_dir_list' && ret=0
+
+if [[ -n "$state" ]]; then
+ local cmd pair expl
+
+ _tags functions || return 1
+
+ [[ "$state" = pair ]] && pair=yes
+
+ if [[ $#line -gt 1 ]]; then
+ cmd="$line[2]"
+ else
+ return 1
+ fi
+
+ if [[ -n "$cmd" ]]; then
+ if [[ "$cmd" = /* ]]; then
+ tmp="$cmd"
+ else
+ tmp="$PWD/$cmd"
+ fi
+
+ if [[ "$tmp" != "$_gprof_command" ]]; then
+ _gprof_command="$tmp"
+ _gprof_funcs=( "${(@)${(@M)${(@f)$(nm $cmd)}:#[^ ]# [tT] ([^_]|_[^_])*}##* }" )
+ fi
+
+ if [[ -n "$pair" ]]; then
+ if compset -P '*/'; then
+ expl='call arc to function'
+ else
+ expl='call arc from function'
+ fi
+ else
+ expl=function
+ fi
+ _wanted functions expl "$expl" \
+ compadd "$expl[@]" -M 'r:|_=* r:|=*' - "$_gprof_funcs[@]" && ret=0
+ else
+ return 1
+ fi
+fi
+
+return ret