migration de nouvelles fonctions de gestion des chaines de caractère

This commit is contained in:
Jephté Clain 2014-09-19 14:51:19 +04:00
parent f0edff697b
commit 4d40820308
6 changed files with 109 additions and 122 deletions

View File

@ -1 +1 @@
003001000 003002000

View File

@ -35,7 +35,7 @@ fi
##@include base.array ##@include base.array
##@include base.compat ##@include base.compat
uprovide base uprovide base
urequire base.init base.core base.string base.array base.compat urequire base.init base.core base.string base.quote base.array base.compat
## Informations sur l'hôte sur lequel tourne ce script ## Informations sur l'hôte sur lequel tourne ce script
# Type de système # Type de système
@ -50,11 +50,6 @@ if [ -n "$UTOOLS_CHROOT" ]; then
fi fi
## valeurs ## valeurs
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() { function setyesval() {
# mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1 # mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
is_yes "$2" && set_var "$1" 1 || set_var "$1" "" is_yes "$2" && set_var "$1" 1 || set_var "$1" ""
@ -72,47 +67,6 @@ function normyesvals() {
is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" ""
done done
} }
function rawecho() {
# afficher une valeur brute. contrairement à echo, ne pas reconnaitre les
# options -e, -E, -n.
# cette fonction est nécessaire pour pouvoir splitter et afficher des options de
# ligne de commande.
local first
while [ "${1:0:1}" == "-" ]; do
echo_ -
first="${1:1}"; shift
set -- "$first" "$@"
done
echo "$*"
}
function rawecho_() {
local first
while [ "${1:0:1}" == "-" ]; do
echo_ -
first="${1:1}"; shift
set -- "$first" "$@"
done
echo_ "$*"
}
function quote_arg() {
# Dans la chaine $1, 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, utiliser plutôt quote_sarg(), qui est malheureusement
# plus lent, parce qu'il utilise un programme externe
local s="$1"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//\$/\\\$}"
s="${s//\`/\\\`}"
rawecho "$s"
}
function quoted_arg() {
# Dans la chaine $1, remplacer \ par \\, " par \" et $ par \$, et afficher la
# chaine entourée de guillemets, si nécessaire
should_quote "$1" && echo "\"$(quote_arg "$1")\"" || quote_arg "$1"
}
function quote_in() { function quote_in() {
# Comme quote_arg pour une chaine lue sur stdin # Comme quote_arg pour une chaine lue sur stdin
sed 's/\\/\\\\/g sed 's/\\/\\\\/g
@ -135,15 +89,6 @@ function quoted_sarg() {
# quotes # quotes
echo "'$(quote_sarg "$1")'" echo "'$(quote_sarg "$1")'"
} }
function quoted_args() {
# Comme quoted_arg, mais tous les arguments sont quotés et affichés entourés de
# guillemets, ce qui permet de construire des arguments d'une ligne de commande
local a s
for a in "$@"; do
s="${s:+$s }$(quoted_arg "$a")"
done
rawecho "$s"
}
function quoted_sargs() { function quoted_sargs() {
# Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de # Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de
# quotes, ce qui permet de construire des arguments d'une ligne de commande # quotes, ce qui permet de construire des arguments d'une ligne de commande
@ -153,53 +98,6 @@ function quoted_sargs() {
done done
rawecho "$s" rawecho "$s"
} }
function quote_awk() {
# dans la chaine $1, remplacer \ par \\ et " par \". ceci est utile pour quoter
# des valeur à insérer dans un script awk
local s="$1"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//
/\\n}"
rawecho "$s"
}
function quoted_awk() {
# dans la chaine $1, remplacer \ par \\ et " par \" et afficher la
# chaine entourée de guillemets. ceci est utile pour quoter
# des valeur à insérer dans un script awk
rawecho "\"$(quote_awk "$1")\""
}
function quote_seds() {
# Quoter la chaine $1, qui doit être utilisée comme chaine de recherche ou de
# remplacement de grep, sed ou awk
local s="$1"
s="${s//\\/\\\\}"
s="${s//\//\\/}"
rawecho "$s"
}
function quote_form() {
# Dans la chaine $1, remplacer '%' par '%25', '+' par '%2B', '&' par '%26', '='
# par '%3D', ' ' par '+'
local s="$1"
s="${s//\%/%25}"
s="${s//+/%2B}"
s="${s//&/%26}"
s="${s//=/%3D}"
s="${s// /+}"
rawecho "$s"
}
function quoted_form() {
# Dans la chaine $1 qui est de la forme "name=value", remplacer dans name et
# dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par
# '+'
local n="${1%%=*}"
if [ "$n" != "$1" ]; then
local v="${1#*=}"
rawecho "$(quote_form "$n")=$(quote_form "$v")"
else
quote_form "$1"
fi
}
function first_char() { function first_char() {
# retourner le premier caractère de la chaine $1 # retourner le premier caractère de la chaine $1
rawecho "${1:0:1}" rawecho "${1:0:1}"
@ -3110,9 +3008,6 @@ function utools_local() {
done done
} }
function echo_() {
echo -n "$*"
}
function isatty() { function isatty() {
# tester si STDOUT n'est pas une redirection # tester si STDOUT n'est pas une redirection
tty -s <&1 tty -s <&1

View File

@ -57,3 +57,17 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then
} }
fi fi
fi fi
## base.core
function rawecho() { recho "$@"; }
function rawecho_() { recho_ "$@"; }
function quote_arg() { _qval "$@"; }
function quoted_arg() { qvalm "$@"; }
function quoted_args() { qvals "$@"; }
## base.quote
function quote_awk() { _qawk "$@"; }
function quoted_awk() { qawk "$@"; }
function quote_seds() { qseds "$@"; }
function quote_form() { _qform "$@"; }
function quoted_form() { qform "$@"; }

View File

@ -3,6 +3,10 @@
##@cooked nocomments ##@cooked nocomments
uprovide base.core uprovide base.core
function echo_() {
# afficher la valeur $* sans passer à la ligne
echo -n "$*"
}
function recho() { function recho() {
# afficher une valeur brute. contrairement à la commande echo, ne reconnaitre # afficher une valeur brute. contrairement à la commande echo, ne reconnaitre
# aucune option (i.e. -e, -E, -n ne sont pas signifiants) # aucune option (i.e. -e, -E, -n ne sont pas signifiants)
@ -39,20 +43,6 @@ function _qval() {
s="${s//\`/\\\`}" s="${s//\`/\\\`}"
recho_ "$s" recho_ "$s"
} }
function qval() {
# Afficher la chaine $* quotée avec "
echo -n \"
_qval "$@"
echo \"
}
function qvalr() {
# Afficher la chaine $* quotée avec ", sauf si elle est vide
if [ -n "$*" ]; then
echo -n \"
_qval "$@"
echo n \"
fi
}
function should_quote() { function should_quote() {
# Tester si la chaine $* doit être mise entre quotes # Tester si la chaine $* doit être mise entre quotes
[ -z "$1" ] && return 0 [ -z "$1" ] && return 0
@ -66,6 +56,30 @@ function should_quote() {
s="${s//=/}" s="${s//=/}"
[ -n "$s" ] [ -n "$s" ]
} }
function qval() {
# Afficher la chaine $* quotée avec "
echo -n \"
_qval "$@"
echo \"
}
function qvalm() {
# Afficher la chaine $* quotée si nécessaire avec "
if should_quote "$*"; then
echo -n \"
_qval "$@"
echo \"
else
recho "$*"
fi
}
function qvalr() {
# Afficher la chaine $* quotée avec ", sauf si elle est vide
if [ -n "$*" ]; then
echo -n \"
_qval "$@"
echo \"
fi
}
function qvals() { function qvals() {
# Afficher chaque argument de cette fonction quotée le cas échéant avec " # Afficher chaque argument de cette fonction quotée le cas échéant avec "
# Chaque valeur est séparée par un espace. # Chaque valeur est séparée par un espace.
@ -81,6 +95,7 @@ function qvals() {
fi fi
first= first=
done done
[ -z "$first" ] && echo
} }
function qlines() { function qlines() {
# Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées # Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées
@ -88,7 +103,7 @@ function qlines() {
sed "s/'/'\\\\''/g; s/.*/'&'/g" sed "s/'/'\\\\''/g; s/.*/'&'/g"
} }
function setv() { function setv() {
# initialiser la variable $1 avec la valeur "$2..*" # initialiser la variable $1 avec la valeur $2*
# note: en principe, la syntaxe est 'setv var values...'. cependant, la # note: en principe, la syntaxe est 'setv var values...'. cependant, la
# syntaxe 'setv var=values...' est supportée aussi # syntaxe 'setv var=values...' est supportée aussi
local __s_var="$1"; shift local __s_var="$1"; shift

58
lib/ulib/base.quote Normal file
View File

@ -0,0 +1,58 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions de base: protection de valeurs chaine
##@cooked nocomments
uprovide base.quote
urequire base.core
function _qawk() {
# Dans la chaine $*, remplacer \ par \\ et " par \". Ceci est utile pour quoter
# des valeur à insérer dans un script awk
local s="$*"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//
/\\n}"
recho_ "$s"
}
function qawk() {
# Dans la chaine $*, remplacer \ par \\ et " par \" et afficher la chaine
# entourée de guillemets. Ceci est utile pour quoter des valeur à insérer dans
# un script awk
echo -n \"
_qawk "$@"
echo \"
}
function qseds() {
# Quoter la chaine $*, qui doit être utilisée comme chaine de recherche ou de
# remplacement de grep, sed ou awk
local s="$*"
s="${s//\\/\\\\}"
s="${s//\//\\/}"
recho "$s"
}
function _qform() {
# Dans la chaine $*, remplacer '%' par '%25', '+' par '%2B', '&' par '%26', '='
# par '%3D', ' ' par '+'
local s="$*"
s="${s//\%/%25}"
s="${s//+/%2B}"
s="${s//&/%26}"
s="${s//=/%3D}"
s="${s// /+}"
recho_ "$s"
}
function qform() {
# Dans la chaine $* qui est de la forme "name=value", remplacer dans name et
# dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par
# '+'
local s="$*"
if [[ "$s" == *=* ]]; then
_qform "${s%%=*}"
echo -n =
_qform "${s#*=}"
echo
else
_qform "$s"
echo
fi
}

View File

@ -157,3 +157,8 @@ function is_no() {
isnum "$1" && [ "$1" -eq 0 ] && return 0 isnum "$1" && [ "$1" -eq 0 ] && return 0
return 1 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
}