| Index: tools/json_to_struct/element_generator.py
|
| diff --git a/tools/json_to_struct/element_generator.py b/tools/json_to_struct/element_generator.py
|
| index 20d3069a1c07a674e1be8b7e42b1fd24286d95b0..e34753294e3be067a71387cb08d502941df15642 100644
|
| --- a/tools/json_to_struct/element_generator.py
|
| +++ b/tools/json_to_struct/element_generator.py
|
| @@ -22,42 +22,54 @@ def _JSONToCString16(json_string_literal):
|
| escape_index = c_string_literal.find('\\', escape_index + 6)
|
| return c_string_literal
|
|
|
| -def _GenerateString(content, lines):
|
| +def _GenerateString(content, lines, indent=' '):
|
| """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,')
|
| + lines.append(indent + 'NULL,')
|
| else:
|
| # json.dumps quotes the string and escape characters as required.
|
| - lines.append(' %s,' % json.dumps(content))
|
| + lines.append(indent + '%s,' % json.dumps(content))
|
|
|
| -def _GenerateString16(content, lines):
|
| +def _GenerateString16(content, lines, indent=' '):
|
| """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,')
|
| + lines.append(indent + 'NULL,')
|
| else:
|
| # json.dumps quotes the string and escape characters as required.
|
| - lines.append(' L%s,' % _JSONToCString16(json.dumps(content)))
|
| + lines.append(indent + 'L%s,' % _JSONToCString16(json.dumps(content)))
|
|
|
| -def _GenerateArray(element_name, field_info, content, lines):
|
| +def _GenerateArrayVariableName(element_name, field_name, field_name_count):
|
| + # Generates a unique variable name for an array variable.
|
| + var = 'array_%s_%s' % (element_name, field_name)
|
| + if var not in field_name_count:
|
| + field_name_count[var] = 0
|
| + return var
|
| + new_var = '%s_%d' % (var, field_name_count[var])
|
| + field_name_count[var] += 1
|
| + return new_var
|
| +
|
| +def _GenerateArray(element_name, field_info, content, lines, indent,
|
| + field_name_count):
|
| """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.
|
| + lines.append(indent + 'NULL,')
|
| + lines.append(indent + '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_%s' % (element_name, field_info['field']);
|
| - lines.append(' %s,' % var)
|
| - lines.append(' %s,' % len(content)) # Size of the array.
|
| + var = _GenerateArrayVariableName(element_name, field_info['field'],
|
| + field_name_count)
|
| + lines.append(indent + '%s,' % var)
|
| + lines.append(indent + '%s,' % len(content)) # Size of the array.
|
| # Generate the array content.
|
| array_lines = []
|
| field_info['contents']['field'] = var;
|
| @@ -65,7 +77,7 @@ def _GenerateArray(element_name, field_info, content, lines):
|
| field_info['contents']) + '[] = {')
|
| for subcontent in content:
|
| GenerateFieldContent(element_name, field_info['contents'], subcontent,
|
| - array_lines)
|
| + array_lines, indent, field_name_count)
|
| array_lines.append('};')
|
| # Prepend the generated array so it is initialized before the structure.
|
| lines.reverse()
|
| @@ -73,7 +85,25 @@ def _GenerateArray(element_name, field_info, content, lines):
|
| lines.extend(array_lines)
|
| lines.reverse()
|
|
|
| -def GenerateFieldContent(element_name, field_info, content, lines):
|
| +def _GenerateStruct(element_name, field_info, content, lines, indent,
|
| + field_name_count):
|
| + """Generates a struct to be included in a static structure initializer. If
|
| + content is not specified, uses {0}.
|
| + """
|
| + if content is None:
|
| + lines.append(indent + '{0},')
|
| + return
|
| +
|
| + fields = field_info['fields']
|
| + lines.append(indent + '{')
|
| + for field in fields:
|
| + subcontent = content.get(field['field'])
|
| + GenerateFieldContent(element_name, field, subcontent, lines, ' ' + indent,
|
| + field_name_count)
|
| + lines.append(indent + '},')
|
| +
|
| +def GenerateFieldContent(element_name, field_info, content, lines, indent,
|
| + field_name_count):
|
| """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.
|
| @@ -82,17 +112,21 @@ def GenerateFieldContent(element_name, field_info, content, lines):
|
| content = field_info.get('default', None)
|
| type = field_info['type']
|
| if type == 'int' or type == 'enum':
|
| - lines.append(' %s,' % content)
|
| + lines.append('%s%s,' % (indent, content))
|
| elif type == 'string':
|
| - _GenerateString(content, lines)
|
| + _GenerateString(content, lines, indent)
|
| elif type == 'string16':
|
| - _GenerateString16(content, lines)
|
| + _GenerateString16(content, lines, indent)
|
| elif type == 'array':
|
| - _GenerateArray(element_name, field_info, content, lines)
|
| + _GenerateArray(element_name, field_info, content, lines, indent,
|
| + field_name_count)
|
| + elif type == 'struct':
|
| + _GenerateStruct(element_name, field_info, content, lines, indent,
|
| + field_name_count)
|
| else:
|
| raise RuntimeError('Unknown field type "%s"' % type)
|
|
|
| -def GenerateElement(type_name, schema, element_name, element):
|
| +def GenerateElement(type_name, schema, element_name, element, field_name_count):
|
| """Generate the static structure initializer for one element.
|
| """
|
| lines = [];
|
| @@ -102,11 +136,12 @@ def GenerateElement(type_name, schema, element_name, element):
|
| 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(element_name, field_info, content, lines)
|
| + GenerateFieldContent(element_name, field_info, content, lines, ' ',
|
| + field_name_count)
|
| lines.append('};')
|
| return '\n'.join(lines)
|
|
|
| -def GenerateElements(type_name, schema, description):
|
| +def GenerateElements(type_name, schema, description, field_name_count={}):
|
| """Generate the static structure initializer for all the elements in the
|
| description['elements'] dictionary, as well as for any variables in
|
| description['int_variables'].
|
| @@ -117,6 +152,7 @@ def GenerateElements(type_name, schema, description):
|
| result.append('')
|
|
|
| for element_name, element in description.get('elements', {}).items():
|
| - result.append(GenerateElement(type_name, schema, element_name, element))
|
| + result.append(GenerateElement(type_name, schema, element_name, element,
|
| + field_name_count))
|
| result.append('')
|
| return '\n'.join(result)
|
|
|