# Deprecated bash_completion functions and variables

_comp_deprecate_func 2.12 _userland _comp_userland
_comp_deprecate_func 2.12 _sysvdirs _comp_sysvdirs
_comp_deprecate_func 2.12 _have _comp_have_command
_comp_deprecate_func 2.12 _rl_enabled _comp_readline_variable_on
_comp_deprecate_func 2.12 _command_offset _comp_command_offset
_comp_deprecate_func 2.12 _command _comp_command
_comp_deprecate_func 2.12 _root_command _comp_root_command
_comp_deprecate_func 2.12 _xfunc _comp_xfunc
_comp_deprecate_func 2.12 _upvars _comp_upvars
_comp_deprecate_func 2.12 _get_comp_words_by_ref _comp_get_words
_comp_deprecate_func 2.12 _known_hosts_real _comp_compgen_known_hosts
_comp_deprecate_func 2.12 __ltrim_colon_completions _comp_ltrim_colon_completions
_comp_deprecate_func 2.12 _variables _comp_compgen_variables
_comp_deprecate_func 2.12 _signals _comp_compgen_signals
_comp_deprecate_func 2.12 _mac_addresses _comp_compgen_mac_addresses
_comp_deprecate_func 2.12 _available_interfaces _comp_compgen_available_interfaces
_comp_deprecate_func 2.12 _configured_interfaces _comp_compgen_configured_interfaces
_comp_deprecate_func 2.12 _ip_addresses _comp_compgen_ip_addresses
_comp_deprecate_func 2.12 _kernel_versions _comp_compgen_kernel_versions
_comp_deprecate_func 2.12 _uids _comp_compgen_uids
_comp_deprecate_func 2.12 _gids _comp_compgen_gids
_comp_deprecate_func 2.12 _xinetd_services _comp_compgen_xinetd_services
_comp_deprecate_func 2.12 _services _comp_compgen_services
_comp_deprecate_func 2.12 _bashcomp_try_faketty _comp_try_faketty
_comp_deprecate_func 2.12 _expand _comp_expand
_comp_deprecate_func 2.12 _pids _comp_compgen_pids
_comp_deprecate_func 2.12 _pgids _comp_compgen_pgids
_comp_deprecate_func 2.12 _pnames _comp_compgen_pnames
_comp_deprecate_func 2.12 _modules _comp_compgen_kernel_modules
_comp_deprecate_func 2.12 _installed_modules _comp_compgen_inserted_kernel_modules
_comp_deprecate_func 2.12 _usergroup _comp_compgen_usergroups
_comp_deprecate_func 2.12 _complete_as_root _comp_as_root
_comp_deprecate_func 2.12 __load_completion _comp_load

# completers
_comp_deprecate_func 2.12 _service _comp_complete_service
_comp_deprecate_func 2.12 _user_at_host _comp_complete_user_at_host
_comp_deprecate_func 2.12 _known_hosts _comp_complete_known_hosts
_comp_deprecate_func 2.12 _longopt _comp_complete_longopt
_comp_deprecate_func 2.12 _filedir_xspec _comp_complete_filedir_xspec
_comp_deprecate_func 2.12 _minimal _comp_complete_minimal

_comp_deprecate_var 2.12 COMP_FILEDIR_FALLBACK BASH_COMPLETION_FILEDIR_FALLBACK
_comp_deprecate_var 2.12 COMP_KNOWN_HOSTS_WITH_AVAHI BASH_COMPLETION_KNOWN_HOSTS_WITH_AVAHI
_comp_deprecate_var 2.12 COMP_KNOWN_HOSTS_WITH_HOSTFILE BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE

# @deprecated 2.12 Use `_comp_xspecs`
declare -Ag _xspecs

# Backwards compatibility for compat completions that use have().
# @deprecated 1.90 should no longer be used; generally not needed with
#   dynamically loaded completions, and _comp_have_command is suitable for
#   runtime use.
# shellcheck disable=SC2317 # available at load time only
have()
{
    unset -v have
    _comp_have_command "$1" && have=yes
}

# This function shell-quotes the argument
# @deprecated 2.12 Use `_comp_quote` instead.  Note that `_comp_quote` stores
#   the results in the variable `REPLY` instead of writing them to stdout.
quote()
{
    local quoted=${1//\'/\'\\\'\'}
    printf "'%s'" "$quoted"
}

# @deprecated 2.12 Use `_comp_quote_compgen`
quote_readline()
{
    local REPLY
    _comp_quote_compgen "$1"
    printf %s "$REPLY"
}

# This function is the same as `_comp_quote_compgen`, but receives the second
# argument specifying the variable name to store the result.
# @param $1  Argument to quote
# @param $2  Name of variable to return result to
# @deprecated 2.12 Use `_comp_quote_compgen "$1"` instead.  Note that
# `_comp_quote_compgen` stores the result in a fixed variable `REPLY`.
_quote_readline_by_ref()
{
    [[ $2 == REPLY ]] || local REPLY
    _comp_quote_compgen "$1"
    [[ $2 == REPLY ]] || printf -v "$2" %s "$REPLY"
}

# This function shell-dequotes the argument
# @deprecated 2.12 Use `_comp_dequote' instead.  Note that `_comp_dequote`
#   stores the results in the array `REPLY` instead of writing them to stdout.
dequote()
{
    local REPLY
    _comp_dequote "$1"
    local rc=$?
    printf %s "$REPLY"
    return $rc
}

# Assign variable one scope above the caller
# Usage: local "$1" && _upvar $1 "value(s)"
# @param $1  Variable name to assign value to
# @param $*  Value(s) to assign.  If multiple values, an array is
#            assigned, otherwise a single value is assigned.
# NOTE: For assigning multiple variables, use '_comp_upvars'.  Do NOT
#       use multiple '_upvar' calls, since one '_upvar' call might
#       reassign a variable to be used by another '_upvar' call.
# @see https://fvue.nl/wiki/Bash:_Passing_variables_by_reference
# @deprecated 2.10 Use `_comp_upvars' instead
_upvar()
{
    echo "bash_completion: $FUNCNAME: deprecated function," \
        "use _comp_upvars instead" >&2
    if unset -v "$1"; then # Unset & validate varname
        # shellcheck disable=SC2140  # TODO
        if (($# == 2)); then
            eval "$1"=\"\$2\" # Return single value
        else
            eval "$1"=\(\"\$"{@:2}"\"\) # Return array
        fi
    fi
}

# Get the word to complete.
# This is nicer than ${COMP_WORDS[COMP_CWORD]}, since it handles cases
# where the user is completing in the middle of a word.
# (For example, if the line is "ls foobar",
# and the cursor is here -------->   ^
# @param $1 string  Characters out of $COMP_WORDBREAKS which should NOT be
#     considered word breaks. This is useful for things like scp where
#     we want to return host:path and not only path, so we would pass the
#     colon (:) as $1 in this case.
# @param $2 integer  Index number of word to return, negatively offset to the
#     current word (default is 0, previous is 1), respecting the exclusions
#     given at $1.  For example, `_get_cword "=:" 1' returns the word left of
#     the current word, respecting the exclusions "=:".
# @deprecated 1.2 Use `_comp_get_words cur' instead
# @see _comp_get_words()
_get_cword()
{
    local LC_CTYPE=C
    local cword words
    _comp__reassemble_words "${1-}" words cword

    # return previous word offset by $2
    if [[ ${2-} && ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}"
    elif ((${#words[cword]} == 0 && COMP_POINT == ${#COMP_LINE})); then
        : # nothing
    else
        local i
        local cur=$COMP_LINE
        local index=$COMP_POINT
        for ((i = 0; i <= cword; ++i)); do
            # Current word fits in $cur, and $cur doesn't match cword?
            while [[ ${#cur} -ge ${#words[i]} &&
                ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                # Strip first character
                cur=${cur:1}
                # Decrease cursor position, staying >= 0
                ((index > 0)) && ((index--))
            done

            # Does found word match cword?
            if ((i < cword)); then
                # No, cword lies further;
                local old_size=${#cur}
                cur=${cur#"${words[i]}"}
                local new_size=${#cur}
                ((index -= old_size - new_size))
            fi
        done

        if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
            # We messed up! At least return the whole word so things
            # keep working
            printf "%s" "${words[cword]}"
        else
            printf "%s" "${cur:0:index}"
        fi
    fi
}

# Get word previous to the current word.
# This is a good alternative to `prev=${COMP_WORDS[COMP_CWORD-1]}' because bash4
# will properly return the previous word with respect to any given exclusions to
# COMP_WORDBREAKS.
# @deprecated 1.2 Use `_comp_get_words cur prev' instead
# @see _comp_get_words()
#
_get_pword()
{
    if ((COMP_CWORD >= 1)); then
        _get_cword "${@-}" 1
    fi
}

# Get real command.
# @deprecated 2.12 Use `_comp_realcommand` instead.
# Note that `_comp_realcommand` stores the result in the variable `REPLY`
# instead of writing it to stdout.
_realcommand()
{
    local REPLY
    _comp_realcommand "$1"
    local rc=$?
    printf "%s\n" "$REPLY"
    return $rc
}

# Initialize completion and deal with various general things: do file
# and variable completion where appropriate, and adjust prev, words,
# and cword as if no redirections exist so that completions do not
# need to deal with them.  Before calling this function, make sure
# cur, prev, words, and cword are local, ditto split if you use -s.
#
# Options:
#     -n EXCLUDE  Passed to _comp_get_words -n with redirection chars
#     -e XSPEC    Passed to _filedir as first arg for stderr redirections
#     -o XSPEC    Passed to _filedir as first arg for other output redirections
#     -i XSPEC    Passed to _filedir as first arg for stdin redirections
#     -s          Split long options with _comp__split_longopt, implies -n =
# @var[out] cur       Reconstructed current word
# @var[out] prev      Reconstructed previous word
# @var[out] words     Reconstructed words
# @var[out] cword     Current word index in `words`
# @var[out,opt] split When "-s" is specified, `"true"/"false"` is set depending
#                     on whether the split happened.
# @return  True (0) if completion needs further processing,
#          False (> 0) no further processing is necessary.
#
# @deprecated 2.12 Use the new interface `_comp_initialize`.  The new interface
# supports the same set of options.  The new interface receives additional
# arguments $1 (command name), $2 (part of current word before the cursor), and
# $3 (previous word) that are specified to the completion function by Bash.
# When `-s` is specified, instead of variable `split`, the new interface sets
# variable `was_split` to the value "set"/"" when the split happened/not
# happened.
_init_completion()
{
    local was_split
    _comp_initialize "$@"
    local rc=$?

    # When -s is specified, convert "split={set,}" to "split={true,false}"
    local flag OPTIND=1 OPTARG="" OPTERR=0
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in
            [neoi]) ;;
            s)
                if [[ $was_split ]]; then
                    split=true
                else
                    split=false
                fi
                break
                ;;
        esac
    done

    return "$rc"
}

# @deprecated 2.12 Use the variable `_comp_backup_glob` instead.  This is the
# backward-compatibility name.
# shellcheck disable=SC2154  # defined in the main "bash_completion"
_backup_glob=$_comp_backup_glob

# @deprecated 2.12 use `_comp_cmd_cd` instead.
_cd()
{
    declare -F _comp_cmd_cd &>/dev/null || __load_completion cd
    _comp_cmd_cd "$@"
}

# @deprecated 2.12 Use `_comp_command_offset` instead.  Note that the new
# interface `_comp_command_offset` is changed to receive an index in
# `words` instead of that in `COMP_WORDS` as `_command_offset` did.
_command_offset()
{
    # We unset the shell variable `words` locally to tell
    # `_comp_command_offset` that the index is intended to be that in
    # `COMP_WORDS` instead of `words`.
    local words
    unset -v words
    _comp_command_offset "$@"
}

# @deprecated 2.12 Use `_comp_compgen -a filedir`
_filedir()
{
    _comp_compgen -a filedir "$@"
}

# Perform tilde (~) completion
# @return  True (0) if completion needs further processing,
#          False (1) if tilde is followed by a valid username, completions are
#          put in COMPREPLY and no further processing is necessary.
# @deprecated 2.12 Use `_comp_compgen -c CUR tilde [-d]`.  Note that the exit
# status of `_comp_compgen_tilde` is flipped.  It returns 0 when the tilde
# completions are attempted, or otherwise 1.
_tilde()
{
    ! _comp_compgen -c "$1" tilde
}

# Helper function for _parse_help and _parse_usage.
# @return True (0) if an option was found, False (> 0) otherwise
# @deprecated 2.12 Use _comp_compgen_help__parse
__parse_options()
{
    local -a _options=()
    _comp_compgen_help__parse "$1"
    printf '%s\n' "${_options[@]}"
}

# Parse GNU style help output of the given command.
# @param $1  command; if "-", read from stdin and ignore rest of args
# @param $2  command options (default: --help)
# @deprecated 2.12 Use `_comp_compgen_help`.  `COMPREPLY=($(compgen -W
#   '$(_parse_help "$1" ...)' -- "$cur"))` can be replaced with
#   `_comp_compgen_help [-- ...]`.  Also, `var=($(_parse_help "$1" ...))` can
#   be replaced with `_comp_compgen -Rv var help [-- ...]`.
_parse_help()
{
    local -a args
    if [[ $1 == - ]]; then
        args=(-)
    else
        local REPLY opt IFS=$' \t\n'
        _comp_dequote "$1"
        _comp_split opt "${2:---help}"
        args=(-c "$REPLY" ${opt[@]+"${opt[@]}"})
    fi
    local -a REPLY=()
    _comp_compgen -Rv REPLY help "${args[@]}" || return 1
    ((${#REPLY[@]})) && printf '%s\n' "${REPLY[@]}"
    return 0
}

# Parse BSD style usage output (options in brackets) of the given command.
# @param $1  command; if "-", read from stdin and ignore rest of args
# @param $2  command options (default: --usage)
# @deprecated 2.12 Use `_comp_compgen_usage`.  `COMPREPLY=($(compgen -W
#   '$(_parse_usage "$1" ...)' -- "$cur"))` can be replaced with
#   `_comp_compgen_usage [-- ...]`. `var=($(_parse_usage "$1" ...))` can be
#   replaced with `_comp_compgen -Rv var usage [-- ...]`.
_parse_usage()
{
    local -a args
    if [[ $1 == - ]]; then
        args=(-)
    else
        local REPLY opt IFS=$' \t\n'
        _comp_dequote "$1"
        _comp_split opt "${2:---usage}"
        args=(-c "$REPLY" ${opt[@]+"${opt[@]}"})
    fi
    local -a REPLY=()
    _comp_compgen -Rv REPLY usage "${args[@]}" || return 1
    ((${#REPLY[@]})) && printf '%s\n' "${REPLY[@]}"
    return 0
}

# @deprecated 2.12 Use `_comp_get_ncpus`.
_ncpus()
{
    local REPLY
    _comp_get_ncpus
    printf %s "$REPLY"
}

# Expand variable starting with tilde (~).
# We want to expand ~foo/... to /home/foo/... to avoid problems when
# word-to-complete starting with a tilde is fed to commands and ending up
# quoted instead of expanded.
# Only the first portion of the variable from the tilde up to the first slash
# (~../) is expanded.  The remainder of the variable, containing for example
# a dollar sign variable ($) or asterisk (*) is not expanded.
#
# @deprecated 2.12 Use `_comp_expand_tilde`.  The new function receives the
# value instead of a variable name as $1 and always returns the result to the
# variable `REPLY`.
__expand_tilde_by_ref()
{
    [[ ${1+set} ]] || return 0
    [[ $1 == REPLY ]] || local REPLY
    _comp_expand_tilde "${!1-}"
    # shellcheck disable=SC2059
    [[ $1 == REPLY ]] || printf -v "$1" "$REPLY"
}

# @deprecated 2.12 Use `_comp_compgen -a cd_devices`
_cd_devices()
{
    _comp_compgen -a cd_devices
}

# @deprecated 2.12 Use `_comp_compgen -a dvd_devices`
_dvd_devices()
{
    _comp_compgen -a dvd_devices
}

# @deprecated 2.12 Use `_comp_compgen -a pci_ids`
_pci_ids()
{
    _comp_compgen -a pci_ids
}

# @deprecated 2.12 Use `_comp_compgen -a usb_ids`
_usb_ids()
{
    _comp_compgen -a usb_ids
}

# @deprecated 2.12 Use `_comp_compgen -a terms`
_terms()
{
    _comp_compgen -a terms
}

# @deprecated 2.12 Use `_comp_compgen -c "${prefix:-$cur}" allowed_users`
_allowed_users()
{
    _comp_compgen -c "${1:-$cur}" allowed_users
}

# @deprecated 2.12 Use `_comp_compgen -c "${prefix:-$cur}" allowed_groups`
_allowed_groups()
{
    _comp_compgen -c "${1:-$cur}" allowed_groups
}

# @deprecated 2.12 Use `_comp_compgen -a shells`
_shells()
{
    _comp_compgen -a shells
}

# @deprecated 2.12 Use `_comp_compgen -a fstypes`
_fstypes()
{
    _comp_compgen -a fstypes
}

# This function returns the first argument, excluding options
# @deprecated 2.12 Use `_comp_get_first_arg`.  Note that the new function
# `_comp_get_first_arg` operates on `words` and `cword` instead of `COMP_WORDS`
# and `COMP_CWORD`.  The new function considers a command-line argument after
# `--` as an argument.  The new function returns the result in variable `REPLY`
# instead of `arg`.
_get_first_arg()
{
    local i

    arg=
    for ((i = 1; i < COMP_CWORD; i++)); do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]}
            break
        fi
    done
}

# This function counts the number of args, excluding options
# @param $1 chars  Characters out of $COMP_WORDBREAKS which should
#     NOT be considered word breaks. See _comp__reassemble_words.
# @param $2 glob   Options whose following argument should not be counted
# @param $3 glob   Options that should be counted as args
# @var[out] args   Return the number of arguments
# @deprecated 2.12 Use `_comp_count_args`.  Note that the new function
# `_comp_count_args` returns the result in variable `REPLY` instead of `args`.
# In the new function, `-` is also counted as an argument.  The new function
# counts all the arguments after `--`.
# shellcheck disable=SC2178 # assignments are not intended for global "args"
_count_args()
{
    local i cword words
    _comp__reassemble_words "${1-}" words cword

    args=1
    for ((i = 1; i < cword; i++)); do
        # shellcheck disable=SC2053
        if [[ ${words[i]} != -* && ${words[i - 1]} != ${2-} ||
            ${words[i]} == ${3-} ]]; then
            ((args++))
        fi
    done
}

# @deprecated 2.12 Use `_comp_load -D -- CommandName` to load the completion,
# or use `_comp_complete_load` as a completion function specified to `complete
# -F`.
_completion_loader()
{
    # We call `_comp_complete_load` instead of `_comp_load -D` in case that
    # `_completion_loader` is used without an argument or `_completion_loader`
    # is specified to `complete -F` by a user.
    _comp_complete_load "$@"
}
