nutools/ulib/javaproperties

114 lines
3.5 KiB
Bash

##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de fichiers de propriétés java
##@cooked nocomments
##@require base
uprovide javaproperties
urequire base
function read_property() {
# Lire la propriété $2 dans le fichier $1, et placer la valeur dans la
# variable $3. Si la propriété n'existe pas, prendre la valeur par défaut
# $4. Si $3=="", elle est construite à partir de $2 en remplaçant les '.'
# par '_'
# Retourner 1 si une erreur s'est produite (par exemple si le fichier
# n'existe pas ou n'est pas accessible en lecture)
[ -f "$1" -a -r "$1" ] || return 1
local __rp_name __rp_value __rp_found
# utiliser cawkrun pour que awk n'essaye pas de traiter les caractères en
# unicode (latin1 wrt utf-8)
__rp_value="$(<"$1" cawkrun name="$2" '
BEGIN {
found = 1
re_name = name
gsub(/\./, "\\.", re_name)
re_name = "^[ \t]*" re_name "[ \t]*="
}
$0 ~ re_name {
sub(re_name, "")
value = $0
sub(/^[ \t]*/, "", value)
while (substr(value, length(value), 1) == "\\") {
getline
sub(/^[ \t]*/, "")
value = substr(value, 1, length(value) - 1) $0
}
print value
found = 0
exit
}
END { exit found }')" && __rp_found=1
if [ -n "$3" ]; then
__rp_name="$3"
else
__rp_name="${2//./_}"
fi
if [ -n "$__rp_found" ]; then
set_var "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")"
else
set_var "$__rp_name" "$4"
fi
}
function write_property() {
# Ecrire la propriété $2 dans le fichier $1 avec la valeur $3.
# Retourner 1 si une erreur s'est produite (par exemple si le fichier
# n'existe pas ou n'est pas accessible en écriture)
[ -f "$1" -a -w "$1" ] || return 1
local status tmpfile
ac_set_tmpfile tmpfile
# utiliser cawkrun pour que awk n'essaye pas de traiter les caractères en
# unicode (utf-8 wrt latin1)
<"$1" >"$tmpfile" cawkrun name="$2" value="$(tooenc "$3" "" "$LATIN1")" '
function write_value() {
# XXX attention, le découpage n"est potentiellement pas fait
# correctement si la valeur contient des espaces
line = name "=" value
prefix = ""
max_len = 75
if (length(line) > max_len) {
do {
print prefix substr(line, 1, max_len) "\\"
line = substr(line, max_len + 1)
prefix = " "
max_len = 71
} while (length(line) > max_len)
}
print prefix line
}
BEGIN {
found = 0
re_name = name
gsub(/\./, "\\.", re_name)
re_name = "^[ \t]*" re_name "[ \t]*="
}
!found && $0 ~ re_name {
line = $0
while (substr(line, length(line), 1) == "\\") {
getline
line = line $0
}
write_value()
found = 1
next
}
{ print }
END { if (!found) write_value() }
' && cat "$tmpfile" >"$1"
status=$?
ac_clean "$tmpfile"
return $status
}
function write_properties() {
# Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la
# forme "name=value"
local __wp_propfile="$1"; shift
local __wp_prop __wp_name __wp_value
for __wp_prop in "$@"; do
splitvar "$__wp_prop" __wp_name __wp_value
write_property "$__wp_propfile" "$__wp_name" "$__wp_value"
done
}