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

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.xreadlines():
    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>

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wdeprecated-register"
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#endif

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__)
#pragma clang diagnostic pop
#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

#endif // HTTPHeaderNames_h
''')
header_file.close()

gperf = os.getenv('GPERF') or sys.argv[2]

if os.system('%s --key-positions="*" -D -n -s 2 HTTPHeaderNames.gperf --output-file=HTTPHeaderNames.cpp' % gperf):
    sys.stderr.write('Failed to run gperf.')
    exit(1)
