| #!/usr/bin/env python |
| # Copyright (c) 2014 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * 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. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "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 THE COPYRIGHT |
| # OWNER 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. |
| |
| import os |
| import sys |
| import subprocess |
| |
| program_name = os.path.basename(__file__) |
| if len(sys.argv) < 2: |
| sys.stderr.write("Usage: %s INPUT_FILE GPERF_EXECUTABLE\n" % program_name) |
| exit(1) |
| |
| input_path = sys.argv[1] |
| input_file = open(input_path) |
| |
| http_header_name_to_id = { } |
| http_header_names = [] |
| |
| for line in input_file: |
| http_header_name = line.strip() |
| if not http_header_name or http_header_name[:2] == '//': |
| continue |
| |
| http_header_name_to_id[http_header_name] = http_header_name.replace('-', '').replace('.', '') |
| |
| http_header_names.append(http_header_name) |
| |
| input_file.close() |
| |
| http_header_names.sort() |
| |
| gperf_file = open('HTTPHeaderNames.gperf', 'w') |
| gperf_file.write(''' |
| %{ |
| /* |
| * Copyright (C) 2014 Apple Inc. All rights reserved. |
| * |
| * 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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. |
| */ |
| |
| /// This file is generated by create-http-header-name-table, do not edit. |
| |
| #include "config.h" |
| #include "HTTPHeaderNames.h" |
| |
| #include <wtf/text/StringView.h> |
| |
| IGNORE_WARNINGS_BEGIN("implicit-fallthrough") |
| |
| // Older versions of gperf like to use the `register` keyword. |
| #define register |
| |
| namespace WebCore { |
| |
| static const struct HeaderNameString { |
| const char* const name; |
| unsigned length; |
| } headerNameStrings[] = { |
| ''') |
| |
| for http_header_name in http_header_names: |
| gperf_file.write(' { "%s", %u },\n' % (http_header_name, len(http_header_name))) |
| |
| gperf_file.write('};\n\n') |
| |
| gperf_file.write(''' |
| %} |
| |
| %language=C++ |
| %readonly-tables |
| %global-table |
| %compare-strncmp |
| %ignore-case |
| %struct-type |
| struct HeaderNameHashEntry { |
| const char* name; |
| HTTPHeaderName headerName; |
| }; |
| %define class-name HTTPHeaderNamesHash |
| %define lookup-function-name findHeaderNameImpl |
| %define hash-function-name header_name_hash_function |
| %define word-array-name header_name_wordlist |
| %enum |
| %% |
| ''') |
| |
| for http_header_name in http_header_names: |
| gperf_file.write('%s, HTTPHeaderName::%s\n' % (http_header_name, http_header_name_to_id[http_header_name])) |
| |
| gperf_file.write('''%% |
| bool findHTTPHeaderName(StringView stringView, HTTPHeaderName& headerName) |
| { |
| unsigned length = stringView.length(); |
| if (length > maxHTTPHeaderNameLength || length < minHTTPHeaderNameLength) |
| return false; |
| |
| if (stringView.is8Bit()) { |
| if (auto nameAndString = HTTPHeaderNamesHash::findHeaderNameImpl(reinterpret_cast<const char*>(stringView.characters8()), length)) { |
| headerName = nameAndString->headerName; |
| return true; |
| } |
| } else { |
| LChar characters[maxHTTPHeaderNameLength]; |
| for (unsigned i = 0; i < length; ++i) { |
| UChar character = stringView.characters16()[i]; |
| if (!isASCII(character)) |
| return false; |
| |
| characters[i] = static_cast<LChar>(character); |
| } |
| |
| if (auto nameAndString = HTTPHeaderNamesHash::findHeaderNameImpl(reinterpret_cast<const char*>(characters), length)) { |
| headerName = nameAndString->headerName; |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| StringView httpHeaderNameString(HTTPHeaderName headerName) |
| { |
| ASSERT(static_cast<unsigned>(headerName) < numHTTPHeaderNames); |
| |
| const auto& name = headerNameStrings[static_cast<unsigned>(headerName)]; |
| |
| return StringView { reinterpret_cast<const LChar*>(name.name), static_cast<unsigned>(name.length) }; |
| } |
| |
| } // namespace WebCore |
| |
| #if defined(__clang__) |
| IGNORE_WARNINGS_END |
| #endif |
| ''') |
| |
| gperf_file.close() |
| |
| header_file = open('HTTPHeaderNames.h', 'w') |
| header_file.write(''' |
| /* |
| * Copyright (C) 2014 Apple Inc. All rights reserved. |
| * |
| * 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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. |
| */ |
| |
| /// This file is generated by create-http-header-name-table, do not edit. |
| |
| #ifndef HTTPHeaderNames_h |
| #define HTTPHeaderNames_h |
| |
| #include <wtf/Forward.h> |
| |
| namespace WebCore { |
| |
| enum class HTTPHeaderName { |
| ''') |
| |
| for http_header_name in http_header_names: |
| header_file.write(' %s,\n' % http_header_name_to_id[http_header_name]) |
| |
| header_file.write('};\n\n') |
| header_file.write('const unsigned numHTTPHeaderNames = %u;\n' % len(http_header_names)); |
| header_file.write('const size_t minHTTPHeaderNameLength = %u;\n' % len(min(http_header_names, key=len))); |
| header_file.write('const size_t maxHTTPHeaderNameLength = %u;\n' % len(max(http_header_names, key=len))); |
| header_file.write(''' |
| bool findHTTPHeaderName(StringView, HTTPHeaderName&); |
| WEBCORE_EXPORT StringView httpHeaderNameString(HTTPHeaderName); |
| |
| } // namespace WebCore |
| |
| namespace WTF { |
| |
| template<> struct EnumTraits<WebCore::HTTPHeaderName> { |
| using values = EnumValues< |
| WebCore::HTTPHeaderName, |
| ''') |
| |
| is_first = True |
| for http_header_name in http_header_names: |
| if is_first: |
| is_first = False |
| else: |
| header_file.write(',\n') |
| |
| header_file.write(' WebCore::HTTPHeaderName::%s' % http_header_name_to_id[http_header_name]) |
| |
| header_file.write(''' |
| >; |
| }; |
| |
| } // namespace WTF |
| |
| #endif // HTTPHeaderNames_h |
| ''') |
| header_file.close() |
| |
| gperf = os.getenv('GPERF') or sys.argv[2] |
| |
| if subprocess.call([gperf, '--key-positions=*', '-D', '-n', '-s', '2', 'HTTPHeaderNames.gperf', '--output-file=HTTPHeaderNames.cpp']) != 0: |
| sys.stderr.write('Failed to run gperf.') |
| exit(1) |