summary refs log tree commit diff
path: root/Completion/Unix
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Command/_dd112
1 files changed, 97 insertions, 15 deletions
diff --git a/Completion/Unix/Command/_dd b/Completion/Unix/Command/_dd
index e51337f21..e5c5e63ce 100644
--- a/Completion/Unix/Command/_dd
+++ b/Completion/Unix/Command/_dd
@@ -1,17 +1,99 @@
 #compdef dd gdd
 
-_values -w 'option' \
-  'if[specify input file]:input file:_tilde_files' \
-  'of[specify output file]:output file:_tilde_files' \
-  '(bs)ibs[input block size]:block size (bytes)' \
-  '(bs)obs[output block size]:block size (bytes)' \
-  '(ibs obs)bs[block size]:block size (bytes)' \
-  'cbs[conversion buffer size]:buffer size (bytes)' \
-  'skip[input blocks initially skipped]:blocks' \
-  'seek[output blocks initially skipped]:blocks' \
-  'files[specify number of input files to copy and concatenate]:number of files' \
-  'count[number of input blocks to copy]:blocks' \
-  'conv[specify conversions to apply]:conversion:_values -s , conversion
-    "(ebcdic ibm)ascii" "(ascii ibm)ebcdic" "(ascii ebcdic)ibm"
-    "(unblock)block" "(block)unblock"
-    "(ucase)lcase" "(lcase)ucase" swab noerror sync'
+local -a vals conv flags
+local variant
+
+_pick_variant -r variant gnu=GNU $OSTYPE --version
+
+vals=(
+  '(ibs obs)bs[block size]:block size (bytes)'
+  'cbs[conversion buffer size]:buffer size (bytes)'
+  'conv[specify conversions to apply]: :_values -s , conversion $conv'
+  'count[number of input blocks to copy]:blocks'
+  '(bs)ibs[input block size]:block size (bytes)'
+  'if[specify input file]:input file:_tilde_files'
+  '(bs)obs[output block size]:block size (bytes)'
+  'of[specify output file]:output file:_tilde_files'
+  'seek[output blocks initially skipped]:blocks'
+  'skip[input blocks initially skipped]:blocks'
+)
+conv=(
+  '(ascii asciib oldascii ebcdic ebcdicb oldebcdic ibm ibmb oldibm)'{ascii,ebcdic,ibm}
+  '(unblock)block' '(block)unblock'
+  '(ucase)lcase' '(lcase)ucase'
+  swab sync noerror notrunc
+)
+
+case $variant in
+  ^gnu)
+    vals+=(
+      'files[specify number of input files to copy and concatenate]:number of files'
+    )
+  ;|
+  (gnu|darwin|dragonfly|(free|net)bsd*)
+    conv+=( sparse )
+  ;|
+  gnu|netbsd*)
+    vals+=(
+      '*iflag[specify read flags]:flag:_sequence compadd - $flags'
+      '*oflag[specify write flags]:flag:_sequence compadd - $flags'
+    )
+    flags=( append direct directory dsync sync nonblock noctty nofollow )
+  ;|
+  darwin*|dragonfly*|(free|net)bsd*)
+    vals+=(
+      'oseek[output blocks initially skipped]:blocks'
+    )
+    conv+=(
+      '(ascii oldascii ebcdic oldebcdic oldibm)'old{ascii,ebcdic,ibm}
+    )
+  ;|
+  (darwin|dragonfly|freebsd|netbsd|solaris)*)
+    vals+=(
+      'iseek[input blocks initially skipped]:blocks'
+    )
+  ;|
+  (open|free)bsd*)
+    vals+=(
+      'status[specify level of information to print to stderr]:level:(none noxfer)'
+    )
+    conv+=( osync )
+  ;|
+
+  freebsd*)
+    vals+=(
+      'fillchar[specify padding character]:character'
+      'speed[limit copying speed]:speed (bytes/second)'
+    )
+    conv+=(
+      '(pareven parnone parodd parset)'{pareven,parnone,parodd,parset}
+    )
+  ;;
+  gnu)
+    vals+=(
+      'status[specify level of information to print to stderr]:level:(none noxfer progress)'
+    )
+    flags+=( fullblock noatime nocache count_bytes skip_bytes seek_bytes )
+    conv+=( excl nocreat fdatasync fsync )
+  ;;
+  netbsd*)
+    vals+=(
+      'msgfmt[specify format for information summary]:format:(quiet posix human)'
+      'progress[enable progress display]:enable:(1)'
+    )
+    flags+=(
+      wronly rdwr creat trunc excl shlock exlock cloexec nosigpipe rsync alt_io async
+    )
+  ;;
+  solaris*)
+    vals+=(
+      'files[specify number of input files to copy and concatenate]:number of files'
+      'oseek[output blocks initially skipped (via seek, not NUL-padding)]:blocks'
+    )
+    conv+=(
+      '(ascii asciib ebcdic ebcdicb ibmb)'{ascii,ebcdic,ibm}b
+    )
+  ;;
+esac
+
+_values -w 'option' $vals