OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2012 The Chromium Authors. All rights reserved. | 2 # Copyright 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # Format for the JSON schema file: | 6 # Format for the JSON schema file: |
7 # { | 7 # { |
8 # "type_name": "DesiredCStructName", | 8 # "type_name": "DesiredCStructName", |
9 # "headers": [ // Optional list of headers to be included by the .h. | 9 # "headers": [ // Optional list of headers to be included by the .h. |
10 # "path/to/header.h" | 10 # "path/to/header.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 f.write('} // namespace %s\n' % namespace) | 176 f.write('} // namespace %s\n' % namespace) |
177 | 177 |
178 def _Load(filename): | 178 def _Load(filename): |
179 """Loads a JSON file int a Python object and return this object. | 179 """Loads a JSON file int a Python object and return this object. |
180 """ | 180 """ |
181 # TODO(beaudoin): When moving to Python 2.7 use object_pairs_hook=OrderedDict. | 181 # TODO(beaudoin): When moving to Python 2.7 use object_pairs_hook=OrderedDict. |
182 with open(filename, 'r') as handle: | 182 with open(filename, 'r') as handle: |
183 result = json.loads(json_comment_eater.Nom(handle.read())) | 183 result = json.loads(json_comment_eater.Nom(handle.read())) |
184 return result | 184 return result |
185 | 185 |
| 186 def GenerateStruct(basepath, output_root, namespace, schema, description, |
| 187 description_filename, schema_filename): |
| 188 """Generates a C++ struct from a JSON description. |
| 189 |
| 190 Args: |
| 191 basepath: The base directory in which files are generated. |
| 192 output_root: The filename and path, relative to basepath, of the file to |
| 193 create, without an extension. |
| 194 namespace: A string corresponding to the C++ namespace to use. |
| 195 schema: A dict containing the schema. See comment at the top of this file. |
| 196 description: A dict containing the description. See comment at the top of |
| 197 this file. |
| 198 description_filename: The description filename. This is added to the |
| 199 header of the outputted files. |
| 200 schema_filename: The schema filename. This is added to the header of the |
| 201 outputted files. |
| 202 """ |
| 203 head = HEAD % (datetime.now().year, schema_filename, description_filename) |
| 204 _GenerateH(basepath, output_root, head, namespace, schema, description) |
| 205 _GenerateCC(basepath, output_root, head, namespace, schema, description) |
| 206 |
186 if __name__ == '__main__': | 207 if __name__ == '__main__': |
187 parser = optparse.OptionParser( | 208 parser = optparse.OptionParser( |
188 description='Generates an C++ array of struct from a JSON description.', | 209 description='Generates an C++ array of struct from a JSON description.', |
189 usage='usage: %prog [option] -s schema description') | 210 usage='usage: %prog [option] -s schema description') |
190 parser.add_option('-b', '--destbase', | 211 parser.add_option('-b', '--destbase', |
191 help='base directory of generated files.') | 212 help='base directory of generated files.') |
192 parser.add_option('-d', '--destdir', | 213 parser.add_option('-d', '--destdir', |
193 help='directory to output generated files, relative to destbase.') | 214 help='directory to output generated files, relative to destbase.') |
194 parser.add_option('-n', '--namespace', | 215 parser.add_option('-n', '--namespace', |
195 help='C++ namespace for generated files. e.g search_providers.') | 216 help='C++ namespace for generated files. e.g search_providers.') |
196 parser.add_option('-s', '--schema', help='path to the schema file, ' | 217 parser.add_option('-s', '--schema', help='path to the schema file, ' |
197 'mandatory.') | 218 'mandatory.') |
| 219 parser.add_option('-o', '--output', help='output filename, ') |
198 (opts, args) = parser.parse_args() | 220 (opts, args) = parser.parse_args() |
199 | 221 |
200 if not opts.schema: | 222 if not opts.schema: |
201 parser.error('You must specify a --schema.') | 223 parser.error('You must specify a --schema.') |
202 | 224 |
203 description_filename = os.path.normpath(args[0]) | 225 description_filename = os.path.normpath(args[0]) |
204 root, ext = os.path.splitext(description_filename) | 226 root, ext = os.path.splitext(description_filename) |
205 shortroot = os.path.split(root)[1] | 227 shortroot = opts.output if opts.output else os.path.split(root)[1] |
206 if opts.destdir: | 228 if opts.destdir: |
207 output_root = os.path.join(os.path.normpath(opts.destdir), shortroot) | 229 output_root = os.path.join(os.path.normpath(opts.destdir), shortroot) |
208 else: | 230 else: |
209 output_root = shortroot | 231 output_root = shortroot |
210 | 232 |
211 if opts.destbase: | 233 if opts.destbase: |
212 basepath = os.path.normpath(opts.destbase) | 234 basepath = os.path.normpath(opts.destbase) |
213 else: | 235 else: |
214 basepath = '' | 236 basepath = '' |
215 | 237 |
216 schema = _Load(opts.schema) | 238 schema = _Load(opts.schema) |
217 description = _Load(description_filename) | 239 description = _Load(description_filename) |
218 | 240 GenerateStruct(basepath, output_root, opts.namespace, schema, description, |
219 head = HEAD % (datetime.now().year, opts.schema, description_filename) | 241 description_filename, opts.schema) |
220 _GenerateH(basepath, output_root, head, opts.namespace, schema, description) | |
221 _GenerateCC(basepath, output_root, head, opts.namespace, schema, description) | |
OLD | NEW |