mirror of
				https://github.com/nigels-com/glew.git
				synced 2025-10-31 12:42:21 +00:00 
			
		
		
		
	Raw open should be avoided to prevent that in case of an exception the file is not closed. This also has the advantage that if the user forgets to call close the file is still closed.
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import re
 | |
| import sys
 | |
| from xml.dom.minidom import parse, Node
 | |
| 
 | |
| #
 | |
| # DOM traversal utility functions
 | |
| #
 | |
| 
 | |
| def findChildren(node, path):
 | |
|     result = []
 | |
|     if len(path)==1:
 | |
|         for i in node.childNodes:
 | |
|             if i.nodeType==Node.ELEMENT_NODE:
 | |
|                 if i.tagName==path[0]:
 | |
|                     result.append(i)
 | |
|     else:
 | |
|         for i in node.childNodes:
 | |
|             if i.nodeType==Node.ELEMENT_NODE:
 | |
|                 if i.tagName==path[0]:
 | |
|                     result.extend(findChildren(i, path[1:]))
 | |
|     return result
 | |
| 
 | |
| def findData(node, path):
 | |
|     return [ i.firstChild.data for i in findChildren(node, path) ]
 | |
| 
 | |
| isPointer = re.compile('(.*)([ ]+)([*]+)')
 | |
| 
 | |
| def findParams(node):
 | |
|     n = findData(node, ['name'])[0]
 | |
|     t = ''
 | |
|     for i in node.childNodes:
 | |
|         if i.nodeType==Node.TEXT_NODE:
 | |
|             t += i.data
 | |
|         if i.nodeType==Node.ELEMENT_NODE and i.tagName=='ptype':
 | |
|             t += i.firstChild.data
 | |
| 
 | |
|     t.strip()
 | |
|     m = isPointer.match(t)
 | |
|     if m:
 | |
|         t = ('%s%s'%(m.group(1), m.group(3))).strip()
 | |
|     return ( t, n.strip())
 | |
| 
 | |
| def findEnums(dom):
 | |
|     ret = {}
 | |
|     for i in findChildren(dom, [ 'registry', 'enums', 'enum' ]):
 | |
|       n = i.getAttribute('name')
 | |
|       v = i.getAttribute('value')
 | |
|       ret[n] = v
 | |
|     return ret
 | |
| 
 | |
| def findCommands(dom):
 | |
|     ret = {}
 | |
|     for i in findChildren(dom, [ 'registry', 'commands', 'command' ]):
 | |
|       r,n = findParams(findChildren(i, ['proto'])[0])
 | |
|       p = [ findParams(j) for j in findChildren(i, ['param'])]
 | |
|       ret[n] = (r, p)
 | |
|     return ret
 | |
| 
 | |
| def findFeatures(dom):
 | |
|     ret = {}
 | |
|     for i in findChildren(dom, [ 'registry', 'feature' ]):
 | |
|         n = i.getAttribute('name')
 | |
|         e = []
 | |
|         c = []
 | |
|         for j in findChildren(i, [ 'require', 'enum' ]):
 | |
|             e.append(j.getAttribute("name"))
 | |
|         for j in findChildren(i, [ 'require', 'command' ]):
 | |
|             c.append(j.getAttribute("name"))
 | |
|         ret[n] = (e,c)
 | |
|     return ret
 | |
| 
 | |
| def findExtensions(dom):
 | |
|     ret = {}
 | |
|     for i in findChildren(dom, [ 'registry', 'extensions', 'extension' ]):
 | |
|         n = i.getAttribute('name')
 | |
|         e = []
 | |
|         c = []
 | |
|         for j in findChildren(i, [ 'require', 'enum' ]):
 | |
|             e.append(j.getAttribute("name"))
 | |
|         for j in findChildren(i, [ 'require', 'command' ]):
 | |
|             c.append(j.getAttribute("name"))
 | |
|         ret[n] = (e,c)
 | |
|     return ret
 | |
| 
 | |
| def findApi(dom, name):
 | |
|     enums      = findEnums(dom)
 | |
|     commands   = findCommands(dom)
 | |
|     features   = findFeatures(dom)
 | |
|     extensions = findExtensions(dom)
 | |
|     return (enums, commands, features, extensions)
 | |
| 
 | |
| #
 | |
| #
 | |
| #
 | |
| 
 | |
| isWGL = re.compile('WGL_([A-Z0-9]+)_.*')
 | |
| 
 | |
| def writeExtension(f, name, extension, enums, commands):
 | |
|     f.write(('%s\n'%name).encode())
 | |
| 
 | |
|     url = 'https://www.khronos.org/registry/egl/specs/eglspec.1.5.pdf'
 | |
| 
 | |
|     m = isWGL.match(name)
 | |
|     if m:
 | |
|         url = 'https://www.khronos.org/registry/OpenGL/extensions/%s/%s.txt'%(m.group(1), name)
 | |
| 
 | |
|     f.write(('%s\n'%(url)).encode())
 | |
| 
 | |
|     if name.find('_VERSION_')==-1:
 | |
|         f.write(('%s\n'%name).encode())
 | |
|     else:
 | |
|         f.write('\n'.encode())
 | |
|     f.write('\n'.encode())
 | |
| 
 | |
|     enums = [ (j, enums[j]) for j in extension[0] ]
 | |
|     for e in sorted(enums, key=lambda i: i[1]):
 | |
|         f.write(('\t%s %s\n'%(e[0], e[1])).encode())
 | |
| 
 | |
|     commands = [ (j, commands[j]) for j in extension[1] ]
 | |
|     for c in sorted(commands):
 | |
|         params = ', '.join( [ '%s %s'%(j[0].strip(), j[1].strip()) for j in c[1][1] ] )
 | |
|         if len(params)==0:
 | |
|             params = 'void'
 | |
|         f.write(('\t%s %s (%s)\n'%(c[1][0].strip(), c[0].strip(), params)).encode())
 | |
| 
 | |
| if __name__ == '__main__':
 | |
| 
 | |
|   from argparse import ArgumentParser
 | |
|   import os
 | |
| 
 | |
|   parser = ArgumentParser(description='usage: %prog [options] [XML specs...]')
 | |
|   parser.add_argument("--core", dest="core", help="location for core outputs", default='')
 | |
|   parser.add_argument("--api", dest="name", help="API name: egl, wgl, glx, etc", default='')
 | |
|   parser.add_argument("--extensions", dest="extensions", help="location for extensions outputs", default='')
 | |
| 
 | |
|   (options, args) = parser.parse_known_args()
 | |
|   options = vars(options)
 | |
| 
 | |
|   for i in args:
 | |
| 
 | |
|     dom = parse(i)
 | |
|     api = findApi(dom, options['name'])
 | |
| 
 | |
|     print('Found {} enums, {} commands, {} features and {} extensions.'.format(
 | |
|         len(api[0]), len(api[1]), len(api[2]), len(api[3])))
 | |
| 
 | |
|     if len(options['core']):
 | |
|         for i in api[2].keys():
 | |
|             with open('%s/%s'%(options['core'], i), 'wb') as f:
 | |
|                 writeExtension(f, i, api[2][i], api[0], api[1])
 | |
| 
 | |
|     if len(options['extensions']):
 | |
|         for i in api[3].keys():
 | |
|             with open('%s/%s'%(options['extensions'], i), 'wb') as f:
 | |
|                 writeExtension(f, i, api[3][i], api[0], api[1])
 | |
| 
 |