# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: base.path base_ "Fonctions de base: gestion des chemins et des fichiers"
require: base.core

function: base_in_path "tester l'existence d'un programme dans le PATH"
function base_in_path() {
    [ -n "$1" -a -x "$(which "$1" 2>/dev/null)" ]
}

function: base_delpath "supprimer le chemin \$1 de \$2(=PATH)"
function base_delpath() {
    local _qdir="${1//\//\\/}"
    eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'='
}

function: base_addpath "Ajouter le chemin \$1 à la fin, dans \$2(=PATH), s'il n'y existe pas déjà"
function base_addpath() {
    local _qdir="${1//\//\\/}"
    eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"'
}

function: base_inspathm "Ajouter le chemin \$1 au début, dans \$2(=PATH), s'il n'y existe pas déjà"
function base_inspathm() {
    local _qdir="${1//\//\\/}"
    eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"'
}

function: base_inspath "S'assurer que le chemin \$1 est au début de \$2(=PATH)"
function base_inspath() {
    base_delpath "$@"
    base_inspathm "$@"
}

function: base_push_cwd "enregistrer le répertoire courant dans la variable \$2(=cwd) et se placer dans le répertoire \$1"
function base_push_cwd() {
    eval "${2:-cwd}"'="$(pwd)"'
    cd "$1"
}
function: base_pop_cwd "se placer dans le répertoire \${!\$2}(=\$cwd) puis retourner le code d'erreur \$1(=0)"
function base_pop_cwd() {
    eval 'cd "$'"${2:-cwd}"'"'
    return "${1:-0}"
}

################################################################################
## fichiers temporaires

function: base_mktempf "générer un fichier temporaire et retourner son nom"
function base_mktempf() {
    mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}"
}

function: base_mktempd "générer un répertoire temporaire et retourner son nom"
function base_mktempd() {
    mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}"
}

function base_ac__forgetall() { NULIB__AC_FILES=(); }
base_ac__forgetall
function base_ac__trap() {
    local file
    for file in "${NULIB__AC_FILES[@]}"; do
        [ -e "$file" ] && rm -rf "$file" 2>/dev/null
    done
    base_ac__forgetall
}
trap base_ac__trap 1 3 15 EXIT

function: base_autoclean "\
Ajouter les fichiers spécifiés à la liste des fichiers à supprimer à la fin du
programme"
function base_autoclean() {
    local file
    for file in "$@"; do
        [ -n "$file" ] && NULIB__AC_FILES=("${NULIB__AC_FILES[@]}" "$file")
    done
}

function: base_ac_cleanall "\
Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite."
function base_ac_cleanall() {
    base_ac__trap
}

function: base_ac_clean "\
Supprimer les fichier temporaires \$1..@ si et seulement s'ils ont été générés
par base_ac_set_tmpfile() ou base_ac_set_tmpdir()"
function base_ac_clean() {
    local file acfile found
    local -a acfiles
    for acfile in "${NULIB__AC_FILES[@]}"; do
        found=
        for file in "$@"; do
            if [ "$file" == "$acfile" ]; then
                found=1
                [ -e "$file" ] && rm -rf "$file" 2>/dev/null
                break
            fi
        done
        [ -z "$found" ] && acfiles=("${acfiles[@]}" "$acfile")
    done
    NULIB__AC_FILES=("${acfiles[@]}")
}

function: base_ac_set_tmpfile "\
Créer un fichier temporaire avec le motif \$2, l'ajouter à la liste des
fichiers à supprimer en fin de programme, et mettre sa valeur dans la
variable \$1

En mode debug, si (\$5 est vide ou \${!5} est une valeur vraie), et si \$3 n'est
pas vide, prendre ce fichier au lieu de générer un nouveau fichier temporaire.
Si \$4==keep, ne pas écraser le fichier \$3 s'il existe."
function base_ac_set_tmpfile() {
    local se__d
    if base_is_debug; then
        if [ -n "$5" ]; then
            is_yes "${!5}" && se__d=1
        else
            se__d=1
        fi
    fi
    if [ -n "$se__d" -a -n "$3" ]; then
        _setv "$1" "$3"
        [ -f "$3" -a "$4" == keep ] || >"$3"
    else
        local se__t="$(base_mktempf "$2")"
        base_autoclean "$se__t"
        _setv "$1" "$se__t"
    fi
}

function: base_ac_set_tmpdir "\
Créer un répertoire temporaire avec le motif \$2, l'ajouter à la liste des
fichiers à supprimer en fin de programme, et mettre sa valeur dans la
variable \$1

En mode debug, si (\$4 est vide ou \${!4} est une valeur vraie), et si \$3 n'est
pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire
temporaire"
function base_ac_set_tmpdir() {
    local sr__d
    if base_is_debug; then
        if [ -n "$4" ]; then
            is_yes "${!4}" && sr__d=1
        else
            sr__d=1
        fi
    fi
    if [ -n "$sr__d" -a -n "$3" ]; then
        _setv "$1" "$3"
        mkdir -p "$3"
    else
        local sr__t="$(base_mktempd "$2")"
        base_autoclean "$sr__t"
        _setv "$1" "$sr__t"
    fi
}