1#compdef cdrdao 2 3# TODO: Options must come before parameters. 4 5# Command completion and main loop {{{1 6 7_cdrdao () { 8 local ret=1 9 local -a commands 10 if (( CURRENT == 2 )); then 11 commands=( ${${${(M)${(f)"$(_call_program subcommands cdrdao 2>&1)"}:# *}// #- /:}#??} ) 12 _describe -t subcommands 'cdrdao command' commands && ret=0 13 else 14 local cmd="${words[2]}" 15 local curcontext="${curcontext%:*:*}:cdrdao-$cmd:" 16 shift words 17 (( CURRENT-- )) 18 if ! _call_function ret _cdrdao-$cmd; then 19 _default && ret=0 20 fi 21 fi 22 23 return ret 24} 25 26# Common arguments {{{1 27 28declare -ga _cdrdao_tmpfile_args 29_cdrdao_tmpfile_args=( 30 '--tmpdir[directory to store temporary data in]:directory:_directories' 31 '--keep[do not remove temporary data when done]' 32) 33 34# TODO: Gah! Fix a cddb server spec matcher 35declare -ga _cdrdao_cddb_args 36_cdrdao_cddb_args=( 37 '--cddb-servers[specify list of CDDB servers to use]:CDDB servers:' 38 '--cddb-timeout[specify timeout in seconds for connections to CDDB servers]: :_guard "[[\:digit\:]]" timeout' 39 '--cddb-directory[directory where fetched CDDB records will be stored]:directory:_directories' 40) 41 42declare -g _cdrdao_paranoiamode_arg 43_cdrdao_paranoiamode_arg='--paranoia-mode[set correction mode for digital audio extraction]:mode:(("0\:no checking" "1\:perform overlapped reading to avoid jitter" "2\:like 1 but with checks of read audio data" "3\:like 2 but with scratch detection/repair (default)"))' 44 45declare -g _cdrdao_fasttoc_arg 46_cdrdao_fasttoc_arg='--fast-toc[skip pre-gap-length and index-mark extraction]' 47 48declare -g _cdrdao_swap_arg 49_cdrdao_swap_arg='--swap[swap the byte order of samples]' 50 51declare -g _cdrdao_reload_arg 52_cdrdao_reload_arg='--reload[reload the disk if necessary]' 53 54declare -g _cdrdao_eject_arg 55_cdrdao_eject_arg='--eject[eject CD after completed operation]' 56 57declare -g _cdrdao_speed_arg 58_cdrdao_speed_arg='-speed[set writing speed]: :_guard "[[\:digit\:]]##" speed' 59 60declare -ga _cdrdao_common_args 61_cdrdao_common_args=( 62 '(*)'{-h,--help}'[display command/option summary]' 63 '-v[set verbosity level]: :_guard "[[\:digit\:]]##" verbosity') 64 65declare -ga _cdrdao_common_toc_args 66_cdrdao_common_toc_args=( 67 $_cdrdao_common_args 68 ':TOC file:_files -g "*.toc(-.)"') 69 70declare -ga _cdrdao_common_device_args 71_cdrdao_common_device_args=( 72 $_cdrdao_common_args 73 '--device[set SCSI address of the CD recorder]:device:__cdrdao-device' 74 '--driver[use given driver for the CD recorder]:driver:__cdrdao-drivers' 75) 76 77declare -ga _cdrdao_common_toc_device_args 78_cdrdao_common_toc_device_args=( 79 $_cdrdao_common_toc_args 80 $_cdrdao_common_device_args 81 '--force[force execution of operation]' 82) 83 84declare -ga _cdrdao_common_read_args 85_cdrdao_common_read_args=( 86 '--rspeed[set reading speed]: :_guard "[[\:digit\:]]##" speed' 87 '--session[specify what session to process on multi-session CDs]: :_guard "[[\:digit\:]]##" "session number"' 88 '--read-subchan[set sub-channel reading-mode]:mode:(("rw\:de-interleaved and error corrected" "rw_raw\:not de-interleaved, not error-corrected, and L-EC data included"))' 89 '--tao-source[indicate that source CD was written in TAO mode]' 90 '--with-cddb[retrieve CD-TEXT data from a CDDB server]') 91 92# Sub-command completion {{{1 93 94_cdrdao-show-toc () { 95 __cdrdao-show-toc-or-toc-info-or-toc-size 96} 97 98_cdrdao-toc-info () { 99 __cdrdao-show-toc-or-toc-info-or-toc-size 100} 101 102_cdrdao-toc-size () { 103 __cdrdao-show-toc-or-toc-info-or-toc-size 104} 105 106__cdrdao-show-toc-or-toc-info-or-toc-size () { 107 _arguments \ 108 $_cdrdao_common_toc_args \ 109 $_cdrdao_tmpfile_args 110} 111 112_cdrdao-read-toc () { 113 __cdrdao-read-toc-or-read-cd $_cdrdao_cddb_args 114} 115 116_cdrdao-read-cd () { 117 __cdrdao-read-toc-or-read-cd \ 118 $_cdrdao_paranoiamode_arg \ 119 $_cdrdao_cddb_args 120} 121 122__cdrdao-read-toc-or-read-cd () { 123 local -a dependent_args 124 125 __cdrdao-read-toc-or-read-cd-or-copy-dependent-args 126 127 _arguments \ 128 $_cdrdao_common_toc_device_args \ 129 $_cdrdao_common_read_args \ 130 $dependent_args \ 131 $_cdrdao_fasttoc_arg \ 132 '--datafile[set name of data file placed in TOC file]:file:_files' \ 133 '--read-raw[read data in raw format from CD]' \ 134 '--no-mode2-mixed[if MODE2_FORM1 or MODE2_FORM2, do not extract as MODE2_FORM_MIX]' \ 135 "$@" && ret=0 136} 137 138_cdrdao-read-cddb () { 139 _arguments \ 140 $_cdrdao_common_toc_args \ 141 $_cdrdao_cddb_args 142} 143 144_cdrdao-show-data () { 145 _arguments \ 146 $_cdrdao_common_toc_args \ 147 $_cdrdao_swap_arg 148} 149 150_cdrdao-read-test () { 151 _arguments \ 152 $_cdrdao_common_toc_args 153} 154 155_cdrdao-disk-info () { 156 __cdrdao-disk-info-or-drive-info 157} 158 159__cdrdao-disk-info-or-drive-info () { 160 _arguments \ 161 $_cdrdao_common_device_args 162} 163 164_cdrdao-discid() { 165 _arguments $_cdrdao_common_device_args $_cdrdao_cddb_args \ 166 '--query-string[print out CDDB query only]' 167} 168 169_cdrdao-msinfo () { 170 _arguments \ 171 $_cdrdao_common_device_args \ 172 $_cdrdao_reload_arg 173} 174 175_cdrdao-drive-info () { 176 __cdrdao-disk-info-or-drive-info 177} 178 179_cdrdao-unlock () { 180 _arguments \ 181 $_cdrdao_common_device_args \ 182 $_cdrdao_reload_arg \ 183 $_cdrdao_eject_arg 184} 185 186_cdrdao-blank () { 187 _arguments \ 188 $_cdrdao_common_device_args \ 189 $_cdrdao_speed_arg \ 190 '--blank-mode[set the blanking mode]:blanking mode:(("full\:completely erase data" "minimal\:only dereference data"))' \ 191 $_cdrdao_eject_arg 192} 193 194_cdrdao-scanbus () { 195 _arguments \ 196 $_cdrdao_common_args 197} 198 199_cdrdao-simulate () { 200 __cdrdao-simulate-or-write 201} 202 203__cdrdao-simulate-or-write () { 204 local _cdrdao_capacity_arg= 205 206 if (( $words[(I)--full-burn] )); then 207 _cdrdao_capacity_arg='--capacity[set disk capacity for --full-burn]: :_guard "[[\:digit\:]]" minutes' 208 fi 209 210 _arguments \ 211 $_cdrdao_common_toc_device_args \ 212 $_cdrdao_speed_arg \ 213 '--multi[do not close the session after successful write]' \ 214 '--overburn[allow overburning of medium]' \ 215 '--full-burn[force burning to the outer disk edge]' \ 216 $_cdrdao_capacity_arg \ 217 $_cdrdao_eject_arg \ 218 $_cdrdao_swap_arg \ 219 '--buffers[set fifo buffer size]: :_guard "[[\:digit\:]]" size' \ 220 $_cdrdao_reload_arg \ 221 $_cdrdao_tmpfile_args \ 222 '-n[do not pause before writing]' \ 223 $* 224} 225 226_cdrdao-write () { 227 __cdrdao-simulate-or-write \ 228 '--simulate[only perform a write simulation]' \ 229 '--buffer-under-run-protection[whether to use buffer under-run protection]:buffer under-run protection setting:(("0\:disable buffer under-run protection" "1\:enable buffer under-run protection"))' \ 230 '--write-speed-control[whether to use writing-speed control]:writing-speed control setting:(("0\:disable writing-speed control" "1\:enable writing-speed control"))' \ 231 $* 232} 233 234__cdrdao-read-toc-or-read-cd-or-copy-dependent-args () { 235 if (( words[(I)--tao-source] )); then 236 dependent_args+='--tao-source-adjust[specify number of link blocks for tracks written in TAO mode]: :_guard "[[\:digit\:]]##" "link blocks"' 237 fi 238 239 if (( words[(I)--with-cddb] )); then 240 dependent_args+=$_cdrdao_cddb_args 241 fi 242} 243 244_cdrdao-copy () { 245 local -a dependent_args 246 247 __cdrdao-read-toc-or-read-cd-or-copy-dependent-args 248 249 _cdrdao-write \ 250 $dependent_args \ 251 $_cdrdao_common_read_args \ 252 '--source-device[set SCSI address of the CD reader]:device:__cdrdao-device' \ 253 '--source-driver[use given driver for the CD reader]:driver:__cdrdao-drivers' \ 254 '--on-the-fly[perform on-the-fly copy of CD (no image created)]' \ 255 $_cdrdao_fasttoc_arg \ 256 '--keepimage[do not remove generated image when done]' \ 257 $_cdrdao_paranoiamode_arg 258} 259 260# Type completion {{{1 261 262__cdrdao-device () { 263 # Use cdrdao scanbus and also check what OS we're running under and provide 264 # additional stuff, like devices (/dev/sg0) 265 local -a expl devices 266 devices=(${${(f)"$(_call_program devices cdrdao scanbus -v 0 2>&1)"}%% :*}) 267 268 _wanted devices expl 'device' compadd -a devices 269} 270 271__cdrdao-drivers () { 272 local expl suf 273 local -Ua drivers 274 drivers=(${(f)"$(_call_program drivers cut -d'\|' -f4 /usr/share/cdrdao/drivers -s)"}) 275 if compset -P \*:; then 276 _message -e options option 277 else 278 compset -S :\* || suf=-qS: 279 _wanted drivers expl 'driver' compadd $suf -a drivers 280 fi 281} 282 283# }}}1 284 285_cdrdao 286