#compdef fmt gfmt

local variant
local -a args
local copt="[preserve indentation of first two lines]"
local wopt="[specify maximum line width]:width [75]"
local sopt="[don't join short lines\: split only]"

args=( -A "-*" "(1 2)-w+$wopt" '*:file:_files' )
_pick_variant -r variant gnu=GNU $OSTYPE --version
case $variant in
  gnu)
    args=(
      '(-c --crown-margin)'{-c,--crown-margin}$copt
      '(-w --width)'{-w+,--width=}$wopt
      '(-p --prefix)'{-p+,--prefix=}'[only reformat lines with specified prefix]:prefix'
      '(-s --split-only)'{-s,--split-only}$sopt
      '(-t --tagged-paragraph)'{-t,--tagged-paragraph}'[indentation of first line different from second]'
      '(-u --uniform-spacing)'{-u,--uniform-spacing}'[use one space between words, two after sentences]'
      '(-g --goal)'{-g,--goal=}'[specify goal width]:goal width [93% of width]'
      '(- *)--help[display help information]'
      '(- *)--version[display version information]'
      '*:file:_files'
    )
  ;;
  solaris*)
    args=(
      "-c$copt"
      "-s$sopt"
    )
  ;;
  netbsd*)
    args+=(
      '-C[center the text]'
      '(1 2)-g+[specify goal width]:goal width'
      '(1 2)-m+[specify maximum width]:maximum width'
      '-r[format all lines]'
    )
  ;|
  darwin*|dragonfly*|freebsd*|openbsd*)
    args+=(
      '-c[center the text line by line]'
      '-m[sensible formatting of mail header lines]'
      '-n[format lines beginning with a . (dot) character]'
      "-p[change in indentation doesn't start new paragraph]"
      '-s[collapse whitespace inside lines]'
      '-d+[specify sentence-ending characters]:sentence ends [.?!]'
      '-l+[replace initial spaces with tabs]:tab width [8]'
      '-t+[specify tab width of input files]:tab width [8]'
    )
  ;& # fall-through
  netbsd*)
    args+=( ':: :_guard "[0-9]#" goal width' )
    (( ${(M)#words[1,CURRENT-1]:#[0-9]##} )) && args+=(
      ':: :_guard "[0-9]#" maximum width'
    )
  ;;
esac

_arguments -s -S $args
