zsh-workers
 help / color / mirror / code / Atom feed
From: Oliver Kiddle <opk@zsh.org>
To: Zsh workers <zsh-workers@zsh.org>
Subject: PATCH: complete probes for dtrace completion
Date: Tue, 23 Mar 2021 23:43:12 +0100	[thread overview]
Message-ID: <35706-1616539392.227174@49wn.5333.Rj93> (raw)

This adds completion of dtrace probes with the -P -m -f and -n options.
Runtime options with the -x option are also now completed.
Aside from runtime options, the main options don't appear to have
changed.

I lack proper access to macOS but managed to ascertain that dtrace -l
there lists some functions where the names contain colons, spaces and
square brackets. The names look like Objective C stuff and are perhaps
just unmangled forms. I have no idea how these might be specified or
used but for the purposes of the completion, I have simply filtered them
out. Separating the four fields in the output is tricky enough anyway -
the module and function fields can be blank and column alignment can't
be relied upon. runtime options (-x) may also differ on macOS.

The probes could also be completed for -c but that has a somewhat
different form with all four fields being specified, wildcards being
allowed and is followed by a full D script.

Oliver

diff --git a/Completion/Solaris/Command/_dtrace b/Completion/Solaris/Command/_dtrace
index a095589eb..bb5193163 100644
--- a/Completion/Solaris/Command/_dtrace
+++ b/Completion/Solaris/Command/_dtrace
@@ -1,41 +1,99 @@
 #compdef dtrace
-# Synced with Nevada build 160 man pages
 
-_dtrace() {
-	_arguments -s \
-	'-32[generate 32-bit D programs and ELF files]' \
-	'-64[generate 64-bit D programs and ELF files]' \
-	'-a[claim anonymous tracing state]' \
-	'-A[generate driver.conf(4) directives for anonymous tracing]' \
-	'-b[set trace buffer size]' \
-	'-c[run specified command and exit upon its completion]' \
-	'-C[run cpp(1) preprocessor on script files]' \
-	'-D[define symbol when invoking preprocessor]' \
-	'-e[exit after compiling request but prior to enabling probes]' \
-	'-f[enable or list probes matching the specified function name]:function: ' \
-	'-F[coalesce trace output by function]' \
-	'-G[generate an ELF file containing embedded dtrace program]' \
-	'-H[print included files when invoking preprocessor]' \
-	'-h[Generate a header file]' \
-	'-i[enable or list probes matching the specified probe id]' \
-	'-I[add include directory to preprocessor search path]:include dir:_files -/' \
-	'-L[Add directory to search path for DTrace libraries]:lib dir:_files -/' \
-	'-l[list probes matching specified criteria]' \
-	'-m[enable or list probes matching the specified module name]:module: ' \
-	'-n[enable or list probes matching the specified probe name]:name: ' \
-	'-o[set output file]:output file:_files' \
-	'-p[grab specified process-ID and cache its symbol tables]:pid:_pids' \
-	'-P[enable or list probes matching the specified provider name]:provider: ' \
-	'-q[set quiet mode (only output explicitly traced data)]' \
-	'-s[enable or list probes according to the specified D script]' \
-	'-S[print D compiler intermediate code]' \
-	'-U[undefine symbol when invoking preprocessor]' \
-	'-v[set verbose mode (report program stability attributes)]' \
-	'-V[report DTrace API version]' \
-	'-w[permit destructive actions]' \
-	'-x[enable or modify compiler and tracing options]' \
-	'-X[specify ISO C conformance settings for preprocessor]:ISO C conformance:((a\:"ISO plus K&R extensions (default)" c\:"Strictly conformant ISO C" s\:"K&R C only" t\:"ISO plus K&R extensions"))' \
-	'-Z[permit probe descriptions that match zero probes]'
-}
+local curcontext="$curcontext" ret=1
+local -a state line args
 
-_dtrace "$@"
+case $OSTYPE in
+  ^darwin*)
+    args=(
+      '-32[generate 32-bit D programs and ELF files]'
+      '-64[generate 64-bit D programs and ELF files]'
+      '(-A -h -l -V)-G[generate an ELF file containing embedded dtrace program]'
+    )
+  ;;
+  darwin*)
+    args=(
+      '*-W[wait for the named process to launch]:name'
+    )
+  ;;
+esac
+
+_arguments -C -s $args \
+  '-a[claim anonymous tracing state]' \
+  '(-G -h -l -V)-A[generate driver.conf(4) directives for anonymous tracing]' \
+  '-b+[set trace buffer size]:size' \
+  '*-c+[run specified command and exit upon its completion]:command' \
+  '-C[run cpp(1) preprocessor on script files]' \
+  '*-D+[define symbol when invoking preprocessor]:name' \
+  '-e[exit after compiling request but prior to enabling probes]' \
+  '-f+[enable or list probes matching the specified function name]:function:->functions' \
+  '-F[coalesce trace output by function]' \
+  '-H[print included files when invoking preprocessor]' \
+  '(-A -G -l -V)-h[generate a header file]' \
+  '*-i+[enable or list probes matching the specified probe id]:probe-id' \
+  '-I+[add include directory to preprocessor search path]:path:_directories' \
+  '(-A -G -h -V)-l[list probes instead of enabling them]' \
+  '-L+[add directory to search path for DTrace libraries]:path:_directories' \
+  '*-m+[trace or list probes matching the specified module name]:module:->modules' \
+  '*-n+[trace or list probes matching the specified probe name]:name:->probes' \
+  '-o+[set output file]:output file:_files' \
+  '-p+[grab specified process-ID and cache its symbol tables]:pid:_pids' \
+  '*-P+[trace or list probes matching the specified provider name]:provider:->providers' \
+  '-q[set quiet mode (only output explicitly traced data)]' \
+  '*-s+[enable or list probes according to the specified D script]:script file:_files' \
+  '-S[print D compiler intermediate code]' \
+  '*-U+[undefine symbol when invoking preprocessor]:name' \
+  '-v[set verbose mode (report program stability attributes)]' \
+  '(-A -G -h -l)-V[report DTrace API version]' \
+  '-w[permit destructive actions]' \
+  '*-x+[enable or modify compiler and tracing options]: : _values option
+    "aggrate[rate of aggregation reading]\:time"
+    "aggsize[aggregation buffer size]\:size"
+    "ustackframes[number of user stack frames]\:scalar"
+    "bufpolicy[specify the buffer policy for the principal buffer]\:policy\:(fill switch ring)"
+    "bufresize[buffer resizing policy]\:policy\:(auto manual)"
+    "bufsize[size of the per-CPU principal buffer]\:size"
+    "cleanrate[cleaning rate (hz)]\:time"
+    "cpu[specify the CPU on which to enable tracing]\:scalar"
+    "defaultargs[allow references to unspecified macro arguments]"
+    "destructive[allow destructive actions]"
+    "dynvarsize[size of the dynamic variable space]\:size"
+    "flowindent[turn on flow indentation]"
+    "grabanon[claim anonymous state]"
+    "jstackframes[number of default stack frames for jstack()]\:scalar"
+    "jstackstrsize[default string space size for jstack()]\:scalar"
+    "nspec[number of speculations]\:scalar"
+    "quiet[set quiet mode]"
+    "specsize[size of the speculation buffer]\:size"
+    "strsize[maximum size of strings]\:size"
+    "stackframes[maximum number of kernelspace stack frames to unwind for stack()]\:scalar"
+    "stackindent[whitespace characters to use when indenting stack() and ustack() output]\:scalar"
+    "statusrate[rate of status checking]\:time"
+    "switchrate[rate of buffer switching]\:time"
+    "ustackframes[maximum number of userspace stack frames to unwind for ustack()]\:scalar"' \
+  '-X+[specify ISO C conformance settings for preprocessor]:ISO C conformance:((a\:"ISO plus K&R extensions (default)" c\:"Strictly conformant ISO C" s\:"K&R C only" t\:"ISO plus K&R extensions"))' \
+  '-Z[permit probe descriptions that match zero probes]' && return
+
+if [[ -n $state ]]; then
+  local -a fields=( providers modules functions probes )
+  local -a suf=( : : : )
+  typeset -ga _cache_dtrace_probes
+  (( $#_cache_dtrace_probes )) || _cache_dtrace_probes=(
+      ${${${${(f)"$(_call_program dtrace-probes dtrace -l)"}[2,-1]}:#*[:[]}/(#b) #<-> #([^ ]#) #([^ ]#) #([^ ]#) ##([^ ]##)/${match[1]}:${match[3]:+$match[2]}:${match[3]:-$match[2]}:$match[4]}
+  ) # filtering out those containing : and [, they occur on macos but may just be unmangled forms and not directly usable
+  suf[${fields[(i)$state]}]=( "${compstate[quote][-1]} " ) # field matching the state gets a space suffix
+  while compset -P 1 '*:'; do
+    shift fields # each already listed field reduces one being possible
+  done
+  _tags dtrace-${^fields[1,(r)$state]}
+  while _tags; do
+    _requested dtrace-probes expl 'probe name' compadd -S "$suf[4]" - ${${(M)_cache_dtrace_probes:#((#s)|*:)${IPREFIX}[^:]#(#e)}##*:} && ret=0
+    _requested dtrace-functions expl 'function' compadd -S "$suf[3]" - ${${${(M)_cache_dtrace_probes:#((#s)|*:)${IPREFIX}[^:]#:[^:]#(#e)}%:*}##*:} && ret=0
+    _requested dtrace-modules expl 'module' compadd -S "$suf[2]" - ${${${(M)_cache_dtrace_probes:#((#s)|*:)${IPREFIX}[^:]#:[^:]#:[^:]#(#e)}#*:}%%:*} && ret=0
+    _requested dtrace-providers expl 'provider' compadd -S "$suf[1]" - ${_cache_dtrace_probes%%:*} && ret=0
+
+    (( ret )) || return 0
+  done
+fi
+
+return 1


             reply	other threads:[~2021-03-23 22:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23 22:43 Oliver Kiddle [this message]
2021-03-24 11:17 ` Jun T
2021-03-24 11:30   ` Jun T
2021-03-24 23:42   ` Oliver Kiddle
2021-03-25  1:58     ` Jun T

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=35706-1616539392.227174@49wn.5333.Rj93 \
    --to=opk@zsh.org \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).