diff options
author | Dexter Morgan <dmorgan@mageia.org> | 2011-06-02 20:51:35 +0000 |
---|---|---|
committer | Dexter Morgan <dmorgan@mageia.org> | 2011-06-02 20:51:35 +0000 |
commit | a9b2bdafaf625d10aef2f476aa4014fd36c846bc (patch) | |
tree | 2364afc0ee6739b59a25c44d68c9f003bcaf03d9 /perl-install/handle_configs.pm | |
download | drakx-backup-do-not-use-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar drakx-backup-do-not-use-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.gz drakx-backup-do-not-use-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.bz2 drakx-backup-do-not-use-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.xz drakx-backup-do-not-use-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.zip |
Branch for updates
Diffstat (limited to 'perl-install/handle_configs.pm')
-rw-r--r-- | perl-install/handle_configs.pm | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/perl-install/handle_configs.pm b/perl-install/handle_configs.pm new file mode 100644 index 000000000..2ade1b661 --- /dev/null +++ b/perl-install/handle_configs.pm @@ -0,0 +1,160 @@ +package handle_configs; + +# $Id: handle_configs.pm 204175 2003-09-17 19:25:59Z tvignaud $ + +use diagnostics; +use strict; + +use common; + +sub searchstr { + # Preceed all characters which are special characters in regexps with + # a backslash, so that the returned string used in a regexp searches + # a literal occurence of the original string. White space is replaced + # by "\s+" + # "quotemeta()" does not serve for this, as it also quotes some regular + # characters, as the space + my ($s) = @_; + $s =~ s!([\\/\(\)\[\]\{\}\|\.\$\@\%\*\?#\+\-])!\\$1!g; + return $s; +} + +sub read_directives { + # Read one or more occurences of a directive + my ($lines_ptr, $directive) = @_; + + my $searchdirective = searchstr($directive); + # do not use if_() below because it slow down printerdrake + # to the point one can believe in process freeze: + map { (/^\s*$searchdirective\s+(\S.*)$/ ? chomp_($1) : ()) } @$lines_ptr; +} + +sub read_unique_directive { + + # Read a directive, if the directive appears more than once, use + # the last occurence and remove all the others, if it does not + # occur, return the default value + + my ($lines_ptr, $directive, $default) = @_; + + if ((my @d = read_directives($lines_ptr, $directive)) > 0) { + my $value = $d[-1]; + set_directive($lines_ptr, "$directive $value"); + return $value; + } else { + return $default; + } +} + +sub insert_directive { + + # Insert a directive only if it is not already there + + my ($lines_ptr, $directive) = @_; + + my $searchdirective = searchstr($directive); + (/^\s*$searchdirective$/ and return 0) foreach @$lines_ptr; + push @$lines_ptr, "$directive\n"; + return 1; +} + +sub remove_directive { + + # Remove a directive + + my ($lines_ptr, $directive) = @_; + + my $success = 0; + my $searchdirective = searchstr($directive); + (/^\s*$searchdirective/ and $_ = "" and $success = 1) + foreach @$lines_ptr; + return $success; +} + +sub comment_directive { + + # Comment out a directive + + my ($lines_ptr, $directive, $exactmatch) = @_; + + my $success = 0; + my $searchdirective = searchstr($directive); + $searchdirective .= ".*" if !$exactmatch; + (s/^\s*($searchdirective)$/#$1/ and $success = 1) + foreach @$lines_ptr; + return $success; +} + +sub replace_directive { + + # Replace a directive, if it appears more than once, remove + # the additional occurences. + + my ($lines_ptr, $olddirective, $newdirective) = @_; + + my $success = 0; + $newdirective = "$newdirective\n"; + my $searcholddirective = searchstr($olddirective); + (/^\s*$searcholddirective/ and $_ = $newdirective and + $success = 1 and $newdirective = "") foreach @$lines_ptr; + return $success; +} + + +sub move_directive_to_version_commented_out { + + # If there is a version of the directive "commentedout" which is + # commented out, the directive "directive" will be moved in its place. + + my ($lines_ptr, $commentedout, $directive, $exactmatch) = @_; + + my $success = 0; + my $searchcommentedout = searchstr($commentedout); + $searchcommentedout .= ".*" if !$exactmatch; + (/^\s*#$searchcommentedout$/ and + $success = 1 and last) foreach @$lines_ptr; + if ($success) { + remove_directive($lines_ptr, $directive); + (s/^\s*#($searchcommentedout)$/$directive/ and + $success = 1 and last) foreach @$lines_ptr; + } + return $success; +} + +sub set_directive { + + # Set a directive, replace the old definition or a commented definition + + my ($lines_ptr, $directive, $full_line) = @_; + + my $olddirective = $directive; + if (!$full_line) { + $olddirective =~ s/^\s*(\S+)\s+.*$/$1/s; + $olddirective ||= $directive; + } + + my $success = (replace_directive($lines_ptr, $olddirective, + $directive) || + insert_directive($lines_ptr, $directive)); + if ($success) { + move_directive_to_version_commented_out($lines_ptr, $directive, + $directive, 1); + } + return $success; +} + +sub add_directive { + + # Add a directive, replace a commented definition + + my ($lines_ptr, $directive) = @_; + + my $success = insert_directive($lines_ptr, $directive); + if ($success) { + move_directive_to_version_commented_out($lines_ptr, $directive, + $directive, 1); + } + return $success; +} + +1; |