##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions de base: valeurs booléennes
##@cooked nocomments
##@include base.num
# Note: contient du code spécifique à bash 4. Le module base.compat réimplémente
# les fonctions concernées pour les rendre compatible avec bash >= 2.x
uprovide base.bool
urequire base.num

function is_yes() {
# retourner vrai si $1 est une valeur "oui"
    case "${1,,}" in
    o|oui|y|yes|v|vrai|t|true|on) return 0;;
    esac
    isnum "$1" && [ "$1" -ne 0 ] && return 0
    return 1
}
function is_no() {
# retourner vrai si $1 est une valeur "non"
    case "${1,,}" in
    n|non|no|f|faux|false|off) return 0;;
    esac
    isnum "$1" && [ "$1" -eq 0 ] && return 0
    return 1
}
function yesval() {
# normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon
# afficher une chaine vide
    is_yes "$1" && echo 1
}

function setyesval() {
# mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
    is_yes "$2" && _setv "$1" 1 || _setv "$1" ""
}
function normyesval() {
# remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui"
# Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1
    is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" ""
}
function normyesvals() {
# remplacer les valeur des variables $1..* par les valeurs normalisées
# respectives de leur valeur "oui"
    local __nyv_yesvar
    for __nyv_yesvar in "$@"; do
        is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" ""
    done
}

function setb() {
# Lancer la commande $2..@ en supprimant la sortie standard. Si la commande
# retourne vrai, assigner la valeur 1 à la variable $1. Sinon, lui assigner la
# valeur ""
# note: en principe, la syntaxe est 'setb var cmd args...'. cependant, la
# syntaxe 'setb var=cmd args...' est supportée aussi
    local __s_var="$1"; shift
    if [[ "$__s_var" == *=* ]]; then
        set -- "${__s_var#*=}" "$@"
        __s_var="${__s_var%%=*}"
    fi
    local __s_r
    if "$@" >/dev/null; then
        eval "$__s_var=1"
    else
        __s_r=$?
        eval "$__s_var="
        return $__s_r
    fi
}
function _setb() {
# Comme la fonction setb() mais ne supporte que la syntaxe '_setb var cmds...'
# Cette fonction est légèrement plus rapide que setb()
    local __s_var="$1"; shift
    if "$@" >/dev/null; then
        eval "$__s_var=1"
    else
        eval "$__s_var="
    fi
}

function evalb() {
# Lancer la commande $@ avec evalx() en supprimant la sortie standard. Si la
# commande retourne vrai, afficher 1. Sinon, afficher ""
    if evalx "$@" >/dev/null; then
        echo 1
    else
        return $?
    fi
}
function setxb() {
# équivalent à setx $1 evalb $2..@
    local __s_var="$1"; shift
    if [[ "$__s_var" == *=* ]]; then
        set -- "${__s_var#*=}" "$@"
        __s_var="${__s_var%%=*}"
    fi
    setx "$__s_var" evalb "$@"
}
