| Index: tools/json_to_struct/element_generator.py | 
| =================================================================== | 
| --- tools/json_to_struct/element_generator.py	(revision 167795) | 
| +++ tools/json_to_struct/element_generator.py	(working copy) | 
| @@ -1,121 +0,0 @@ | 
| -# Copyright (c) 2012 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 json | 
| -import struct_generator | 
| - | 
| -def _JSONToCString16(json_string_literal): | 
| -  """Converts a JSON string literal to a C++ UTF-16 string literal. This is | 
| -  done by converting \\u#### to \\x####. | 
| -  """ | 
| -  c_string_literal = json_string_literal | 
| -  escape_index = c_string_literal.find('\\') | 
| -  while escape_index > 0: | 
| -    if c_string_literal[escape_index + 1] == 'u': | 
| -      # We close the C string literal after the 4 hex digits and reopen it right | 
| -      # after, otherwise the Windows compiler will sometimes try to get more | 
| -      # than 4 characters in the hex string. | 
| -      c_string_literal = (c_string_literal[0:escape_index + 1] + 'x' + | 
| -          c_string_literal[escape_index + 2:escape_index + 6] + '" L"' + | 
| -          c_string_literal[escape_index + 6:]) | 
| -    escape_index = c_string_literal.find('\\', escape_index + 6) | 
| -  return c_string_literal | 
| - | 
| -def _GenerateString(content, lines): | 
| -  """Generates an UTF-8 string to be included in a static structure initializer. | 
| -  If content is not specified, uses NULL. | 
| -  """ | 
| -  if content is None: | 
| -    lines.append('  NULL,') | 
| -  else: | 
| -    # json.dumps quotes the string and escape characters as required. | 
| -    lines.append('  %s,' % json.dumps(content)) | 
| - | 
| -def _GenerateString16(content, lines): | 
| -  """Generates an UTF-16 string to be included in a static structure | 
| -  initializer. If content is not specified, uses NULL. | 
| -  """ | 
| -  if content is None: | 
| -    lines.append('  NULL,') | 
| -  else: | 
| -    # json.dumps quotes the string and escape characters as required. | 
| -    lines.append('  L%s,' % _JSONToCString16(json.dumps(content))) | 
| - | 
| -def _GenerateArray(field_info, content, lines): | 
| -  """Generates an array to be included in a static structure initializer. If | 
| -  content is not specified, uses NULL. The array is assigned to a temporary | 
| -  variable which is initialized before the structure. | 
| -  """ | 
| -  if content is None: | 
| -    lines.append('  NULL,') | 
| -    lines.append('  0,')  # Size of the array. | 
| -    return | 
| - | 
| -  # Create a new array variable and use it in the structure initializer. | 
| -  # This prohibits nested arrays. Add a clash detection and renaming mechanism | 
| -  # to solve the problem. | 
| -  var = 'array_%s' % field_info['field']; | 
| -  lines.append('  %s,' % var) | 
| -  lines.append('  %s,' % len(content))  # Size of the array. | 
| -  # Generate the array content. | 
| -  array_lines = [] | 
| -  field_info['contents']['field'] = var; | 
| -  array_lines.append(struct_generator.GenerateField( | 
| -                     field_info['contents']) + '[] = {') | 
| -  for subcontent in content: | 
| -    GenerateFieldContent(field_info['contents'], subcontent, array_lines) | 
| -  array_lines.append('};') | 
| -  # Prepend the generated array so it is initialized before the structure. | 
| -  lines.reverse() | 
| -  array_lines.reverse() | 
| -  lines.extend(array_lines) | 
| -  lines.reverse() | 
| - | 
| -def GenerateFieldContent(field_info, content, lines): | 
| -  """Generate the content of a field to be included in the static structure | 
| -  initializer. If the field's content is not specified, uses the default value | 
| -  if one exists. | 
| -  """ | 
| -  if content is None: | 
| -    content = field_info.get('default', None) | 
| -  type = field_info['type'] | 
| -  if type == 'int' or type == 'enum': | 
| -    lines.append('  %s,' % content) | 
| -  elif type == 'string': | 
| -    _GenerateString(content, lines) | 
| -  elif type == 'string16': | 
| -    _GenerateString16(content, lines) | 
| -  elif type == 'array': | 
| -    _GenerateArray(field_info, content, lines) | 
| -  else: | 
| -    raise RuntimeError('Unknown field type "%s"' % type) | 
| - | 
| -def GenerateElement(type_name, schema, element_name, element): | 
| -  """Generate the static structure initializer for one element. | 
| -  """ | 
| -  lines = []; | 
| -  lines.append('const %s %s = {' % (type_name, element_name)); | 
| -  for field_info in schema: | 
| -    content = element.get(field_info['field'], None) | 
| -    if (content == None and not field_info.get('optional', False)): | 
| -      raise RuntimeError('Mandatory field "%s" omitted in element "%s".' % | 
| -                         (field_info['field'], element_name)) | 
| -    GenerateFieldContent(field_info, content, lines) | 
| -  lines.append('};') | 
| -  return '\n'.join(lines) | 
| - | 
| -def GenerateElements(type_name, schema, description): | 
| -  """Generate the static structure initializer for all the elements in the | 
| -  description['elements'] dictionary, as well as for any variables in | 
| -  description['int_variables']. | 
| -  """ | 
| -  result = []; | 
| -  for var_name, value in description.get('int_variables', {}).items(): | 
| -    result.append('const int %s = %s;' % (var_name, value)) | 
| -  result.append('') | 
| - | 
| -  for element_name, element in description.get('elements', {}).items(): | 
| -    result.append(GenerateElement(type_name, schema, element_name, element)) | 
| -    result.append('') | 
| -  return '\n'.join(result) | 
|  |