diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
commit | 1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch) | |
tree | 4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/bindings/scripts/InFilesParser.pm | |
parent | 9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff) | |
download | external_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.pm | 140 |
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; |