# (C) 2010 magicant

# Completion script for the "sort" command.
# Supports POSIX 2008, GNU coreutils 8.6, OpenBSD 4.8, NetBSD 5.0,
# SunOS 5.10, HP-UX 11i v3.

function completion/sort {

        case $("${WORDS[1]}" --version 2>/dev/null) in
                (*'coreutils'*) typeset type=GNU ;;
                (*)             typeset type="$(uname 2>/dev/null)" ;;
        esac
        case $type in
                (GNU) typeset long=true ;;
                (*)   typeset long= ;;
        esac

        typeset OPTIONS ARGOPT PREFIX
        OPTIONS=( #>#
        "b ${long:+--ignore-leading-blanks}; ignore leading blanks in sort keys"
        "C; like -c, but don't report disorders"
        "c; check if the input is well-sorted"
        "d ${long:+--dictionary-order}; consider blank or alphanumeric characters only"
        "f ${long:+--ignore-case}; case-insensitive comparison"
        "i ${long:+--ignore-nonprinting}; consider printable characters only"
        "k: ${long:+--key:}; specify the sort field"
        "m ${long:+--merge}; assume all input files are already sorted"
        "n ${long:+--numeric-sort}; compare numeric values"
        "o: ${long:+--output:}; specify the output file"
        "r ${long:+--reverse}; sort in reverse order"
        "t: ${long:+--field-separator:}; specify the field separator character"
        "u ${long:+--unique}; make equal lines unique"
        ) #<#

        case $type in (GNU|*BSD|SunOS|HP-UX)
                OPTIONS=("$OPTIONS" #>#
                "T: ${long:+--temporary-directory:}; specify the directory to put temporary files in"
                ) #<#
                case $type in (GNU|SunOS|HP-UX)
                        OPTIONS=("$OPTIONS" #>#
                        "M ${long:+--month-sort}; compare month names"
                        ) #<#
                        case $type in (GNU|SunOS)
                                OPTIONS=("$OPTIONS" #>#
                                "S: ${long:+--buffer-size:}; specify the initial buffer size in 1024 byte units"
                                ) #<#
                        esac
                esac
                case $type in (GNU|*BSD)
                        OPTIONS=("$OPTIONS" #>#
                        "s ${long:+--stable}; stable sort"
                        ) #<#
                        case $type in (GNU|OpenBSD)
                                OPTIONS=("$OPTIONS" #>#
                                "z ${long:+--zero-terminated}; use null bytes as the line separator"
                                ) #<#
                        esac
                        case $type in (*BSD)
                                OPTIONS=("$OPTIONS" #>#
                                "R:; specify the line separator"
                                ) #<#
                        esac
                esac
        esac
        case $type in
        (GNU)
                OPTIONS=("$OPTIONS" #>#
                "--batch-size:; specify the number of inputs to sort at once"
                "--check::; check if the input is well-sorted"
                "--compress-program:; specify the program to compress temporary files"
                "--debug; print debugging messages"
                "--files0-from:; specify a file containing null-separated filenames to read"
                "g --general-numeric-sort; compare floating-point numbers"
                "h --human-numeric-sort; compare numeric values followed by SI suffixes"
                "--parallel:; specify the number of sort processes to run at a time"
                "R --random-sort; sort in random order"
                "--random-source:; specify the random seed file"
                "--sort:; specify comparison type"
                "V --version-sort; compare version numbers"
                "--help"
                "--version"
                ) #<#
                ;;
        (OpenBSD)
                OPTIONS=("$OPTIONS" #>#
                "H; use merge sort rather than radix sort"
                ) #<#
                ;;
        (NetBSD)
                OPTIONS=("$OPTIONS" #>#
                "S; non-stable sort"
                ) #<#
                ;;
        (HP-UX)
                OPTIONS=("$OPTIONS" #>#
                "A; simple byte-by-byte comparison"
                "z:; specify the buffer size per line"
                ) #<#
                ;;
        esac

        command -f completion//parseoptions ${long:+-es}
        case $ARGOPT in
        (-)
                command -f completion//completeoptions
                ;;
        ([RStz]|--batch-size|--buffer-size|--field-separator|--parallel)
                ;;
        (--check) #>>#
                complete -P "$PREFIX" -D "don't report disorders" quiet silent
                complete -P "$PREFIX" -D "report disorders" diagnose-first
                ;; #<<#
        (--compress-program)
                WORDS=()
                command -f completion//reexecute -e
                ;;
        (k|--key)
                typeset word="${TARGETWORD#"$PREFIX"}"
                case $word in (*[[:alnum:]])
                        #>>#
                        complete -T -P "$TARGETWORD" -D "ignore leading blanks in sort keys" b
                        complete -T -P "$TARGETWORD" -D "consider blank or alphanumeric characters only" d
                        complete -T -P "$TARGETWORD" -D "case-insensitive comparison" f
                        complete -T -P "$TARGETWORD" -D "consider printable characters only" i
                        complete -T -P "$TARGETWORD" -D "compare numeric values" n
                        complete -T -P "$TARGETWORD" -D "sort in reverse order" r
                        #<<#
                        case $type in (GNU|SunOS|HP-UX) #>>#
                                complete -T -P "$TARGETWORD" -D "compare month names" M
                        esac #<<#
                        case $type in (GNU|SunOS|HP-UX) #>>#
                                complete -T -P "$TARGETWORD" -D "compare floating-point numbers" g
                                complete -T -P "$TARGETWORD" -D "compare numeric values followed by SI suffixes" h
                                complete -T -P "$TARGETWORD" -D "sort in random order" R
                                complete -T -P "$TARGETWORD" -D "compare version numbers" V
                        esac #<<#
                esac
                ;;
        (--sort) #>>#
                complete -P "$PREFIX" -D "compare floating-point numbers" general-numeric
                complete -P "$PREFIX" -D "compare numeric values followed by SI suffixes" human-numeric
                complete -P "$PREFIX" -D "compare month names" month
                complete -P "$PREFIX" -D "compare numeric values" numeric
                complete -P "$PREFIX" -D "compare version numbers" version
                complete -P "$PREFIX" -D "sort in random order" random
                complete -P "$PREFIX" -D "" 
                ;; #<<#
        (T|--temporary-directory)
                complete -P "$PREFIX" -S / -T -d
                ;;
        (*)
                complete -P "$PREFIX" -f
                ;;
        esac

}


# vim: set ft=sh ts=8 sts=8 sw=8 et:
