Fix internal Windows build
[WebKit-https.git] / Source / WebCore / css / makeSelectorPseudoClassAndCompatibilityElementMap.py
1 #!/usr/bin/env python
2 #
3 # Copyright (C) 2014 Apple Inc. All rights reserved.
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 APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 # THE POSSIBILITY OF SUCH DAMAGE.
25
26 import os
27 import sys
28
29
30 def enumerablePseudoType(stringPseudoType):
31     output = ['CSSSelector::PseudoClass']
32
33     if stringPseudoType.endswith('('):
34         stringPseudoType = stringPseudoType[:-1]
35
36     webkitPrefix = '-webkit-'
37     if (stringPseudoType.startswith(webkitPrefix)):
38         stringPseudoType = stringPseudoType[len(webkitPrefix):]
39
40     khtmlPrefix = '-khtml-'
41     if (stringPseudoType.startswith(khtmlPrefix)):
42         stringPseudoType = stringPseudoType[len(khtmlPrefix):]
43
44     substring_start = 0
45     next_dash_position = stringPseudoType.find('-')
46     while (next_dash_position != -1):
47         output.append(stringPseudoType[substring_start].upper())
48         output.append(stringPseudoType[substring_start + 1:next_dash_position])
49         substring_start = next_dash_position + 1
50         next_dash_position = stringPseudoType.find('-', substring_start)
51
52     output.append(stringPseudoType[substring_start].upper())
53     output.append(stringPseudoType[substring_start + 1:])
54     return ''.join(output)
55
56
57 def expand_ifdef_condition(condition):
58     return condition.replace('(', '_').replace(')', '')
59
60 output_file = open('SelectorPseudoClassAndCompatibilityElementMap.gperf', 'w')
61
62 output_file.write("""
63 %{
64 /*
65  * Copyright (C) 2014 Apple Inc. All rights reserved.
66  *
67  * Redistribution and use in source and binary forms, with or without
68  * modification, are permitted provided that the following conditions
69  * are met:
70  * 1. Redistributions of source code must retain the above copyright
71  *    notice, this list of conditions and the following disclaimer.
72  * 2. Redistributions in binary form must reproduce the above copyright
73  *    notice, this list of conditions and the following disclaimer in the
74  *    documentation and/or other materials provided with the distribution.
75  *
76  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
77  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
78  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
79  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
80  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
81  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
82  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
83  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
84  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
85  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
86  * THE POSSIBILITY OF SUCH DAMAGE.
87  */
88
89 // This file is automatically generated from SelectorPseudoTypeMap.in by makeprop, do not edit by hand.
90
91 #include "config.h"
92 #include "SelectorPseudoTypeMap.h"
93
94 #include "CSSParserValues.h"
95
96 #if defined(__clang__)
97 #pragma clang diagnostic push
98 #pragma clang diagnostic ignored "-Wunknown-pragmas"
99 #pragma clang diagnostic ignored "-Wdeprecated-register"
100 #pragma clang diagnostic ignored "-Wimplicit-fallthrough"
101 #endif
102
103 namespace WebCore {
104
105 struct SelectorPseudoClassOrCompatibilityPseudoElementEntry {
106     const char* name;
107     PseudoClassOrCompatibilityPseudoElement pseudoTypes;
108 };
109
110 %}
111 %struct-type
112 %define initializer-suffix ,{CSSSelector::PseudoClassUnknown,CSSSelector::PseudoElementUnknown}
113 %define class-name SelectorPseudoClassAndCompatibilityElementMapHash
114 %omit-struct-type
115 %language=C++
116 %readonly-tables
117 %global-table
118 %ignore-case
119 %compare-strncmp
120 %enum
121
122 struct SelectorPseudoClassOrCompatibilityPseudoElementEntry;
123
124 %%
125 """)
126
127 webcore_defines = [i.strip() for i in sys.argv[-1].split(' ')]
128
129 longest_keyword = 0
130
131 ignore_until_endif = False
132 input_file = open(sys.argv[1], 'r')
133 for line in input_file:
134     line = line.strip()
135     if not line:
136         continue
137
138     if line.startswith('#if '):
139         condition = line[4:].strip()
140         if expand_ifdef_condition(condition) not in webcore_defines:
141             ignore_until_endif = True
142         continue
143
144     if line.startswith('#endif'):
145         ignore_until_endif = False
146         continue
147
148     if ignore_until_endif:
149         continue
150
151     keyword_definition = line.split(',')
152     if len(keyword_definition) == 1:
153         keyword = keyword_definition[0].strip()
154         output_file.write('"%s", {%s, CSSSelector::PseudoElementUnknown}\n' % (keyword, enumerablePseudoType(keyword)))
155     else:
156         output_file.write('"%s", {CSSSelector::%s, CSSSelector::%s}\n' % (keyword_definition[0].strip(), keyword_definition[1].strip(), keyword_definition[2].strip()))
157
158     longest_keyword = max(longest_keyword, len(keyword))
159
160 output_file.write("""%%
161
162 static inline const SelectorPseudoClassOrCompatibilityPseudoElementEntry* parsePseudoClassAndCompatibilityElementString(const LChar* characters, unsigned length)
163 {
164     return SelectorPseudoClassAndCompatibilityElementMapHash::in_word_set(reinterpret_cast<const char*>(characters), length);
165 }""")
166
167 output_file.write("""
168
169 static inline const SelectorPseudoClassOrCompatibilityPseudoElementEntry* parsePseudoClassAndCompatibilityElementString(const UChar* characters, unsigned length)
170 {
171     const unsigned maxKeywordLength = %s;
172     LChar buffer[maxKeywordLength];
173     if (length > maxKeywordLength)
174         return nullptr;
175
176     for (unsigned i = 0; i < length; ++i) {
177         UChar character = characters[i];
178         if (character & ~0xff)
179             return nullptr;
180
181         buffer[i] = static_cast<LChar>(character);
182     }
183     return parsePseudoClassAndCompatibilityElementString(buffer, length);
184 }
185 """ % longest_keyword)
186
187 output_file.write("""
188 PseudoClassOrCompatibilityPseudoElement parsePseudoClassAndCompatibilityElementString(const CSSParserString& pseudoTypeString)
189 {
190     const SelectorPseudoClassOrCompatibilityPseudoElementEntry* entry;
191     if (pseudoTypeString.is8Bit())
192         entry = parsePseudoClassAndCompatibilityElementString(pseudoTypeString.characters8(), pseudoTypeString.length());
193     else
194         entry = parsePseudoClassAndCompatibilityElementString(pseudoTypeString.characters16(), pseudoTypeString.length());
195
196     if (entry)
197         return entry->pseudoTypes;
198     return { CSSSelector::PseudoClassUnknown, CSSSelector::PseudoElementUnknown };
199 }
200
201 } // namespace WebCore
202
203 #if defined(__clang__)
204 #pragma clang diagnostic pop
205 #endif
206
207 """)
208 output_file.close()
209
210 gperf_command = sys.argv[2]
211 if 'GPERF' in os.environ:
212     gperf_command = os.environ['GPERF']
213
214 gperf_return = os.system("%s --key-positions=\"*\" -m 10 -s 2 SelectorPseudoClassAndCompatibilityElementMap.gperf --output-file=SelectorPseudoClassAndCompatibilityElementMap.cpp" % gperf_command)
215 if gperf_return != 0:
216     print("Error when generating SelectorPseudoClassAndCompatibilityElementMap.cpp from SelectorPseudoClassAndCompatibilityElementMap.gperf :(")
217     sys.exit(gperf_return)