2
0
Эх сурвалжийг харах

Add missing license header to structsgen.pw

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@685 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
aramis_acg 15 жил өмнө
parent
commit
28141f5880
1 өөрчлөгдсөн 261 нэмэгдсэн , 216 устгасан
  1. 261 216
      scripts/structsgen.py

+ 261 - 216
scripts/structsgen.py

@@ -1,216 +1,261 @@
-import os
-import re
-
-#==[regexps]=================================================
-
-# Clean desc 
-REdefine = re.compile(r''
-                r'(?P<desc>)'                                       # /** *desc */
-                r'#\s*define\s(?P<name>[^(\n]+?)\s(?P<code>.+)$'    #  #define name value
-                , re.MULTILINE)
-
-# Get structs
-REstructs = re.compile(r''
-                #r'//\s?[\-]*\s(?P<desc>.*?)\*/\s'           # /** *desc */
-                #r'//\s?[\-]*(?P<desc>.*?)\*/(?:.*?)'            # garbage
-                r'//\s?[\-]*\s(?P<desc>.*?)\*/\W*?'           # /** *desc */
-                r'struct\s(?:ASSIMP_API\s)?(?P<name>[a-z][a-z0-9_]\w+\b)'    # struct name
-                r'[^{]*?\{'                                 # {
-                r'(?P<code>.*?)'                            #   code 
-                r'\}\s*(PACK_STRUCT)?;'                      # };
-                , re.IGNORECASE + re.DOTALL + re.MULTILINE)
-
-# Clean desc 
-REdesc = re.compile(r''
-                r'^\s*?([*]|/\*\*)(?P<line>.*?)'            #  * line 
-                , re.IGNORECASE + re.DOTALL + re.MULTILINE)
-
-# Remove #ifdef __cplusplus   
-RErmifdef = re.compile(r''
-                r'#ifdef __cplusplus'                       # #ifdef __cplusplus
-                r'(?P<code>.*)'                             #   code 
-                r'#endif(\s*//\s*!?\s*__cplusplus)*'          # #endif
-                , re.IGNORECASE + re.DOTALL)
-                
-# Replace comments
-RErpcom = re.compile(r''
-                r'[ ]*(/\*\*\s|\*/|\B\*\s|//!)'             # /**
-                r'(?P<line>.*?)'                            #  * line 
-                , re.IGNORECASE + re.DOTALL)
-                
-# Restructure 
-def GetType(type, prefix='c_'):
-    t = type
-    while t.endswith('*'):
-        t = t[:-1]
-    types = {'unsigned int':'uint', 'unsigned char':'ubyte', 'size_t':'uint',}
-    if t in types:
-        t = types[t]
-    t = prefix + t
-    while type.endswith('*'):
-        t = "POINTER(" + t + ")"
-        type = type[:-1]
-    return t
-    
-def restructure( match ):
-    type = match.group("type")
-    if match.group("struct") == "":
-        type = GetType(type)
-    elif match.group("struct") == "C_ENUM ":
-        type = "c_uint"
-    else:
-        type = GetType(type[2:], '')
-    if match.group("index"):
-        type = type + "*" + match.group("index")
-        
-    result = ""
-    for name in match.group("name").split(','):
-        result += "(\"" + name.strip() + "\", "+ type + "),"
-    
-    return result
-
-RErestruc = re.compile(r''
-                r'(?P<struct>C_STRUCT\s|C_ENUM\s|)'                     #  [C_STRUCT]
-                r'(?P<type>\w+\s?\w+?[*]*)\s'                           #  type
-                #r'(?P<name>\w+)'                                       #  name
-                r'(?P<name>\w+|[a-z0-9_, ]+)'                               #  name
-                r'(:?\[(?P<index>\w+)\])?;'                             #  []; (optional)
-                , re.DOTALL)
-#==[template]================================================
-template = """
-class $NAME$(Structure):
-    \"\"\"
-$DESCRIPTION$
-    \"\"\" 
-$DEFINES$
-    _fields_ = [
-            $FIELDS$
-        ]
-"""
-
-templateSR = """
-class $NAME$(Structure):
-    \"\"\"
-$DESCRIPTION$
-    \"\"\" 
-$DEFINES$
-
-$NAME$._fields_ = [
-            $FIELDS$
-        ]
-"""
-#============================================================
-def Structify(fileName):
-    file = open(fileName, 'r')
-    text = file.read()
-    result = []
-    
-    # Get defines.
-    defs = REdefine.findall(text)
-    # Create defines
-    defines = "\n"
-    for define in defs:
-        # Clean desc 
-        desc = REdesc.sub('', define[0])
-        # Replace comments
-        desc = RErpcom.sub('#\g<line>', desc)
-        defines += desc
-        defines += " "*4 + define[1] + " = " + define[2] + "\n"  
-    
-    # Get structs
-    rs = REstructs.finditer(text)
-
-    fileName = os.path.basename(fileName)
-    print fileName
-    for r in rs:
-        name = r.group('name')[2:]
-        desc = r.group('desc')
-        
-        # Skip some structs
-        if name == "FileIO" or name == "File" or name == "locateFromAssimpHeap":
-            continue
-
-        text = r.group('code')
-
-        # Clean desc 
-        desc = REdesc.sub('', desc)
-        
-        desc = "See '"+ fileName +"' for details." #TODO  
-        
-        # Remove #ifdef __cplusplus
-        text = RErmifdef.sub('', text)
-        
-        # Whether the struct contains more than just POD
-        primitive = text.find('C_STRUCT') == -1
-
-        # Restructure
-        text = RErestruc.sub(restructure, text)
-
-        # Replace comments
-        text = RErpcom.sub('#\g<line>', text)
-        
-        # Whether it's selfreferencing: ex. struct Node { Node* parent; };
-        selfreferencing = text.find('POINTER('+name+')') != -1
-        
-        complex = name == "Scene"
-        
-        # Create description
-        description = ""
-        for line in desc.split('\n'):
-            description += " "*4 + line.strip() + "\n"  
-        description = description.rstrip()
-
-        # Create fields
-        fields = ""
-        for line in text.split('\n'):
-            fields += " "*12 + line.strip() + "\n"
-        fields = fields.strip()
-
-        if selfreferencing:
-            templ = templateSR
-        else:
-            templ = template
-            
-        # Put it all together
-        text = templ.replace('$NAME$', name)
-        text = text.replace('$DESCRIPTION$', description)
-        text = text.replace('$FIELDS$', fields)
-        
-        if ((name.lower() == fileName.split('.')[0][2:].lower()) and (name != 'Material')) or name == "String":
-            text = text.replace('$DEFINES$', defines)
-        else:
-            text = text.replace('$DEFINES$', '')
-        
-        result.append((primitive, selfreferencing, complex, text))
-             
-    return result   
-
-text = "#-*- coding: UTF-8 -*-\n\n"
-text += "from ctypes import POINTER, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte\n\n"
-
-structs1 = ""
-structs2 = ""
-structs3 = ""
-structs4 = ""
-
-path = '../include/'
-files = os.listdir (path)
-#files = ["aiScene.h", "aiTypes.h"]
-for fileName in files:
-    if fileName.endswith('.h'):
-        for struct in Structify(os.path.join(path, fileName)):
-            primitive, sr, complex, struct = struct
-            if primitive:
-                structs1 += struct
-            elif sr:
-                structs2 += struct
-            elif complex:
-                structs4 += struct
-            else:
-                structs3 += struct
-
-text += structs1 + structs2 + structs3 + structs4
-
-file = open('structs.txt', 'w')
-file.write(text)
-file.close()
+#!/usr/bin/env python
+# -*- Coding: UTF-8 -*-
+
+# ---------------------------------------------------------------------------
+# Open Asset Import Library (ASSIMP)
+# ---------------------------------------------------------------------------
+#
+# Copyright (c) 2006-2010, ASSIMP Development Team
+#
+# All rights reserved.
+#
+# Redistribution and use of this software in source and binary forms, 
+# with or without modification, are permitted provided that the following 
+# conditions are met:
+# 
+# * Redistributions of source code must retain the above
+#   copyright notice, this list of conditions and the
+#   following disclaimer.
+# 
+# * Redistributions in binary form must reproduce the above
+#   copyright notice, this list of conditions and the
+#   following disclaimer in the documentation and/or other
+#   materials provided with the distribution.
+# 
+# * Neither the name of the ASSIMP team, nor the names of its
+#   contributors may be used to endorse or promote products
+#   derived from this software without specific prior
+#   written permission of the ASSIMP Development Team.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ---------------------------------------------------------------------------
+
+"""Update PyAssimp's data structures to keep up with the
+C/C++ headers."""
+
+import os
+import re
+
+#==[regexps]=================================================
+
+# Clean desc 
+REdefine = re.compile(r''
+                r'(?P<desc>)'                                       # /** *desc */
+                r'#\s*define\s(?P<name>[^(\n]+?)\s(?P<code>.+)$'    #  #define name value
+                , re.MULTILINE)
+
+# Get structs
+REstructs = re.compile(r''
+                #r'//\s?[\-]*\s(?P<desc>.*?)\*/\s'           # /** *desc */
+                #r'//\s?[\-]*(?P<desc>.*?)\*/(?:.*?)'            # garbage
+                r'//\s?[\-]*\s(?P<desc>.*?)\*/\W*?'           # /** *desc */
+                r'struct\s(?:ASSIMP_API\s)?(?P<name>[a-z][a-z0-9_]\w+\b)'    # struct name
+                r'[^{]*?\{'                                 # {
+                r'(?P<code>.*?)'                            #   code 
+                r'\}\s*(PACK_STRUCT)?;'                      # };
+                , re.IGNORECASE + re.DOTALL + re.MULTILINE)
+
+# Clean desc 
+REdesc = re.compile(r''
+                r'^\s*?([*]|/\*\*)(?P<line>.*?)'            #  * line 
+                , re.IGNORECASE + re.DOTALL + re.MULTILINE)
+
+# Remove #ifdef __cplusplus   
+RErmifdef = re.compile(r''
+                r'#ifdef __cplusplus'                       # #ifdef __cplusplus
+                r'(?P<code>.*)'                             #   code 
+                r'#endif(\s*//\s*!?\s*__cplusplus)*'          # #endif
+                , re.IGNORECASE + re.DOTALL)
+                
+# Replace comments
+RErpcom = re.compile(r''
+                r'[ ]*(/\*\*\s|\*/|\B\*\s|//!)'             # /**
+                r'(?P<line>.*?)'                            #  * line 
+                , re.IGNORECASE + re.DOTALL)
+                
+# Restructure 
+def GetType(type, prefix='c_'):
+    t = type
+    while t.endswith('*'):
+        t = t[:-1]
+    types = {'unsigned int':'uint', 'unsigned char':'ubyte', 'size_t':'uint',}
+    if t in types:
+        t = types[t]
+    t = prefix + t
+    while type.endswith('*'):
+        t = "POINTER(" + t + ")"
+        type = type[:-1]
+    return t
+    
+def restructure( match ):
+    type = match.group("type")
+    if match.group("struct") == "":
+        type = GetType(type)
+    elif match.group("struct") == "C_ENUM ":
+        type = "c_uint"
+    else:
+        type = GetType(type[2:], '')
+    if match.group("index"):
+        type = type + "*" + match.group("index")
+        
+    result = ""
+    for name in match.group("name").split(','):
+        result += "(\"" + name.strip() + "\", "+ type + "),"
+    
+    return result
+
+RErestruc = re.compile(r''
+                r'(?P<struct>C_STRUCT\s|C_ENUM\s|)'                     #  [C_STRUCT]
+                r'(?P<type>\w+\s?\w+?[*]*)\s'                           #  type
+                #r'(?P<name>\w+)'                                       #  name
+                r'(?P<name>\w+|[a-z0-9_, ]+)'                               #  name
+                r'(:?\[(?P<index>\w+)\])?;'                             #  []; (optional)
+                , re.DOTALL)
+#==[template]================================================
+template = """
+class $NAME$(Structure):
+    \"\"\"
+$DESCRIPTION$
+    \"\"\" 
+$DEFINES$
+    _fields_ = [
+            $FIELDS$
+        ]
+"""
+
+templateSR = """
+class $NAME$(Structure):
+    \"\"\"
+$DESCRIPTION$
+    \"\"\" 
+$DEFINES$
+
+$NAME$._fields_ = [
+            $FIELDS$
+        ]
+"""
+#============================================================
+def Structify(fileName):
+    file = open(fileName, 'r')
+    text = file.read()
+    result = []
+    
+    # Get defines.
+    defs = REdefine.findall(text)
+    # Create defines
+    defines = "\n"
+    for define in defs:
+        # Clean desc 
+        desc = REdesc.sub('', define[0])
+        # Replace comments
+        desc = RErpcom.sub('#\g<line>', desc)
+        defines += desc
+        defines += " "*4 + define[1] + " = " + define[2] + "\n"  
+    
+    # Get structs
+    rs = REstructs.finditer(text)
+
+    fileName = os.path.basename(fileName)
+    print fileName
+    for r in rs:
+        name = r.group('name')[2:]
+        desc = r.group('desc')
+        
+        # Skip some structs
+        if name == "FileIO" or name == "File" or name == "locateFromAssimpHeap":
+            continue
+
+        text = r.group('code')
+
+        # Clean desc 
+        desc = REdesc.sub('', desc)
+        
+        desc = "See '"+ fileName +"' for details." #TODO  
+        
+        # Remove #ifdef __cplusplus
+        text = RErmifdef.sub('', text)
+        
+        # Whether the struct contains more than just POD
+        primitive = text.find('C_STRUCT') == -1
+
+        # Restructure
+        text = RErestruc.sub(restructure, text)
+
+        # Replace comments
+        text = RErpcom.sub('#\g<line>', text)
+        
+        # Whether it's selfreferencing: ex. struct Node { Node* parent; };
+        selfreferencing = text.find('POINTER('+name+')') != -1
+        
+        complex = name == "Scene"
+        
+        # Create description
+        description = ""
+        for line in desc.split('\n'):
+            description += " "*4 + line.strip() + "\n"  
+        description = description.rstrip()
+
+        # Create fields
+        fields = ""
+        for line in text.split('\n'):
+            fields += " "*12 + line.strip() + "\n"
+        fields = fields.strip()
+
+        if selfreferencing:
+            templ = templateSR
+        else:
+            templ = template
+            
+        # Put it all together
+        text = templ.replace('$NAME$', name)
+        text = text.replace('$DESCRIPTION$', description)
+        text = text.replace('$FIELDS$', fields)
+        
+        if ((name.lower() == fileName.split('.')[0][2:].lower()) and (name != 'Material')) or name == "String":
+            text = text.replace('$DEFINES$', defines)
+        else:
+            text = text.replace('$DEFINES$', '')
+        
+        result.append((primitive, selfreferencing, complex, text))
+             
+    return result   
+
+text = "#-*- coding: UTF-8 -*-\n\n"
+text += "from ctypes import POINTER, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte\n\n"
+
+structs1 = ""
+structs2 = ""
+structs3 = ""
+structs4 = ""
+
+path = '../include/'
+files = os.listdir (path)
+#files = ["aiScene.h", "aiTypes.h"]
+for fileName in files:
+    if fileName.endswith('.h'):
+        for struct in Structify(os.path.join(path, fileName)):
+            primitive, sr, complex, struct = struct
+            if primitive:
+                structs1 += struct
+            elif sr:
+                structs2 += struct
+            elif complex:
+                structs4 += struct
+            else:
+                structs3 += struct
+
+text += structs1 + structs2 + structs3 + structs4
+
+file = open('structs.txt', 'w')
+file.write(text)
+file.close()