réimplémenter certaines fonctions de façon plus efficace

This commit is contained in:
Jephte CLAIN 2014-03-11 23:38:56 +04:00
parent c3b66b5c5c
commit c9f6b23a71
1 changed files with 102 additions and 29 deletions

131
ulib/base
View File

@ -31,8 +31,101 @@ export TMPDIR="${TMPDIR:-${TMP:-${TEMP:-/tmp}}}"
[ -f ~/.nutoolsrc ] && . ~/.nutoolsrc [ -f ~/.nutoolsrc ] && . ~/.nutoolsrc
################################################################################ ################################################################################
## valeurs ## core
function recho() {
# afficher une valeur brute. contrairement à la commande echo, ne reconnaitre
# aucune option (i.e. -e, -E, -n)
if [[ "${1:0:2}" == -[eEn] ]]; then
echo -n -
local first="${1:1}"; shift
echo "$first" "$@"
else
echo "$*"
fi
}
function recho_() {
# afficher une valeur brute, sans passer à la ligne. contrairement à la commande
# echo, ne reconnaitre aucune option (i.e. -e, -E, -n)
if [[ "${1:0:2}" == -[eEn] ]]; then
echo -n -
local first="${1:1}"; shift
echo -n "$first" "$@"
else
echo -n "$*"
fi
}
function qval() {
# Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`
# Cela permet de quoter une chaine à mettre entre guillements note: la
# protection de ! n'est pas effectuée, parce que le comportement du shell est
# incohérent entre le shell interactif et les scripts. Pour une version plus
# robuste, il est nécessaire d'utiliser un programme externe tel que sed ou awk
local s="$*"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//\$/\\\$}"
s="${s//\`/\\\`}"
recho_ "$s"
}
function should_quote() {
# Tester si la chaine $* doit être mise entre quotes
[ -z "$1" ] && return 0
local s="${*//[a-zA-Z0-9]/}"
s="${s//,/}"
s="${s//./}"
s="${s//+/}"
s="${s//\//}"
s="${s//-/}"
s="${s//_/}"
s="${s//=/}"
[ -n "$s" ]
}
function qvals() {
# Pour chaque argument de cette fonction, l'afficher éventuellement quotée avec qv()
local arg first=1
for arg in "$@"; do
[ -z "$first" ] && echo -n " "
if should_quote "$arg"; then
echo -n \"
qv "$arg"
echo -n \"
else
recho_ "$arg"
fi
first=
done
}
function qlines() {
# Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées
# avec '
sed "s/'/'\\\\''/g; s/.*/'&'/g"
}
function setv() {
# initialiser la variable $1 avec la valeur $2..*
local __s_var="$1"; shift
eval "$__s_var=\"$(qval "$*")\""
}
function setx() {
# initialiser la variable $1 avec le résultat de la commande '$2..@'
local __s_var="$1"; shift
eval "$__s_var=\"\$(\"\$@\")\""
}
function seta() {
# initialiser le tableau $1 avec le résultat de la commande '$2..@', chaque
# ligne du résultat étant un élément du tableau
local __s_array="$1"; shift
eval "$__s_array=($("$@" | qlines))"
}
function e2of() {
# lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard
"$@" 2>&1
}
function nef() {
# lancer la commande $@ et filtrer du résultat toutes les lignes vides
"$@" | sed '/^$/d'
}
## valeurs
function isnum() { function isnum() {
# retourner vrai si $1 est une valeur numérique entière (positive ou négative) # retourner vrai si $1 est une valeur numérique entière (positive ou négative)
[ ${#1} -gt 0 ] || return 1 [ ${#1} -gt 0 ] || return 1
@ -61,14 +154,10 @@ function isrnum() {
} }
function is_yes() { function is_yes() {
# retourner vrai si $1 est une valeur "oui" # retourner vrai si $1 est une valeur "oui"
[ "$1" == "o" -o "$1" == "O" -o "$1" == "oui" -o "$1" == "OUI" ] && return 0 case "${1,,}" in
[ "$1" == "y" -o "$1" == "Y" -o "$1" == "yes" -o "$1" == "YES" ] && return 0 o|oui|y|yes|v|vrai|t|true|on) return 0;;
[ "$1" == "v" -o "$1" == "V" -o "$1" == "vrai" -o "$1" == "VRAI" ] && return 0 esac
[ "$1" == "t" -o "$1" == "T" -o "$1" == "true" -o "$1" == "TRUE" ] && return 0 isnum "$1" && [ "$1" -ne 0 ] && return 0
[ "$1" == "on" -o "$1" == "ON" ] && return 0
if isnum "$1"; then
[ "$1" -ne 0 ] && return 0
fi
return 1 return 1
} }
function yesval() { function yesval() {
@ -95,14 +184,10 @@ function normyesvals() {
} }
function is_no() { function is_no() {
# retourner vrai si $1 est une valeur "non" # retourner vrai si $1 est une valeur "non"
[ "$1" == "n" -o "$1" == "N" -o "$1" == "non" -o "$1" == "NON" ] && return 0 case "${1,,}" in
[ "$1" == "no" -o "$1" == "NO" ] && return 0 n|non|no|f|faux|false|off) return 0;;
[ "$1" == "f" -o "$1" == "F" -o "$1" == "faux" -o "$1" == "FAUX" ] && return 0 esac
[ "$1" == "false" -o "$1" == "FALSE" ] && return 0 isnum "$1" && [ "$1" -eq 0 ] && return 0
[ "$1" == "off" -o "$1" == "OFF" ] && return 0
if isnum "$1"; then
[ "$1" -eq 0 ] && return 0
fi
return 1 return 1
} }
function rawecho() { function rawecho() {
@ -141,18 +226,6 @@ function quote_arg() {
s="${s//\`/\\\`}" s="${s//\`/\\\`}"
rawecho "$s" rawecho "$s"
} }
function should_quote() {
[ -z "$1" ] && return 0
local s="${1//[a-zA-Z0-9]/}"
s="${s//,/}"
s="${s//./}"
s="${s//+/}"
s="${s//\//}"
s="${s//-/}"
s="${s//_/}"
s="${s//=/}"
[ -n "$s" ]
}
function quoted_arg() { function quoted_arg() {
# Dans la chaine $1, remplacer \ par \\, " par \" et $ par \$, et afficher la # Dans la chaine $1, remplacer \ par \\, " par \" et $ par \$, et afficher la
# chaine entourée de guillemets, si nécessaire # chaine entourée de guillemets, si nécessaire