correction de bugs. ajout de l'option -n

This commit is contained in:
Jephté Clain 2014-01-20 13:12:50 +04:00
parent c3243fddb1
commit 0fb65ad026
1 changed files with 30 additions and 12 deletions

View File

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