summaryrefslogtreecommitdiff
path: root/ACE/MPC/modules/TemplateInputReader.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/MPC/modules/TemplateInputReader.pm')
-rw-r--r--ACE/MPC/modules/TemplateInputReader.pm140
1 files changed, 140 insertions, 0 deletions
diff --git a/ACE/MPC/modules/TemplateInputReader.pm b/ACE/MPC/modules/TemplateInputReader.pm
new file mode 100644
index 00000000000..c1fc7c455d4
--- /dev/null
+++ b/ACE/MPC/modules/TemplateInputReader.pm
@@ -0,0 +1,140 @@
+package TemplateInputReader;
+
+# ************************************************************
+# Description : Reads the template input and stores the values
+# Author : Chad Elliott
+# Create Date : 5/16/2002
+# ************************************************************
+
+# ************************************************************
+# Pragmas
+# ************************************************************
+
+use strict;
+
+use Parser;
+
+use vars qw(@ISA);
+@ISA = qw(Parser);
+
+# ************************************************************
+# Data Section
+# ************************************************************
+
+my $mpt = 'mpt';
+
+# ************************************************************
+# Subroutine Section
+# ************************************************************
+
+sub new {
+ my($class, $inc) = @_;
+ my $self = Parser::new($class, $inc);
+
+ ## Set up the internal data members
+ $self->{'values'} = {};
+ $self->{'cindex'} = 0;
+ $self->{'current'} = [ $self->{'values'} ];
+ $self->{'realnames'} = {};
+
+ return $self;
+}
+
+
+sub parse_line {
+ my($self, $ih, $line) = @_;
+ my $status = 1;
+ my $errorString;
+ my $current = $self->{'current'};
+
+ if ($line eq '') {
+ }
+ elsif ($line =~ /^([\w\s\(\)\.]+)\s*{$/) {
+ ## Entering a new scope, we need to save the real name so that it can
+ ## be accessed at a later time.
+ my $rname = $1;
+ $rname =~ s/\s+$//;
+ my $name = lc($rname);
+ $self->{'realnames'}->{$name} = $rname;
+
+ ## Scopes are reentrant, so we only create a new map when we haven't
+ ## got one.
+ if (!defined $$current[$self->{'cindex'}]->{$name}) {
+ $$current[$self->{'cindex'}]->{$name} = {};
+ }
+
+ ## Keep track of the current scope
+ push(@$current, $$current[$self->{'cindex'}]->{$name});
+ $self->{'cindex'}++;
+ }
+ elsif ($line =~ /^}$/) {
+ ## Maintain the scope and make sure there aren't any unmatched
+ ## braces.
+ if ($self->{'cindex'} > 0) {
+ pop(@$current);
+ $self->{'cindex'}--;
+ }
+ else {
+ $status = 0;
+ $errorString = 'Unmatched curly brace';
+ }
+ }
+ elsif ($line =~ /^(\w+)\s*(\+=|=)\s*(.*)?/) {
+ ## Save the name, operation type and value.
+ my $name = lc($1);
+ my $op = $2;
+ my $value = $3;
+
+ ## Turn the value into an array
+ if (defined $value) {
+ $value = $self->create_array($value);
+ }
+ else {
+ $value = [];
+ }
+
+ ## Store the value
+ if ($op eq '+=' && defined $$current[$self->{'cindex'}]->{$name}) {
+ push(@{$$current[$self->{'cindex'}]->{$name}}, @$value);
+ }
+ else {
+ $$current[$self->{'cindex'}]->{$name} = $value;
+ }
+ }
+ elsif ($line =~ /^conditional_include\s+"([\w\s\-\+\/\\\.]+)"$/) {
+ ## Search for the include template file. If it does not exist, we
+ ## don't complain. It's likely that these sort of files won't exist.
+ my $file = $self->search_include_path("$1.$mpt");
+ if (defined $file) {
+ ## Process the file making sure to restore the line number seting
+ ## when we get done.
+ my $ol = $self->get_line_number();
+ ($status, $errorString) = $self->read_file($file);
+ $self->set_line_number($ol);
+ }
+ }
+ else {
+ $status = 0;
+ $errorString = "Unrecognized line: $line";
+ }
+
+ return $status, $errorString;
+}
+
+
+sub get_value {
+ ## All template names are case-insensitive.
+ my($self, $tag) = @_;
+ return $self->{'values'}->{lc($tag)};
+}
+
+
+sub get_realname {
+ ## Sometimes, we need to get back to the name retaining the case so we
+ ## access the hash map containing them.
+ my($self, $tag) = @_;
+ return $self->{'realnames'}->{lc($tag)};
+}
+
+
+1;