#!/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)
