From 0fb65ad026dd6d541613cd2f770ac2bdba7bf5ed Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Mon, 20 Jan 2014 13:12:50 +0400 Subject: [PATCH] correction de bugs. ajout de l'option -n --- ulib/conf | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/ulib/conf b/ulib/conf index 4ab35f9..94c90d9 100644 --- a/ulib/conf +++ b/ulib/conf @@ -619,8 +619,10 @@ function gconf_addline() { # Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes # BEGIN et END. # -a BEGIN - # Spécifier une expression pour matcher une ligne de type BEGIN. Les - # lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut + # Spécifier une expression pour matcher une ligne de type BEGIN. Si + # cette option n'est pas spécifiée, on considère que le début de fichier + # matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible. + # Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut # d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas # concluant. # -t LINE @@ -633,19 +635,27 @@ function gconf_addline() { # faut la mettre à jour. Supprimer la ligne existante et la remplacer # par la nouvelle ligne. # -z END - # Spécifier une expression pour la matcher la ligne de type END. Dès que - # cette ligne est rencontrée, et si aucun des tests -t ou -r n'est - # concluant, alors ajouter la nouvelle ligne avant celle-ci + # Spécifier une expression pour matcher la ligne de type END. Que cette + # option soit ou non spécifiée, on considère toujours que la fin de + # fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne + # NEWLINE est ajoutée à la fin du fichier. + # Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r + # n'est concluant, alors ajouter la nouvelle ligne avant celle-ci + # -n MAX[=1] + # Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le + # cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver + # la limite # Cette fonction nécessite gawk et ignore la locale eval "$(utools_local)" local -a beginlines newlines - local testline replaceline endline + local testline replaceline endline max parse_opts "${PRETTYOPTS[@]}" \ -a:,--begin: beginlines \ -t:,--test: testline= \ -r:,--replace: replaceline= \ -z:,--end: endline= \ + -n:,--max: max= \ @ args -- "$@" && set -- "${args[@]}" || { eerror "$args" return 1 @@ -663,14 +673,16 @@ function gconf_addline() { eerror "Vous devez spécifier la ligne à rajouter" return 1 } + [ -n "$max" ] || max=1 newlines=("$@") # générer le script - local script="$(awkdef -f beginlines[@] testline="$testline" replaceline="$replaceline" endline="$endline" newlines[@])"' + local script="$(awkdef -f beginlines[@] testline="$testline" replaceline="$replaceline" endline="$endline" max:int="$max" newlines[@])"' BEGIN { searchindex = 1 found = 0 writeline = 1 + if (beginlines_count == 0) found = 1 } function writelines_maybe() { if (writeline) { @@ -681,31 +693,37 @@ function writelines_maybe() { } } -!found && searchindex <= length(beginlines) && $0 ~ beginlines[searchindex] { +max != 0 && !found && searchindex <= length(beginlines) && $0 ~ beginlines[searchindex] { searchindex++ if (searchindex > length(beginlines)) { found = 1 } print; next } -found && testline != "" && $0 ~ testline { +max != 0 && found && writeline && testline != "" && $0 ~ testline { writeline = 0 print; next } -found && replaceline != "" && $0 ~ replaceline { +max != 0 && found && writeline && replaceline != "" && $0 ~ replaceline { writelines_maybe() next } -found && endline != "" && $0 ~ endline { +max != 0 && found && writeline && endline != "" && $0 ~ endline { writelines_maybe() searchindex = 1 found = 0 writeline = 1 + if (max > 0) max-- print; next } { print } +END { + if (max != 0 && found && writeline) { + writelines_maybe() + } +} ' - #edebug "$script" + edebug "$script" # traiter le fichier local tmpfile; ac_set_tmpfile tmpfile