generator.py (2198B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import sys from glad.lang.d.generator import DGenerator if sys.version_info >= (3, 0): basestring = str class VoltGenerator(DGenerator): NAME = 'volt' NAME_LONG = 'Volt' MODULE = 'amp' LOADER = 'loader' ENUMS = 'enums' EXT = 'ext' FUNCS = 'funcs' TYPES = 'types' FILE_EXTENSION = '.volt' API = '' LOAD_GL_NAME = 'load' @property def PACKAGE(self): return 'package' def write_module(self, fobj, name): if name == 'package': fobj.write('module {}.{};\n\n'.format(self.MODULE, self.spec.NAME)) else: DGenerator.write_module(self, fobj, name) def write_prototype_pre(self, fobj): fobj.write('extern(System) @loadDynamic {\n') def write_prototype_post(self, fobj): fobj.write('}\n') def write_function_pre(self, fobj): pass def write_function_post(self, fobj): pass def write_shared(self, fobj): fobj.write('global {\n') def write_shared_end(self, fobj): fobj.write('}\n') def write_function(self, fobj, func): pass def write_function_prototype(self, fobj, func): fobj.write('{} {}(' .format(func.proto.ret.to_volt(), func.proto.name)) fobj.write(', '.join(param.type.to_volt() for param in func.params)) fobj.write(');\n') def write_boolean(self, fobj, name, **kwargs): fobj.write('global bool {};\n'.format(name)) def write_enum(self, fobj, name, value, type_='uint'): if isinstance(value, basestring): if value.startswith('0x') and type_.startswith('u'): value += 'U' if len(value) > 12 and type_.startswith('u'): value += 'L' try: v = int(value) if v < 0: type_ = 'int' except ValueError: pass if isinstance(value, basestring) and '"' in value: type_ = 'const(char)*' fobj.write('enum {} {} = {};\n'.format(type_, name, value)) def write_opaque_struct(self, fobj, name): fobj.write('struct _{name} {{}}\nalias {name} = _{name}*;\n'.format(name=name)) |