OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # | 2 # |
3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """ Generator for C style prototypes and definitions """ | 7 """ Generator for C style prototypes and definitions """ |
8 | 8 |
9 import glob | 9 import glob |
10 import os | 10 import os |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 if prefix: | 51 if prefix: |
52 prefix_lines = prefix.split('\n') | 52 prefix_lines = prefix.split('\n') |
53 # If both the prefix and comment start with a blank line ('*') remove | 53 # If both the prefix and comment start with a blank line ('*') remove |
54 # the extra one. | 54 # the extra one. |
55 if prefix_lines[0] == '*' and lines[0] == '*': | 55 if prefix_lines[0] == '*' and lines[0] == '*': |
56 lines = prefix_lines + lines[1:] | 56 lines = prefix_lines + lines[1:] |
57 else: | 57 else: |
58 lines = prefix_lines + lines; | 58 lines = prefix_lines + lines; |
59 return CommentLines(lines, tabs) | 59 return CommentLines(lines, tabs) |
60 | 60 |
61 def GetNodeComments(node, prefix=None, tabs=0): | 61 def GetNodeComments(node, tabs=0): |
62 # Generate a comment block joining all comment nodes which are children of | 62 # Generate a comment block joining all comment nodes which are children of |
63 # the provided node. | 63 # the provided node. |
64 comment_txt = '' | 64 comment_txt = '' |
65 for doc in node.GetListOf('Comment'): | 65 for doc in node.GetListOf('Comment'): |
66 comment_txt += Comment(doc, tabs=tabs) | 66 comment_txt += Comment(doc, tabs=tabs) |
67 return comment_txt | 67 return comment_txt |
68 | 68 |
69 | 69 |
70 class CGen(object): | 70 class CGen(object): |
71 # TypeMap | 71 # TypeMap |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 } | 151 } |
152 | 152 |
153 def __init__(self): | 153 def __init__(self): |
154 self.dbg_depth = 0 | 154 self.dbg_depth = 0 |
155 | 155 |
156 # | 156 # |
157 # Debug Logging functions | 157 # Debug Logging functions |
158 # | 158 # |
159 def Log(self, txt): | 159 def Log(self, txt): |
160 if not GetOption('cgen_debug'): return | 160 if not GetOption('cgen_debug'): return |
161 tabs = '' | 161 tabs = ' ' * self.dbg_depth |
162 for tab in range(self.dbg_depth): tabs += ' ' | |
163 print '%s%s' % (tabs, txt) | 162 print '%s%s' % (tabs, txt) |
164 | 163 |
165 def LogEnter(self, txt): | 164 def LogEnter(self, txt): |
166 if txt: self.Log(txt) | 165 if txt: self.Log(txt) |
167 self.dbg_depth += 1 | 166 self.dbg_depth += 1 |
168 | 167 |
169 def LogExit(self, txt): | 168 def LogExit(self, txt): |
170 self.dbg_depth -= 1 | 169 self.dbg_depth -= 1 |
171 if txt: self.Log(txt) | 170 if txt: self.Log(txt) |
172 | 171 |
| 172 |
| 173 def GetDefine(self, name, value): |
| 174 out = '#define %s %s' % (name, value) |
| 175 if len(out) > 80: |
| 176 out = '#define %s \\\n %s' % (name, value) |
| 177 return '%s\n' % out |
| 178 |
| 179 # |
| 180 # Interface strings |
| 181 # |
| 182 def GetMacroHelper(self, node): |
| 183 macro = node.GetProperty('macro') |
| 184 if macro: return macro |
| 185 name = node.GetName() |
| 186 name = name.upper() |
| 187 return "%s_INTERFACE" % name |
| 188 |
| 189 def GetInterfaceMacro(self, node, version = None): |
| 190 name = self.GetMacroHelper(node) |
| 191 if version is None: |
| 192 return name |
| 193 return '%s_%s' % (name, str(version).replace('.', '_')) |
| 194 |
| 195 def GetInterfaceString(self, node, version = None): |
| 196 # If an interface name is specified, use that |
| 197 name = node.GetProperty('iname') |
| 198 if not name: |
| 199 # Otherwise, the interface name is the object's name |
| 200 # With '_Dev' replaced by '(Dev)' if it's a Dev interface. |
| 201 name = node.GetName() |
| 202 if name.endswith('_Dev'): |
| 203 name = '%s(Dev)' % name[:-4] |
| 204 if version is None: |
| 205 return name |
| 206 return "%s;%s" % (name, version) |
| 207 |
| 208 |
173 # | 209 # |
174 # Return the array specification of the object. | 210 # Return the array specification of the object. |
175 # | 211 # |
176 def GetArraySpec(self, node): | 212 def GetArraySpec(self, node): |
177 assert(node.cls == 'Array') | 213 assert(node.cls == 'Array') |
178 out = '' | |
179 fixed = node.GetProperty('FIXED') | 214 fixed = node.GetProperty('FIXED') |
180 if fixed: | 215 if fixed: |
181 return '[%s]' % fixed | 216 return '[%s]' % fixed |
182 else: | 217 else: |
183 return '[]' | 218 return '[]' |
184 | 219 |
185 # | 220 # |
186 # GetTypeName | 221 # GetTypeName |
187 # | 222 # |
188 # For any valid 'typed' object such as Member or Typedef | 223 # For any valid 'typed' object such as Member or Typedef |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 # | 395 # |
361 def GetSignature(self, node, release, mode, prefix='', func_as_ptr=True): | 396 def GetSignature(self, node, release, mode, prefix='', func_as_ptr=True): |
362 self.LogEnter('GetSignature %s %s as func=%s' % (node, mode, func_as_ptr)) | 397 self.LogEnter('GetSignature %s %s as func=%s' % (node, mode, func_as_ptr)) |
363 rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode) | 398 rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode) |
364 out = self.Compose(rtype, name, arrayspec, callspec, prefix, func_as_ptr) | 399 out = self.Compose(rtype, name, arrayspec, callspec, prefix, func_as_ptr) |
365 self.LogExit('Exit GetSignature: %s' % out) | 400 self.LogExit('Exit GetSignature: %s' % out) |
366 return out | 401 return out |
367 | 402 |
368 # Define a Typedef. | 403 # Define a Typedef. |
369 def DefineTypedef(self, node, releases, prefix='', comment=False): | 404 def DefineTypedef(self, node, releases, prefix='', comment=False): |
| 405 __pychecker__ = 'unusednames=comment' |
370 release = releases[0] | 406 release = releases[0] |
371 out = 'typedef %s;\n' % self.GetSignature(node, release, 'return', | 407 out = 'typedef %s;\n' % self.GetSignature(node, release, 'return', |
372 prefix, True) | 408 prefix, True) |
373 self.Log('DefineTypedef: %s' % out) | 409 self.Log('DefineTypedef: %s' % out) |
374 return out | 410 return out |
375 | 411 |
376 # Define an Enum. | 412 # Define an Enum. |
377 def DefineEnum(self, node, releases, prefix='', comment=False): | 413 def DefineEnum(self, node, releases, prefix='', comment=False): |
| 414 __pychecker__ = 'unusednames=comment,releases' |
378 self.LogEnter('DefineEnum %s' % node) | 415 self.LogEnter('DefineEnum %s' % node) |
379 unnamed = node.GetProperty('unnamed') | 416 unnamed = node.GetProperty('unnamed') |
380 if unnamed: | 417 if unnamed: |
381 out = 'enum {' | 418 out = 'enum {' |
382 else: | 419 else: |
383 out = 'typedef enum {' | 420 out = 'typedef enum {' |
384 name = '%s%s' % (prefix, node.GetName()) | 421 name = '%s%s' % (prefix, node.GetName()) |
385 enumlist = [] | 422 enumlist = [] |
386 for child in node.GetListOf('EnumItem'): | 423 for child in node.GetListOf('EnumItem'): |
387 value = child.GetProperty('VALUE') | 424 value = child.GetProperty('VALUE') |
388 comment_txt = GetNodeComments(child, tabs=1) | 425 comment_txt = GetNodeComments(child, tabs=1) |
389 if value: | 426 if value: |
390 item_txt = '%s%s = %s' % (prefix, child.GetName(), value) | 427 item_txt = '%s%s = %s' % (prefix, child.GetName(), value) |
391 else: | 428 else: |
392 item_txt = '%s%s' % (prefix, child.GetName()) | 429 item_txt = '%s%s' % (prefix, child.GetName()) |
393 enumlist.append('%s %s' % (comment_txt, item_txt)) | 430 enumlist.append('%s %s' % (comment_txt, item_txt)) |
394 self.LogExit('Exit DefineEnum') | 431 self.LogExit('Exit DefineEnum') |
395 | 432 |
396 if unnamed: | 433 if unnamed: |
397 out = '%s\n%s\n};\n' % (out, ',\n'.join(enumlist)) | 434 out = '%s\n%s\n};\n' % (out, ',\n'.join(enumlist)) |
398 else: | 435 else: |
399 out = '%s\n%s\n} %s;\n' % (out, ',\n'.join(enumlist), name) | 436 out = '%s\n%s\n} %s;\n' % (out, ',\n'.join(enumlist), name) |
400 return out | 437 return out |
401 | 438 |
402 def DefineMember(self, node, releases, prefix='', comment=False): | 439 def DefineMember(self, node, releases, prefix='', comment=False): |
| 440 __pychecker__ = 'unusednames=prefix,comment' |
403 release = releases[0] | 441 release = releases[0] |
404 self.LogEnter('DefineMember %s' % node) | 442 self.LogEnter('DefineMember %s' % node) |
405 out = '%s;' % self.GetSignature(node, release, 'store', '', True) | 443 out = '%s;' % self.GetSignature(node, release, 'store', '', True) |
406 self.LogExit('Exit DefineMember') | 444 self.LogExit('Exit DefineMember') |
407 return out | 445 return out |
408 | 446 |
409 def DefineStructInternals(self, node, release, suffix='', comment=True): | 447 def DefineStructInternals(self, node, release, suffix='', comment=True): |
410 out = '' | 448 out = '' |
411 if node.GetProperty('union'): | 449 if node.GetProperty('union'): |
412 out += 'union %s%s {\n' % (node.GetName(), suffix) | 450 out += 'union %s%s {\n' % (node.GetName(), suffix) |
413 else: | 451 else: |
414 out += 'struct %s%s {\n' % (node.GetName(), suffix) | 452 out += 'struct %s%s {\n' % (node.GetName(), suffix) |
415 | 453 |
416 # Generate Member Functions | 454 # Generate Member Functions |
417 members = [] | 455 members = [] |
418 for child in node.GetListOf('Member'): | 456 for child in node.GetListOf('Member'): |
419 member = self.Define(child, [release], tabs=1, comment=comment) | 457 member = self.Define(child, [release], tabs=1, comment=comment) |
420 if not member: | 458 if not member: |
421 continue | 459 continue |
422 members.append(member) | 460 members.append(member) |
423 out += '%s\n};\n' % '\n'.join(members) | 461 out += '%s\n};\n' % '\n'.join(members) |
424 return out | 462 return out |
425 | 463 |
426 | 464 |
427 def DefineStruct(self, node, releases, prefix='', comment=False): | 465 def DefineStruct(self, node, releases, prefix='', comment=False): |
| 466 __pychecker__ = 'unusednames=comment,prefix' |
428 self.LogEnter('DefineStruct %s' % node) | 467 self.LogEnter('DefineStruct %s' % node) |
429 out = '' | 468 out = '' |
430 build_list = node.GetUniqueReleases(releases) | 469 build_list = node.GetUniqueReleases(releases) |
431 | 470 |
432 # Build the most recent one with comments | 471 # Build the most recent one with comments |
433 out = self.DefineStructInternals(node, build_list[-1], comment=True) | 472 out = self.DefineStructInternals(node, build_list[-1], comment=True) |
434 | 473 |
435 # Build the rest without comments and with the version number appended | 474 # Build the rest without comments and with the version number appended |
436 for rel in build_list[0:-1]: | 475 for rel in build_list[0:-1]: |
437 ver_num = node.GetVersion(rel) | 476 ver_num = node.GetVersion(rel) |
(...skipping 14 matching lines...) Expand all Loading... |
452 lines = node.GetName().split('\n') | 491 lines = node.GetName().split('\n') |
453 return CommentLines(lines, tabs) | 492 return CommentLines(lines, tabs) |
454 | 493 |
455 | 494 |
456 # Define a top level object. | 495 # Define a top level object. |
457 def Define(self, node, releases, tabs=0, prefix='', comment=False): | 496 def Define(self, node, releases, tabs=0, prefix='', comment=False): |
458 if not node.InReleases(releases): | 497 if not node.InReleases(releases): |
459 return '' | 498 return '' |
460 | 499 |
461 self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix)) | 500 self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix)) |
462 declmap = { | 501 declmap = dict({ |
463 'Enum' : CGen.DefineEnum, | 502 'Enum': CGen.DefineEnum, |
464 'Function' : CGen.DefineMember, | 503 'Function': CGen.DefineMember, |
465 'Interface' : CGen.DefineStruct, | 504 'Interface': CGen.DefineStruct, |
466 'Member' : CGen.DefineMember, | 505 'Member': CGen.DefineMember, |
467 'Struct' : CGen.DefineStruct, | 506 'Struct': CGen.DefineStruct, |
468 'Typedef' : CGen.DefineTypedef, | 507 'Typedef': CGen.DefineTypedef |
469 } | 508 }) |
470 | 509 |
471 out = '' | 510 out = '' |
472 func = declmap.get(node.cls) | 511 func = declmap.get(node.cls, None) |
473 if not func: | 512 if not func: |
474 ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName())) | 513 ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName())) |
475 define_txt = func(self, node, releases, prefix=prefix, comment=comment) | 514 define_txt = func(self, node, releases, prefix=prefix, comment=comment) |
476 | 515 |
477 comment_txt = GetNodeComments(node, tabs=0) | 516 comment_txt = GetNodeComments(node, tabs=0) |
478 if comment_txt and comment: | 517 if comment_txt and comment: |
479 out += comment_txt | 518 out += comment_txt |
480 out += define_txt | 519 out += define_txt |
481 | 520 |
482 tab = ' ' * tabs | 521 tab = ' ' * tabs |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 if f.GetProperty('ERRORS') > 0: | 607 if f.GetProperty('ERRORS') > 0: |
569 print 'Skipping %s' % f.GetName() | 608 print 'Skipping %s' % f.GetName() |
570 continue | 609 continue |
571 print DefineDepends(node) | 610 print DefineDepends(node) |
572 for node in f.GetChildren()[2:]: | 611 for node in f.GetChildren()[2:]: |
573 print Define(node, comment=True, prefix='tst_') | 612 print Define(node, comment=True, prefix='tst_') |
574 | 613 |
575 | 614 |
576 if __name__ == '__main__': | 615 if __name__ == '__main__': |
577 sys.exit(Main(sys.argv[1:])) | 616 sys.exit(Main(sys.argv[1:])) |
OLD | NEW |