##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions de base: gestion des valeurs scalaires
##@cooked nocomments
# 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.string
urequire base.core

function straddp() {
# ajouter le préfixe $1 à $2*
    local p="$1"; shift
    echo "$p$*"
}
function strdelp() {
# enlever le préfixe $1 à $2*
    local p="$1"; shift
    local str="$*"
    echo "${str#$p}"
}
function strdelp2() {
# enlever le préfixe $1 le plus long à $2*
    local p="$1"; shift
    local str="$*"
    echo "${str##$p}"
}
function stradds() {
# ajouter le suffixe $1 à $2*
    local s="$1"; shift
    echo "$*$s"
}
function strdels() {
# enlever le suffixe $1 à $2*
    local s="$1"; shift
    local str="$*"
    echo "${str%$s}"
}
function strdels2() {
# enlever le suffixe le plus long $1 à $2*
    local s="$1"; shift
    local str="$*"
    echo "${str%%$s}"
}
function strlower() {
# afficher en minuscule la valeur $*
    local str="$*"
    echo "${str,,}"
}
function strlower1() {
# afficher la valeur $* après avoir converti la première lettre en minuscule
    local str="$*"
    echo "${str,}"
}
function strlowers() {
# afficher les valeurs $1..* après avoir converti leur première lettre en
# minuscule
    local str="$*"
    echo "${*,}"
}
function strupper() {
# afficher en majuscule la valeur $*
    local str="$*"
    echo "${str^^}"
}
function strupper1() {
# afficher la valeur $* après avoir converti la première lettre en majuscule
    local str="$*"
    echo "${str^}"
}
function struppers() {
# afficher les valeurs $1..* après avoir converti leur première lettre en
# majuscule
    echo "${*^}"
}
function strmid() {
# Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes
# 'start', '[start]:length'. Si start est négatif, le compte est effectué à
# partir de la fin de la chaine. Si length est négatif, il est rajouté à la
# longueur de la chaine à partir de start
    local range="$1"; shift
    local str="$*"
    if [[ "$range" == *:-* ]]; then
        local max=${#str}
        [ $max -eq 0 ] && return
        local start="${range%%:*}"
        [ -n "$start" ] || start=0
        while [ "$start" -lt 0 ]; do
            start=$(($max$start))
        done
        max=$(($max-$start))
        local length="${range#*:}"
        while [ "$length" -lt 0 ]; do
            length=$(($max$length))
        done
        range="$start:$length"
    fi
    eval 'echo "${str:'" $range"'}"'
}
function strrepl() {
# Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer
# par l'un des caractères /, #, % pour indiquer le type de recherche
    local pattern="$1"; shift
    local repl="$1"; shift
    local str="$*"
    local cmd='echo "${str/'
    if [ "${pattern#/}" != "$pattern" ]; then
        pattern="${pattern#/}"
        cmd="$cmd/"
    elif [ "${pattern#\#}" != "$pattern" ]; then
        pattern="${pattern#\#}"
        cmd="$cmd#"
    elif [ "${pattern#%}" != "$pattern" ]; then
        pattern="${pattern#%}"
        cmd="$cmd%"
    fi
    cmd="$cmd"'$pattern/$repl}"'
    eval "$cmd"
}

function first_char() {
# retourner le premier caractère de la chaine $*
    local str="$*"
    echo "${str:0:1}"
}
function last_char() {
# retourner le dernier caractère de la chaine $*
    local str="$*"
    echo "${str: -1:1}"
}
function first_chars() {
# retourner tous les caractères de la chaine $*, excepté le dernier
    local str="$*"
    recho "${str:0:$((${#1}-1))}"
}
function last_chars() {
# retourner tous les caractères de la chaine $*, excepté le premier
    local str="$*"
    recho "${str:1}"
}
function first_char_is() {
# Tester si le premier caractère de la chaine $1 est $2
    [ "${1:0:1}" == "$2" ]
}
function last_char_is() {
# Tester si le dernier caractère de la chaine $1 est $2
    [ "${1:$((-1)):1}" == "$2" ]
}
function beginswith() {
# Tester si la chaine $1 commence par le wildcard $2
    local str="$1" pattern="$2"
    eval '[ "${str#$pattern}" != "$str" ]'
}
function endswith() {
# Tester si la chaine $1 se termine par le wildcard $2
    local str="$1" pattern="$2"
    eval '[ "${str%$pattern}" != "$str" ]'
}