#!/usr/bin/env python

# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import in_generator
import sys
import os

module_basename = os.path.basename(__file__)
module_pyname = os.path.splitext(module_basename)[0] + '.py'

CPP_TEMPLATE = """
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Auto-generated by {module_pyname}

const MediaQueryTokenizer::CodePoint MediaQueryTokenizer::codePoints[{array_size}] = {{
{token_lines}
}};
const unsigned codePointsNumber = {array_size};
"""


def token_type(i):
    codepoints = {'(': 'leftParenthesis',
                  ')': 'rightParenthesis',
                  '[': 'leftBracket',
                  ']': 'rightBracket',
                  '{': 'leftBrace',
                  '}': 'rightBrace',
                  '+': 'plusOrFullStop',
                  '.': 'plusOrFullStop',
                  '-': 'hyphenMinus',
                  '*': 'asterisk',
                  ',': 'comma',
                  '/': 'solidus',
                  '\\': 'reverseSolidus',
                  ':': 'colon',
                  ';': 'semiColon',
                  }
    whitespace = '\n\r\t\f '
    quotes = '"\''
    c = chr(i)
    if c in whitespace:
        return 'whiteSpace'
    if c.isdigit():
        return 'asciiDigit'
    if c.isalpha() or c == '_':
        return 'nameStart'
    if c in quotes:
        return 'stringStart'
    if i == 0:
        return 'endOfFile'
    return codepoints.get(c)


class MakeMediaQueryTokenizerCodePointsWriter(in_generator.Writer):
    defaults = {
        'Conditional': None,
        'RuntimeEnabled': None,
        'ImplementedAs': None,
    }
    filters = {
    }
    default_parameters = {
        'namespace': '',
        'export': '',
    }

    def __init__(self, in_file_path):
        super(MakeMediaQueryTokenizerCodePointsWriter, self).__init__(in_file_path)

        self._outputs = {
            ('MediaQueryTokenizerCodepoints.cpp'): self.generate,
        }
        self._template_context = {
            'namespace': '',
            'export': '',
        }

    def generate(self):
        array_size = 128  # SCHAR_MAX + 1
        token_lines = ['    &MediaQueryTokenizer::%s,' % token_type(i)
                        if token_type(i) else '    0,'
                        for i in range(array_size)]
        return CPP_TEMPLATE.format(array_size=array_size, token_lines='\n'.join(token_lines), module_pyname=module_pyname)

if __name__ == '__main__':
    in_generator.Maker(MakeMediaQueryTokenizerCodePointsWriter).main(sys.argv)
