summaryrefslogtreecommitdiffstats
path: root/perl-install/handle_configs.pm
diff options
context:
space:
mode:
authorDexter Morgan <dmorgan@mageia.org>2011-06-02 20:51:35 +0000
committerDexter Morgan <dmorgan@mageia.org>2011-06-02 20:51:35 +0000
commita9b2bdafaf625d10aef2f476aa4014fd36c846bc (patch)
tree2364afc0ee6739b59a25c44d68c9f003bcaf03d9 /perl-install/handle_configs.pm
downloaddrakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar
drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.gz
drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.bz2
drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.tar.xz
drakx-a9b2bdafaf625d10aef2f476aa4014fd36c846bc.zip
Branch for updates
Diffstat (limited to 'perl-install/handle_configs.pm')
-rw-r--r--perl-install/handle_configs.pm160
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;