##@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
}