diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver index c22b486..32cfcaa 100644 --- a/lib/ulib/.ulibver +++ b/lib/ulib/.ulibver @@ -1 +1 @@ -006000000 +007000000 diff --git a/lib/ulib/base b/lib/ulib/base index 2b25481..9254820 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -2322,6 +2322,9 @@ function parse_opts() { # mentionnée ('' pour aucune mention, '1' pour une seule mention, etc.), sauf si # on utilise la forme var=value, auquel cas la variable obtient la valeur value, # et le nombre d'occurences de l'option n'est pas compté. +# Pour faciliter la lecture: +# '--opt .' est équivalent à '--opt opt' +# '--opt: .' est équivalent à '--opt: opt=' # Avec la forme '-o:' ou '--longopt:', l'option prend un argument obligatoire. # Avec la forme '-o::' ou '--longopt::', l'option prend un argument facultatif # (dans ce cas, la valeur de l'option sur la ligne de commande doit @@ -2330,12 +2333,10 @@ function parse_opts() { # la variable de destination est un tableau qui contient toutes les valeurs. # Le traitement de la valeur d'une variable dépend de la forme utilisée. # - Avec une option sans argument, le comportement est celui décrit ci-dessus. -# - Avec une option qui prend des arguments, la forme '-o: var' provoque -# l'effacement de la variable de destination, puisqu'elle doit devenir un -# tableau qui contiendra toutes les valeurs mentionnées dans les options. La -# forme '-o: var=' empêche l'effacement de la variable de destination, qui garde -# sa valeur par défaut. De plus, elle ne sera pas un tableau, et l'on ne -# supporte pas les valeurs multiples. +# - Avec une option qui prend des arguments, la forme '-o: var' considère que +# var est un tableau qui contiendra toutes les valeurs mentionnées dans les +# options. Avec la forme '-o: var=', la variable n'est pas un tableau et +# contient toujours la dernière valeur spécifiée. # - Dans la forme 'opt $cmd', la commande cmd est executée avec eval *dès* que # l'option est rencontrée. La variable option_ contient l'option, e.g. '-o' ou # '--longopt'. Le cas échéant, la variable value_ contient la valeur de @@ -2425,6 +2426,19 @@ function __po_parse_optdescs() { let shift_=$shift_+2 elif [[ "$1" == --* ]] || [[ "$1" == -* ]]; then array_split optdescs_ "$1" "," + if [ "$2" == . ]; then + local autoname_ + for optdesc_ in "${optdescs_[@]}"; do + if [ ${#optdesc_} -gt ${#autoname_} ]; then + autoname_="$optdesc_" + fi + done + while [ -n "$autoname_" -a "${autoname_#-}" != "$autoname_" ]; do autoname_="${autoname_#-}"; done + while [ -n "$autoname_" -a "${autoname_%:}" != "$autoname_" ]; do autoname_="${autoname_%:}"; done + autoname_="${autoname_//-/_}" + shift; shift + set -- dummy "$autoname_" "$@" + fi for optdesc_ in "${optdescs_[@]}"; do if [[ "$2" == \$* ]]; then name_="$2" @@ -2441,23 +2455,19 @@ function __po_parse_optdescs() { elif [[ "$optdesc_" == *:: ]]; then option_="${optdesc_%::}" if [[ "$2" == *=* ]]; then - # la valeur mentionnée est toujours ignorée, mais la - # valeur de la variable n'est pas écrasée + # la valeur mentionnée est toujours ignorée name_="${2%%=*}=" else name_="$2" - array_new "$name_" fi flag_=:: elif [[ "$optdesc_" == *: ]]; then option_="${optdesc_%:}" if [[ "$2" == *=* ]]; then - # la valeur mentionnée est toujours ignorée, mais la - # valeur de la variable n'est pas écrasée + # la valeur mentionnée est toujours ignorée name_="${2%%=*}=" else name_="$2" - array_new "$name_" fi flag_=: else