]> git.p6c8.net - selfforum.git/blobdiff - selfforum-cgi/shared/Conf.pm
added version checks
[selfforum.git] / selfforum-cgi / shared / Conf.pm
index 1fa97b2379fd9fe44d82b4b77897b864a66a0ee6..ca39efdc20e31d577445981b6f4aa30d758c04e2 100644 (file)
@@ -1,84 +1,68 @@
-# Conf.pm
+package Conf;
 
-# ====================================================
-# Autor: n.d.p. / 2001-01-05
-# lm   : n.d.p. / 2001-02-02
-# ====================================================
-# Funktion:
-#      Einlesen der Scriptkonfiguration
-# ====================================================
+################################################################################
+#                                                                              #
+# File:        shared/Conf.pm                                                  #
+#                                                                              #
+# Authors:     Andre Malo       <nd@o3media.de>, 2001-06-16                    #
+#                                                                              #
+# Description: read and parse configuration files                              #
+#                                                                              #
+################################################################################
 
 use strict;
-
-package Conf;
-
-use vars qw(@ISA @EXPORT);
+use vars qw(
+  @EXPORT
+  $VERSION
+);
 
 use XML::DOM;
 
-# ====================================================
-# Funktionsexport
-# ====================================================
+################################################################################
+# Version check
+#
+$VERSION = do { my @r =(q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
 
-require Exporter;
-@ISA    = qw(Exporter);
+################################################################################
+#
+# Export
+#
+use base qw(Exporter);
 @EXPORT = qw(read_script_conf);
 
-################################
-# sub read_script_conf
+### add_limit () ###############################################################
 #
-# Scriptkonf. lesen
-################################
-
-sub read_script_conf ($$$) {
-  my ($Bin, $Shared, $Script) = @_;
-
-  $Script =~ s/^(.*)\..*$/$1/;             # Vornamen extrahieren
-  my $common  = "$Shared/common.xml";      # gemeinsame Konf-datei
-  my $group   = "$Bin/config/common.xml";  # gemeinsame (Gruppen-)Konf-datei
-  my $special = "$Bin/config/$Script.xml"; # spezielle Konf-datei
-  my %conf=();                             # conf-Hash
-
-  &parse_script_conf ($common , \%conf, $Script);   # und los...
-  &parse_script_conf ($group,   \%conf, $Script);
-  &parse_script_conf ($special, \%conf, $Script);
-
-  # Rueckgabe
-  \%conf;
-}
-
-# ====================================================
-# Private Funktionen
-# ====================================================
-
-sub parse_script_conf ($$$) {
-  my ($filename, $conf, $Script) = @_;
-
-  if (-f $filename) {
-    # XML parsen
-    my $xml = new XML::DOM::Parser -> parsefile ($filename);
-    my $config = $xml -> getElementsByTagName ('Config',0) -> item (0);
-
-    foreach ($config -> getElementsByTagName ('Constant', 0)) {&add_data ($_, $conf)}
-    foreach ($config -> getElementsByTagName ('Property', 0)) {&add_prop ($_, $conf)}
-    foreach ($config -> getElementsByTagName ('Limit', 0))    {&add_limit ($_, $conf, $Script)}}
-
-  return;
-}
-
-sub add_data ($$) {
-  my ($node, $conf) = @_;
-  my $name = $node -> getAttribute ('name');
+# add limited data
+#
+# Params: $node   - element node
+#         $conf   - hashref of config hash (will be modified)
+#         $Script - scriptname (first name)
+#
+# Return: ~none~
+#
+sub add_limit ($$$) {
+  my ($node, $conf, $Script) = @_;
 
-  die "element '".$node -> getNodeName."' requires attribute 'name' - aborted" unless (length ($name) and defined ($name));
-  die "double defined name '$name' - aborted" if ( exists ( $conf -> {$name} ) );
+  my %apps = map {($_ -> getFirstChild -> getData => 1)}
+                   $node -> getElementsByTagName ('Application',0) -> item (0)
+                   -> getElementsByTagName ('Script',0);
 
-  # Wert eintragen
-  $conf -> {$name} = ($node -> hasChildNodes)?$node -> getFirstChild -> getData:undef;
+  if ($apps {$Script}) {
+    foreach ($node -> getElementsByTagName ('Constant', 0)) {add_data ($_, $conf)}
+    foreach ($node -> getElementsByTagName ('Property', 0)) {add_prop ($_, $conf)}}
 
   return;
 }
 
+### add_prop () ################################################################
+#
+# add a property (recursive if necessary)
+#
+# Params: $node - element node
+#         $conf - hashref of config hash (will be modified)
+#
+# Return: ~none~
+#
 sub add_prop ($$) {
   my ($node, $conf) = @_;
 
@@ -91,6 +75,7 @@ sub add_prop ($$) {
   my @lists  = $node -> getElementsByTagName ('List', 0);
 
   # Properties
+  #
   if (@props) {
     for (@props) {
       my $hash = (defined $conf -> {$name})?$conf -> {$name}:{};
@@ -101,6 +86,7 @@ sub add_prop ($$) {
       $conf -> {$name} = $hash;}}
 
   # Array
+  #
   if (@lists) {
     for (@lists) {
       my $lname = $_ -> getAttribute ('name');
@@ -111,6 +97,7 @@ sub add_prop ($$) {
       $conf -> {$name} -> {$lname} = [map {($_ -> hasChildNodes)?$_ -> getFirstChild -> getData:undef} $_ -> getElementsByTagName ('ListItem', 0)];}}
 
   # Hash
+  #
   if (@vars) {
     for (@vars) {
       my $vname = $_ -> getAttribute ('name');
@@ -123,31 +110,91 @@ sub add_prop ($$) {
   return;
 }
 
-sub add_limit ($$$) {
-  my ($node, $conf, $Script) = @_;
+### add_data () ################################################################
+#
+# add a real value (Constant or Variable)
+#
+# Params: $node - Element node
+#         $conf - hashref of config hash (will be modified)
+#
+# Return: ~none~
+#
+sub add_data ($$) {
+  my ($node, $conf) = @_;
+  my $name = $node -> getAttribute ('name');
 
-  my %apps = map {($_ -> getFirstChild -> getData => 1)}
-                   $node -> getElementsByTagName ('Application',0) -> item (0)
-                   -> getElementsByTagName ('Script',0);
+  die q"element '".$node -> getNodeName.q"' requires attribute 'name' - aborted" unless (length ($name) and defined ($name));
+  die q"double defined name '$name' - aborted" if ( exists ( $conf -> {$name} ) );
 
-  if ($apps {$Script}) {
-    foreach ($node -> getElementsByTagName ('Constant', 0)) {&add_data ($_, $conf)}
-    foreach ($node -> getElementsByTagName ('Property', 0)) {&add_prop ($_, $conf)}}
+  $conf -> {$name} = ($node -> hasChildNodes)?$node -> getFirstChild -> getData:undef;
+
+  return;
+}
+
+### parse_script_conf () #######################################################
+#
+# parse a config file
+#
+# Params: $filename - filename
+#         $conf     - hashref of config hash (hash will be modified)
+#         $Script   - scriptname
+#
+# Return: ~none~
+#
+sub parse_script_conf ($\%$) {
+  my ($filename, $conf, $Script) = @_;
+
+  if (-f $filename) {
+    my $xml = new XML::DOM::Parser -> parsefile ($filename);
+    my $config = $xml -> getElementsByTagName ('Config', 0) -> item (0);
+
+    add_data  $_, $conf          for ($config -> getElementsByTagName ('Constant', 0));
+    add_prop  $_, $conf          for ($config -> getElementsByTagName ('Property', 0));
+    add_limit $_, $conf, $Script for ($config -> getElementsByTagName ('Limit', 0));
+  }
 
   return;
 }
 
-# ====================================================
-# Modulinitialisierung
-# ====================================================
+### read_script_conf () ########################################################
+#
+# read and parse whole script config.
+#
+# Params: $Config - /path/to/config-dir   # NO trailing slash please
+#         $Shared - /path/to/shared-dir   #        -- " --
+#         $Script - scriptname
+#
+sub read_script_conf ($$$) {
+  my ($Config, $Shared, $Script) = @_;
+
+  $Script =~ s/^(.*)\..*$/$1/;             # extract script's 'first name'
+  my $common  = "$Shared/common.xml";      # shared config file
+  my $group   = "$Config/common.xml";      # group config file
+  my $special = "$Config/$Script.xml";     # special script config file
+  my %conf=();                             # config hash
+
+  parse_script_conf ($common , %conf, $Script);
+  parse_script_conf ($group,   %conf, $Script);
+  parse_script_conf ($special, %conf, $Script);
 
-# making require happy
+  # return
+  #
+  \%conf;
+}
+
+# keep 'require' happy
 1;
 
-# ====================================================
-# end of Conf
-# ====================================================
+#
+#
+### end of Conf ################################################################
 
+### show() #####################################################################
+#
+# mini data dumper
+#
+# Usage: Conf::Test::show (hashref)
+#
 package Conf::Test;sub show{print"Content-type: text/plain\n\n";&hash($_[
 0],'')}sub hash{my($ref,$string)=@_;foreach(sort keys%$ref){my$val=$ref->
 {$_};unless(ref($val)){print$string,$_,' = ',$val,"\n";next;}else{if(ref(
@@ -158,6 +205,6 @@ ref($_)eq 'HASH'){&hash($_,"$string\[$i] -> ")}else{if(ref($_)eq'ARRAY'){
 &array($_,"$string\[$i] -> ");}}}$i++;}}# n.d.p./2001-01-05/lm:2001-01-19
 # FUNCTION: printing the configuration, USAGE: &Conf::Test::show ($conf);
 
-# ====================================================
-# 'real' end of Conf .-))
-# ====================================================
\ No newline at end of file
+#
+#
+### *real* end of Conf ;-) #####################################################

patrick-canterino.de