Revision: 8113
http://playerstage.svn.sourceforge.net/playerstage/?rev=8113&view=rev
Author: thjc
Date: 2009-07-24 10:57:21 +0000 (Fri, 24 Jul 2009)
Log Message:
-----------
remove duplicate file and use the one from the python bindings folder instead
Modified Paths:
--------------
code/player/trunk/client_libs/libplayerc/bindings/ruby/CMakeLists.txt
Removed Paths:
-------------
code/player/trunk/client_libs/libplayerc/bindings/ruby/playerc_swig_parse.py
Modified: code/player/trunk/client_libs/libplayerc/bindings/ruby/CMakeLists.txt
===================================================================
--- code/player/trunk/client_libs/libplayerc/bindings/ruby/CMakeLists.txt
2009-07-23 23:37:42 UTC (rev 8112)
+++ code/player/trunk/client_libs/libplayerc/bindings/ruby/CMakeLists.txt
2009-07-24 10:57:21 UTC (rev 8113)
@@ -25,7 +25,7 @@
# Generate playerc_wrap.i and playerc_wrap.h from playerc.h
SET (playerc_wrap_prefix
"${CMAKE_CURRENT_BINARY_DIR}/playerc_wrap")
ADD_CUSTOM_COMMAND (OUTPUT "${playerc_wrap_prefix}.i"
- COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/playerc_swig_parse.py
${PROJECT_SOURCE_DIR}/client_libs/libplayerc/playerc.h ${playerc_wrap_prefix}
+ COMMAND ${PYTHON_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/../python/playerc_swig_parse.py
${PROJECT_SOURCE_DIR}/client_libs/libplayerc/playerc.h ${playerc_wrap_prefix}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM)
Deleted:
code/player/trunk/client_libs/libplayerc/bindings/ruby/playerc_swig_parse.py
===================================================================
---
code/player/trunk/client_libs/libplayerc/bindings/ruby/playerc_swig_parse.py
2009-07-23 23:37:42 UTC (rev 8112)
+++
code/player/trunk/client_libs/libplayerc/bindings/ruby/playerc_swig_parse.py
2009-07-24 10:57:21 UTC (rev 8113)
@@ -1,251 +0,0 @@
-#!/usr/bin/env python
-
-import re
-import string
-import sys
-
-# Global array of PlayerStruct objects (defined below) to hold information
about
-# structure definitions.
-structures=[]
-
-# Accessor functions to allow access to dynamic arrays (e.g.
playerc_laser_t.ranges).
-# accessor_header goes in playerc_wrap.h, accessor_interface goes in
playerc_wrap.i.
-accessor_header="""
-typedef struct
-{
- TYPE *actual;
-} TYPEArray;
-"""
-
-accessor_interface="""
-typedef struct
-{
- TYPE *actual;
-
- %extend {
- TYPE __getitem__(int index) {return $self->actual[index];}
- void __setitem__(int index,TYPE value) {$self->actual[index]=value;}
- }
-} TYPEArray;
-"""
-
-# Class for holding information about a detected structure, including a header
-# section for preprocessor directives and typedefs and a 'members' section for
-# external functions that become members.
-class PlayerStruct:
- name=''
- header=""
- members=""
-
- def __init__(self,initName):
- self.name=initName
-
- def __eq__(self,other):
- if isinstance(other,str):
- return self.name==other
- return NotImplemented
-
-# Called for every function that matches the regex in main. If successful,
-# the function will be removed, temporarily stored in a 'PlayerStruct' class,
-# and later reconstituted as a member function.
-def memberize(match):
- # Used to remove the first parameter from a list of function parameters.
- # The first parameter to a potential member function is a pointer to the
structure
- # to work with, which is not necessary after the transformation.
- lastParams=re.compile('\(\s*\w+?.*?,\s*(?P<last>.*)\)',re.DOTALL)
- funcName=match.group('name')
- # The start of the loop checks chunks of the function name for a
recognizable structure
- # name. e.g. playerc_some_class_do_some_action will try playerc_some,
playerc_some_class
- # and so on until a match is found.
- objName="playerc"
- for i in range(1,funcName.count("_")):
- objName=funcName[:funcName.find("_",len(objName)+1)]
- action=funcName[len(objName)+1:]
- # Once a match is found, transform the external function to a member
function.
- if objName in structures:
- struct=structures[structures.index(objName)]
- # e.g. playerc_client_create
- if action=="create":
- # add the function to a structure
- struct.members+="\t\t" + objName + " " + match.group('params')
+ ";\n"
- # add a preprocessor directive to ensure swig picks up the old
library
- # function name as a constructor.
- struct.header+="\t#define new_" + objName + " " + funcName +
"\n"
- # e.g. playerc_client_destroy
- elif action == "destroy":
- # add the destructor to the structure. No destructors take
parameters
- # or return a value.
- struct.members+="\t\tvoid destroy(void);\n"
- struct.header+="\t#define del_" + objName + " " + funcName +
"\n"
- # e.g. playerc_client_connect
- else:
- # set 'last' to every parameter in the parameter list except
the first.
- # if no match, there are less than two parameters, in which
case the
- # transformed function will have no parameters (void).
- lm=lastParams.match(match.group('params'))
- if lm:
- last=lm.group('last')
- else:
- last="void"
- # add the function prototype to the structure.
- struct.members+="\t\t" + match.group('retval') + " " + action
+ " (%s);\n" % last
- # functions that are not constructors or destructors already
match the required SWIG pattern,
- # so no preprocessor directive is required.
- # Since the function is a member function and will now have a
prototype
- # inside an 'extend' clause in the structure definition, remove
the external
- # reference by substituting with ''
- return ''
- # If the function is not a member function of a structure, take no action.
- return match.group()
-
-# This function is called for every structure. It attempts to find dynamically
-# allocated arrays of simple types (which are not subscriptable in python with
-# standard binding) and wrap them in an accessor structure defined at the top
of this file.
-def accessorize(match):
- # 'text' is the new code for the matched structure (to be returned)
- text=match.group('decl')+"{"
- # 'body' is everything within the {}s of the structure definition
- body=match.group('body');
- # 'arrayMember' is a regex designed to match certain member definitions,
- # e.g. 'double *ranges;' (playerc_laser_t)
-
arrayMember=re.compile(r"\b(?P<type>int|double|float)\s*[*]\s*(?P<name>\w+);",re.MULTILINE)
-
- # performs a substitution on the member definitions described above,
- # e.g. 'double *ranges;' becomes 'doubleArray ranges;',
- # and appends the modified struct body to the code.
- text+=arrayMember.sub("\g<type>Array \g<name>;",body)
-
- # terminate the modified structure and add the 'footer', usually just the
end
- # of the typedef.
- text+="}"+match.group('footer')
- return text;
-
-# Called for every structure in the input stream. Modifies the code block to
include
-# an appropriate 'header' section with typedefs and preprocessor directives,
-# and adds new member function prototypes in a SWIG 'extend' block at the end
of the
-# structure.
-def genifacestruct(match):
- # ensure the structure has previously been scanned (should always be the
case)
- if match.group('name') in structures:
- # retrieve the data about the matched structure
- struct=structures[structures.index(match.group('name'))]
- # add the header block and a typedef to permit the change from
structname_t to structname
- # (for clarity in python)
- text="%header\n%{\n"+struct.header+"\ttypedef " + struct.name+"_t
"+struct.name+";\n%}\n\n"
- # add the structure declaration and the body, omitting a closing brace
- text+=match.group('decl')+"{"+match.group('body')
- # add the extension block with member function protoypes, plus a
closing brace.
- text+="\t%extend\n\t{\n"+struct.members+"\t}\n}"
- # add the remainder of the original structure definition (usually just
the typedef name)
- text+=match.group('footer')
- return text
- # if no match, print a statement to that effect and return the original
structure definition.
- # should never happen.
- print "No match on %s" % match.group('name')
- return match.group()
-
-# Used to remove _t from structure references.
-# Had to do this due to ambiguity with typedef statements and callback
function prototypes.
-# e.g. typedef void (*playerc_putmsg_fn_t) (void *device, char *header, char
*data);
-# also typedef player_blobfinder_blob_t playerc_blobfinder_blob_t;
-# This function ensures that only structures defined in playerc.h are modified.
-def underscore(match):
- if match.group('name') in structures:
- return match.group('name')
- return match.group()
-
-if __name__ == '__main__':
-
- # should always be playerc.h
- infilename = sys.argv[1]
- # should always be 'playerc_wrap'
- outfilename = sys.argv[2]
-
- # Read in the entire file
- file = open(infilename, 'r')
- ifaceStream = file.read()
- file.close()
-
- # Pattern to remove all double-spacing (used later)
- blank=re.compile('([ \t\f\v\r]*\n){3,}',re.MULTILINE)
-
- # Remove all comments (multi- and single-line).
- comment=re.compile('((/\*.*?\*/)|(//.*?$))', re.DOTALL|re.MULTILINE)
- ifaceStream=comment.sub('',ifaceStream)
-
- # Pattern to recognise structure definitions
- struct=re.compile("""
- (?P<decl>typedef\s+struct\s*\w*\s*) # Declaration
- {(?P<body>.*?)}(?P<footer>\s* # Body
- (?P<name>playerc_\w+?)(_t)? # Name
- \s*;)
- """, re.DOTALL|re.VERBOSE)
-
- # Match and replace all structure definitions with versions that have
- # accessor structures for dynamically allocated arrays using the
'accessorize'
- # function above.
- ifaceStream=struct.sub(accessorize,ifaceStream)
-
- # remove all double-spacing (pattern defined above)
- ifaceStream=blank.sub('\n\n',ifaceStream)
-
- # output to new header file. It is necessary to modify the original
header file to
- # allow for data types of structure members to be changed. Pointers are
modified
- # to structures containing a pointer, to allow the member to be
subscriptable in python.
- # see comments on the 'accessorize' function above.
- file=open("%s.h" % outfilename,"w")
- # write accessor structure definitions for arrays of ints, doubles and
floats.
- for type in ["int","double","float"]:
- file.write(accessor_header.replace("TYPE",type))
- # write the modified header file.
- file.write(ifaceStream)
- file.close()
-
- # find the names of all the structures defined in the file, and make
- # a list of objects to store information about the structures.
- # could be done as part of 'accessorize' but left here for clarity.
- am=struct.finditer(ifaceStream)
- for m in am:
- structures+=[PlayerStruct(m.group('name'))]
-
- # Pattern to match function prototypes that could be changed to 'member
functions'
- # of structures, allowing object-oriented style calling from Python.
- function=re.compile("""
- \s*
- ((?P<retval> # Capture the return type:
- \w+\s*?( # Type name, is a
- \** | # pointer OR
- &? | # reference OR
- (\[\s*[0-9]*\s*\]) # array.
- )
- )\s*)? # Only one (potential) return value.
- (?P<name> # Capture function name
- playerc_\w+ # Class name and member function name
- )\s*
- (?P<params>\(.*?\)) # Parameters
- \s*;
- """, re.DOTALL|re.VERBOSE)
-
- # remove the _t from the end of all the struct references.
- structNames=re.compile(r"\b(?P<name>playerc_\w+)_t\b")
- ifaceStream=structNames.sub(underscore,ifaceStream)
-
- # using the 'memberize' function, find functions that should be struct
'members' and shift them.
- ifaceStream=function.sub(memberize,ifaceStream)
-
- # Using the gathered information about functions and structures, rewrite
the structure
- # definitions in the interface file to include required extensions
(function prototypes),
- # typedefs and preprocessor directives. see comments on 'genifacestruct'
function above.
- ifaceStream=struct.sub(genifacestruct,ifaceStream)
-
- # remove all double spacing.
- ifaceStream=blank.sub('\n\n',ifaceStream)
-
- # write the SWIG interface definition file.
- file=open("%s.i" % outfilename,"w")
- # write interfaces for the accessor structs including subscripting
functions.
- for type in ["int","double","float"]:
- file.write(accessor_interface.replace("TYPE",type))
- file.write(ifaceStream)
- file.close()
-
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit