| 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 |