summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/scripts/InFilesParser.pm
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
commit1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch)
tree4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/bindings/scripts/InFilesParser.pm
parent9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff)
downloadexternal_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.zip
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.gz
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.bz2
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'WebCore/bindings/scripts/InFilesParser.pm')
-rw-r--r--WebCore/bindings/scripts/InFilesParser.pm140
1 files changed, 140 insertions, 0 deletions
diff --git a/WebCore/bindings/scripts/InFilesParser.pm b/WebCore/bindings/scripts/InFilesParser.pm
new file mode 100644
index 0000000..89664ed
--- /dev/null
+++ b/WebCore/bindings/scripts/InFilesParser.pm
@@ -0,0 +1,140 @@
+#!/usr/bin/perl -w
+
+# Copyright (C) 2008 Julien Chaffraix <jchaffraix@webkit.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+use strict;
+
+package InFilesParser;
+
+my $isParsingCommonParameters;
+my $hasStartedParsing;
+
+# Helper functions
+
+sub trimComment
+{
+ my $string = shift;
+ $string =~ s/#.+$//;
+ chomp($string);
+ return $string;
+}
+
+sub trimWS
+{
+ my $string = shift;
+ $string =~ s/^\s+//;
+ $string =~ s/\s+$//;
+ chomp($string);
+ return $string;
+}
+
+sub trimQuoteAndWS
+{
+ my $string = shift;
+ $string =~ s/\"([^\"]+)\"/$1/;
+ return trimWS($string);
+}
+
+# Default constructor
+
+sub new
+{
+ my $object = shift;
+ my $reference = { };
+
+ # Initialize the parser.
+ $isParsingCommonParameters = 1;
+ $hasStartedParsing = 0;
+
+ bless($reference, $object);
+ return $reference;
+}
+
+# parse take 3 attributes:
+# - the filestream to read from (the caller has to open / close it).
+# - the commonParameterHandler called when parsing the first part of the file with the parameter and the value.
+# - the perTagHandler called for each optional parameter with the element name, the parameter and its value.
+# If no parameter were provided, it is called once with an empty parameter and value.
+sub parse($)
+{
+ my $object = shift;
+ my $fileStream = shift; # IO::File only
+ my $commonParameterHandler = shift;
+ my $perTagHandler = shift;
+
+ foreach (<$fileStream>) {
+ # Empty line, change from common parameter part
+ # to per tag part if we have started parsing.
+ if (/^$/) {
+ if ($hasStartedParsing) {
+ $isParsingCommonParameters = 0;
+ }
+ next;
+ }
+
+ # There may be a few empty lines at the beginning of the file
+ # so detect the first non empty line which starts the common
+ # parameters part.
+ $hasStartedParsing = 1;
+
+ if (/^#/) {
+ next;
+ }
+
+ $_ = trimComment($_);
+
+ if ($isParsingCommonParameters) {
+ my ($name, $value) = split '=', $_;
+
+ $name = trimWS($name);
+ $value = trimQuoteAndWS($value);
+
+ &$commonParameterHandler($name, $value);
+ } else {
+ # Parsing per-tag parameters.
+
+ # Split the tag name ($1) from the optionnal parameter(s) ($2)
+ /^(\S+)\s*(.*)$/;
+ my $elementName = $1;
+
+ if ($2) {
+ my @options = split "," , $2;
+ my ($option, $value);
+ for (my $i = 0; $i < @options; ++$i) {
+ ($option, $value) = split "=", $options[$i];
+ $option = trimWS($option);
+ $value = trimQuoteAndWS($value);
+
+ &$perTagHandler($elementName, $option, $value);
+ }
+ } else {
+ # No parameter was given so call it with empty strings.
+ &$perTagHandler($elementName, "", "");
+ }
+ }
+ }
+}
+
+1;