blob: cafdf229b26e90fb39e8ff5ed64079ed6e52b9f5 [file] [log] [blame]
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001#!/usr/bin/perl -w
2
3# Copyright (C) 2011 Adam Barth <abarth@webkit.org>
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11# notice, this list of conditions and the following disclaimer in the
12# documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY
15# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25#
26
27use strict;
28
29use Config;
30use Getopt::Long;
31use File::Path;
32use File::Spec;
33use IO::File;
34use InFilesParser;
35
36require Config;
37
38package InFilesCompiler;
39
40my $inputFile = "";
41my $outputDir = ".";
42my $defaultItemFactory;
43
44my %parsedItems;
45my %parsedItemPaths;
46my %parsedParameters;
47
48sub itemHandler($$$)
49{
50 my ($itemName, $property, $value) = @_;
51
52 if ($itemName =~ /\//) {
53 my ($dirname, $basename) = $itemName =~ /^(.*)\/(.*)/;
54 $itemName = $basename;
55 $parsedItemPaths{$itemName} = $dirname;
56 }
57
58 $parsedItems{$itemName} = { &$defaultItemFactory($itemName) } if !defined($parsedItems{$itemName});
59
60 return unless $property;
61
62 die "Unknown property $property for $itemName\n" if !defined($parsedItems{$itemName}{$property});
63 $parsedItems{$itemName}{$property} = $value;
64}
65
66sub parameterHandler($$)
67{
68 my ($parameter, $value) = @_;
69
70 die "Unknown parameter $parameter\n" if !defined($parsedParameters{$parameter});
71 $parsedParameters{$parameter} = $value;
72}
73
74sub new()
75{
76 my $object = shift;
77 my $reference = { };
78
79 my $defaultParametersRef = shift;
80 %parsedParameters = %{ $defaultParametersRef };
81 $defaultItemFactory = shift;
82
83 %parsedItems = ();
84
85 bless($reference, $object);
86 return $reference;
87}
88
89sub initializeFromCommandLine()
90{
91 ::GetOptions(
92 'input=s' => \$inputFile,
93 'outputDir=s' => \$outputDir,
94 );
95
96 die "You must specify --input <file>" unless length($inputFile);
97
98 ::mkpath($outputDir);
99
100 # FIXME: Should we provide outputDir via an accessor?
101 return $outputDir;
102}
103
104sub compile()
105{
106 my $object = shift;
107 my $generateCode = shift;
108
109 my $file = new IO::File;
110 open($file, $inputFile) or die "Failed to open file: $!";
111
112 my $InParser = InFilesParser->new();
113 $InParser->parse($file, \&parameterHandler, \&itemHandler);
114
115 close($file);
116 die "Failed to read from file: $inputFile" if (keys %parsedItems == 0);
117
118 &$generateCode(\%parsedParameters, \%parsedItems, \%parsedItemPaths);
119}
120
121sub license()
122{
123 return "/*
124 * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT.
125 *
126 * Copyright (C) 2011 Google Inc. All rights reserved.
127 *
128 * Redistribution and use in source and binary forms, with or without
129 * modification, are permitted provided that the following conditions
130 * are met:
131 * 1. Redistributions of source code must retain the above copyright
132 * notice, this list of conditions and the following disclaimer.
133 * 2. Redistributions in binary form must reproduce the above copyright
134 * notice, this list of conditions and the following disclaimer in the
135 * documentation and/or other materials provided with the distribution.
136 *
137 * THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY
138 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
139 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
140 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
141 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
142 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
143 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
144 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
145 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
146 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
147 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
148 */
149
150";
151}
152
153sub interfaceForItem($)
154{
155 my $object = shift;
156 my $itemName = shift;
157
158 my $interfaceName = $parsedItems{$itemName}{"interfaceName"};
159 $interfaceName = $itemName unless $interfaceName;
160
161 return $interfaceName;
162}
163
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100164
165sub preferredConditional()
166{
167 my $object = shift;
168 my $conditional = shift;
169
170 my @conditionals = split('\\|', $conditional);
171 return $conditionals[0];
172}
173
174sub conditionalStringFromAttributeValue()
175{
176 my $object = shift;
177 my $conditional = shift;
178
179 return "ENABLE(" . join(') || ENABLE(', split('\\|', $conditional)) . ")";
180}
181
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001821;