Browse Source

Added kludges 'feature' to c2mx2 and chipmunk.

Mark Sibly 8 years ago
parent
commit
c54b96c4f9

+ 8 - 1
modules/chipmunk/c2mx2.json

@@ -5,9 +5,15 @@
 	
 	
 	"clangArgs":[
 	"clangArgs":[
 		"-Xclang",
 		"-Xclang",
+		"-std=gnu99",
 		"-IChipmunk7/include"
 		"-IChipmunk7/include"
 	],
 	],
 	
 	
+	"kludges":[
+		"cpSpaceDebugDrawOptions",
+		"cpSpaceDebugDraw"
+	],
+	
 	"header":[
 	"header":[
 		"",
 		"",
 		"'***** Auto generated by c2mx2! *****",
 		"'***** Auto generated by c2mx2! *****",
@@ -17,7 +23,8 @@
 		"#Import \"<libc>\"",
 		"#Import \"<libc>\"",
 		"",
 		"",
 		"#Import \"Chipmunk7/include/*.h\"",
 		"#Import \"Chipmunk7/include/*.h\"",
-		"#Import \"<chipmunk/chipmunk.h>\"",
+		"",
+		"#Import \"chipmunk_extern.h\"",
 		"",
 		"",
 		"Extern"
 		"Extern"
 	]
 	]

+ 1 - 0
modules/chipmunk/chipmunk.monkey2

@@ -35,3 +35,4 @@ Namespace chipmunk
 #Import "Chipmunk7/src/cpSpaceStep.c"
 #Import "Chipmunk7/src/cpSpaceStep.c"
 #Import "Chipmunk7/src/cpSpatialIndex.c"
 #Import "Chipmunk7/src/cpSpatialIndex.c"
 #Import "Chipmunk7/src/cpSweep1D.c"
 #Import "Chipmunk7/src/cpSweep1D.c"
+

+ 26 - 0
modules/chipmunk/chipmunk_extern.h

@@ -0,0 +1,26 @@
+
+#ifndef BB_CHIPMUNK_EXTERN_H
+#define BB_CHIPMUNK_EXTERN_H
+
+#include <chipmunk/chipmunk.h>
+
+struct bb_cpSpaceDebugDrawOptions{
+	cpSpaceDebugDrawCircleImpl  drawCircle;
+	cpSpaceDebugDrawSegmentImpl drawSegment;
+	cpSpaceDebugDrawFatSegmentImpl drawFatSegment;
+	cpSpaceDebugDrawPolygonImpl drawPolygon;
+	cpSpaceDebugDrawDotImpl drawDot;
+	cpSpaceDebugDrawFlags flags;
+	cpSpaceDebugColor shapeOutlineColor;
+	cpSpaceDebugDrawColorForShapeImpl colorForShape;
+	cpSpaceDebugColor constraintColor;
+	cpSpaceDebugColor collisionPointColor;
+	cpDataPointer data;
+};
+
+inline void bb_cpSpaceDebugDraw( cpSpace *space,bb_cpSpaceDebugDrawOptions *options ){
+	cpSpaceDebugDrawOptions opts=*(cpSpaceDebugDrawOptions*)options;
+	cpSpaceDebugDraw( space,&opts );
+};
+
+#endif

+ 8 - 10
modules/chipmunk/chipmunk_extern.monkey2

@@ -6,7 +6,8 @@ Namespace chipmunk
 #Import "<libc>"
 #Import "<libc>"
 
 
 #Import "Chipmunk7/include/*.h"
 #Import "Chipmunk7/include/*.h"
-#Import "<chipmunk/chipmunk.h>"
+
+#Import "chipmunk_extern.h"
 
 
 Extern
 Extern
 
 
@@ -17,9 +18,6 @@ Function cpMessage:Void( condition:CString, file:CString, line:Int, isError:Int,
 '***** File: Chipmunk7/include/chipmunk/chipmunk_types.h *****
 '***** File: Chipmunk7/include/chipmunk/chipmunk_types.h *****
 
 
 Alias cpFloat:Double
 Alias cpFloat:Double
-Struct MSVC_EVIL_FLOAT_HACK
-End
-Global INFINITY_HACK:MSVC_EVIL_FLOAT_HACK
 Function cpfmax:cpFloat( a:cpFloat, b:cpFloat )
 Function cpfmax:cpFloat( a:cpFloat, b:cpFloat )
 Function cpfmin:cpFloat( a:cpFloat, b:cpFloat )
 Function cpfmin:cpFloat( a:cpFloat, b:cpFloat )
 Function cpfabs:cpFloat( f:cpFloat )
 Function cpfabs:cpFloat( f:cpFloat )
@@ -27,12 +25,12 @@ Function cpfclamp:cpFloat( f:cpFloat, min:cpFloat, max:cpFloat )
 Function cpfclamp01:cpFloat( f:cpFloat )
 Function cpfclamp01:cpFloat( f:cpFloat )
 Function cpflerp:cpFloat( f1:cpFloat, f2:cpFloat, t:cpFloat )
 Function cpflerp:cpFloat( f1:cpFloat, f2:cpFloat, t:cpFloat )
 Function cpflerpconst:cpFloat( f1:cpFloat, f2:cpFloat, d:cpFloat )
 Function cpflerpconst:cpFloat( f1:cpFloat, f2:cpFloat, d:cpFloat )
-Alias cpHashValue:Int
-Alias cpCollisionID:Int
+Alias cpHashValue:libc.uintptr_t
+Alias cpCollisionID:libc.uint32_t
 Alias cpBool:UByte
 Alias cpBool:UByte
 Alias cpDataPointer:Void Ptr
 Alias cpDataPointer:Void Ptr
-Alias cpCollisionType:Int
-Alias cpGroup:Int
+Alias cpCollisionType:libc.uintptr_t
+Alias cpGroup:libc.uintptr_t
 Alias cpBitmask:UInt
 Alias cpBitmask:UInt
 Alias cpTimestamp:UInt
 Alias cpTimestamp:UInt
 Struct cpVect
 Struct cpVect
@@ -631,7 +629,7 @@ End
 Const CP_SPACE_DEBUG_DRAW_SHAPES:cpSpaceDebugDrawFlags
 Const CP_SPACE_DEBUG_DRAW_SHAPES:cpSpaceDebugDrawFlags
 Const CP_SPACE_DEBUG_DRAW_CONSTRAINTS:cpSpaceDebugDrawFlags
 Const CP_SPACE_DEBUG_DRAW_CONSTRAINTS:cpSpaceDebugDrawFlags
 Const CP_SPACE_DEBUG_DRAW_COLLISION_POINTS:cpSpaceDebugDrawFlags
 Const CP_SPACE_DEBUG_DRAW_COLLISION_POINTS:cpSpaceDebugDrawFlags
-Struct cpSpaceDebugDrawOptions
+Struct cpSpaceDebugDrawOptions="bb_cpSpaceDebugDrawOptions"
 	Field drawCircle:cpSpaceDebugDrawCircleImpl
 	Field drawCircle:cpSpaceDebugDrawCircleImpl
 	Field drawSegment:cpSpaceDebugDrawSegmentImpl
 	Field drawSegment:cpSpaceDebugDrawSegmentImpl
 	Field drawFatSegment:cpSpaceDebugDrawFatSegmentImpl
 	Field drawFatSegment:cpSpaceDebugDrawFatSegmentImpl
@@ -644,7 +642,7 @@ Struct cpSpaceDebugDrawOptions
 	Field collisionPointColor:cpSpaceDebugColor
 	Field collisionPointColor:cpSpaceDebugColor
 	Field data:cpDataPointer
 	Field data:cpDataPointer
 End
 End
-Function cpSpaceDebugDraw:Void( space:cpSpace Ptr, options:cpSpaceDebugDrawOptions Ptr )
+Function cpSpaceDebugDraw:Void( space:cpSpace Ptr, options:cpSpaceDebugDrawOptions Ptr )="bb_cpSpaceDebugDraw"
 
 
 '***** File: Chipmunk7/include/chipmunk/chipmunk.h *****
 '***** File: Chipmunk7/include/chipmunk/chipmunk.h *****
 
 

+ 34 - 3
modules/libc/libc.monkey2

@@ -33,10 +33,41 @@ End
 
 
 #rem monkeydoc C/C++ 'size_t' type
 #rem monkeydoc C/C++ 'size_t' type
 #end
 #end
-Struct size_t="size_t"
-End
+Alias size_t:UInt
+
+#rem monkeydoc C/C++ 'int8_t' type
+#end
+Alias int8_t:Byte
+
+#rem monkeydoc C/C++ 'uint8_t' type
+#end
+Alias uint8_t:UByte
+
+#rem monkeydoc C/C++ 'int16_t' type
+#end
+Alias int16_t:Short
+
+#rem monkeydoc C/C++ 'uint16_t' type
+#end
+Alias uint16_t:UShort
+
+#rem monkeydoc C/C++ 'int32_t' type
+#end
+Alias int32_t:Int
+
+#rem monkeydoc C/C++ 'uint32_t' type
+#end
+Alias uint32_t:UInt
+
+#rem monkeydoc C/C++ 'intptr_t' type
+#end
+Alias intptr_t:ULong
+
+#rem monkeydoc C/C++ 'uintptr_t' type
+#end
+Alias uintptr_t:ULong
 
 
-Function sizeof<T>:Int( t:T )="(int)sizeof"
+Function sizeof<T>:size_t( t:T )="sizeof"
 
 
 '***** stdio.h *****
 '***** stdio.h *****
 
 

+ 106 - 47
src/c2mx2/c2mx2.monkey2

@@ -18,11 +18,13 @@ Using libclang..
 Global tab:String
 Global tab:String
 Global buf:=New StringStack
 Global buf:=New StringStack
 
 
-Global CurrentFile:String
-
 Global params:String
 Global params:String
 Global enumid:String
 Global enumid:String
 
 
+Global CurrentFile:String
+
+Global Kludges:=New StringMap<String>
+
 Global AnonEnumType:="Int"
 Global AnonEnumType:="Int"
 Global LongType:="Long"
 Global LongType:="Long"
 Global ULongType:="ULong"
 Global ULongType:="ULong"
@@ -101,9 +103,36 @@ Function ErrInfo:String( cursor:CXCursor )
 End
 End
 
 
 Function Err( err:String,cursor:CXCursor )
 Function Err( err:String,cursor:CXCursor )
-	Print ErrInfo( cursor )+" : "+err
+	Print ErrInfo( cursor )+" : "+err+"~n"+GetSource( cursor )
+End
+
+Function GetSource:String( cursor:CXCursor )
+
+	Local range:=clang_getCursorExtent( cursor )
+
+	Local file0:CXFile,line0:UInt,column0:UInt,offset0:UInt
+	Local loc0:=clang_getRangeStart( range )
+	clang_getFileLocation( loc0,Varptr file0,Varptr line0,Varptr column0,Varptr offset0 )
+	Local path0:=String( clang_getFileName( file0 ) )
+	
+	Local file1:CXFile,line1:UInt,column1:UInt,offset1:UInt
+	Local loc1:=clang_getRangeEnd( range )
+	clang_getFileLocation( loc1,Varptr file1,Varptr line1,Varptr column1,Varptr offset1 )
+	Local path1:=String( clang_getFileName( file1 ) )
+	
+	If path0<>path1 Or offset1<=offset0 Return ""
+	
+	Global _src:String,_path:String
+	
+	If path0<>_path
+		_path=path0
+		_src=LoadString( _path )
+	Endif
+	
+	Return _src.Slice( offset0,offset1 )
 End
 End
 
 
+
 Function CursorSpelling:String( cursor:CXCursor )
 Function CursorSpelling:String( cursor:CXCursor )
 
 
 	Local id:=String( clang_getCursorSpelling( cursor ) )
 	Local id:=String( clang_getCursorSpelling( cursor ) )
@@ -131,6 +160,11 @@ Function TypeSpelling:String( type:CXType )
 
 
 	If Keywords.Contains( id ) id+="_"
 	If Keywords.Contains( id ) id+="_"
 	
 	
+	Select id
+	Case "size_t","int8_t","uint8_t","int16_t","uint16_t","int32_t","uint32_t","intptr_t","uintptr_t"
+		Return "libc."+id
+	End
+	
 	Return id
 	Return id
 End
 End
 
 
@@ -219,13 +253,45 @@ Function TransType:String( type:CXType,scope:String="" )
 		If scope And IsCStringType( type ) Return "CString"
 		If scope And IsCStringType( type ) Return "CString"
 		
 		
 		'can't return const pointers...
 		'can't return const pointers...
-		If scope="return" And clang_isConstQualifiedType( type ) Return ""
+		If clang_isConstQualifiedType( type )
+			If scope="return" Return ""
+		Endif
 	
 	
-		Local ptype:=TransType( clang_getPointeeType( type ) )
-		If ptype
-			If ptype.EndsWith( ")" ) Return ptype
-			Return ptype+" Ptr"
+		Local ptype:=clang_getPointeeType( type )
+		
+		'function pointer?
+		If ptype.kind=CXType_Unexposed And clang_getCanonicalType( ptype ).kind=CXType_FunctionProto
+		
+			Local retType:=TransType( clang_getResultType( ptype ),"return" )
+			If Not retType Return ""
+			
+			Local n:=clang_getNumArgTypes( ptype ),args:=""
+		
+			For Local i:=0 Until n
+			
+				Local type:=clang_getArgType( ptype,i )
+				
+				If type.kind=CXType_Pointer
+				
+					'isConstQualifiedType not working here?!?
+					If String( clang_getTypeSpelling( type ) ).StartsWith( "const " )
+						Print "***** Warning - function pointer type has const* parameters *****"
+						Print clang_getTypeSpelling( ptype )
+					Endif
+				Endif
+				
+				Local arg:=TransType( type,"param" )
+				If Not arg Return ""
+				If i args+=", "
+				args+=arg
+			Next
+					
+			Return retType+"( "+args+" )"
 		Endif
 		Endif
+
+		Local r:=TransType( ptype )
+		If r Return r+" Ptr"
+		Return ""
 	
 	
 	Case CXType_ConstantArray	'naughty!
 	Case CXType_ConstantArray	'naughty!
 	
 	
@@ -240,39 +306,6 @@ Function TransType:String( type:CXType,scope:String="" )
 	
 	
 		Local ptype:=TransType( clang_getElementType( type ) )
 		Local ptype:=TransType( clang_getElementType( type ) )
 		If ptype Return ptype+" Ptr"
 		If ptype Return ptype+" Ptr"
-	
-	Case CXType_Unexposed
-	
-		Local ctype:=clang_getCanonicalType( type )
-		
-		If ctype.kind=CXType_FunctionProto
-		
-			'Note: we use 'type' here because 'ctype' loses typedefs or something...
-			'
-			Local retType:=TransType( clang_getResultType( type ),"return" )
-				
-			If retType
-					
-				Local n:=clang_getNumArgTypes( type ),args:=""
-		
-				For Local i:=0 Until n
-					Local arg:=TransType( clang_getArgType( type,i ),"param" )
-					If Not arg Return ""
-					If i args+=", "
-					args+=arg
-				Next
-					
-				Return retType+"( "+args+" )"
-					
-			Endif
-		
-		Endif
-		
-		'Return TransType( ctype )
-
-'	Case CXType_LValueReference		'C++ time!
-	
-'		If clang_isConstQualifiedType( type ) Return TypeName( type )
 
 
 	End
 	End
 	
 	
@@ -342,6 +375,10 @@ End
 Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_data:CXClientData )
 Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_data:CXClientData )
 
 
 	Local srcloc:=clang_getCursorLocation( cursor )
 	Local srcloc:=clang_getCursorLocation( cursor )
+	
+'	If cursor.kind<>CXCursor_TypedefDecl And 
+	If clang_Location_isInSystemHeader( srcloc ) Return CXChildVisit_Continue
+	
 	Local cfile:CXFile,line:UInt
 	Local cfile:CXFile,line:UInt
 	clang_getFileLocation( srcloc,Varptr cfile,Varptr line,Null,Null )
 	clang_getFileLocation( srcloc,Varptr cfile,Varptr line,Null,Null )
 	Local file:=String( clang_getFileName( cfile ) )
 	Local file:=String( clang_getFileName( cfile ) )
@@ -376,8 +413,11 @@ Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_da
 		If id
 		If id
 			If clang_isCursorDefinition( cursor )
 			If clang_isCursorDefinition( cursor )
 
 
+				Local sym:=Kludges[id]
+				If sym sym="=~q"+sym+"~q"
+
 				SetFile( file )
 				SetFile( file )
-				buf.Push( tab+"Struct "+id )
+				buf.Push( tab+"Struct "+id+sym )
 			
 			
 				tab+="~t"
 				tab+="~t"
 				clang_visitChildren( cursor,VisitStruct,Null )
 				clang_visitChildren( cursor,VisitStruct,Null )
@@ -418,15 +458,19 @@ Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_da
 	
 	
 		Local id:=CursorSpelling( cursor )
 		Local id:=CursorSpelling( cursor )
 
 
-		Local type:=TransType( clang_getTypedefDeclUnderlyingType( cursor ) )
+		Local cxtype:=clang_getTypedefDeclUnderlyingType( cursor )
+		
+		Local type:=TransType( cxtype )
 		
 		
 		If type 
 		If type 
 			If type<>id
 			If type<>id
+
 				SetFile( file )
 				SetFile( file )
 				buf.Push( tab+"Alias "+id+":"+type )
 				buf.Push( tab+"Alias "+id+":"+type )
+
 			Endif
 			Endif
 		Else
 		Else
-			Err( "Failed to convert type for typedef: "+id,cursor )
+			Err( "Failed to convert typedef type: ",cursor )
 		Endif
 		Endif
 	
 	
 	Case CXCursor_FunctionDecl
 	Case CXCursor_FunctionDecl
@@ -443,8 +487,12 @@ Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_da
 			clang_visitChildren( cursor,VisitFunc,Null )
 			clang_visitChildren( cursor,VisitFunc,Null )
 			
 			
 			If params<>"?"
 			If params<>"?"
+			
+				Local sym:=Kludges[id]
+				If sym sym="=~q"+sym+"~q"
+			
 				SetFile( file )
 				SetFile( file )
-				buf.Push( tab+"Function "+id+":"+retType+"( "+params+" )" )
+				buf.Push( tab+"Function "+id+":"+retType+"( "+params+" )"+sym )
 			Else
 			Else
 				Err( "Failed to convert params for function: "+id,cursor )
 				Err( "Failed to convert params for function: "+id,cursor )
 			Endif
 			Endif
@@ -461,13 +509,16 @@ Function VisitUnit:CXChildVisitResult( cursor:CXCursor,parent:CXCursor,client_da
 		Local ptype:=TransType( type,"global" )
 		Local ptype:=TransType( type,"global" )
 		
 		
 		If ptype
 		If ptype
+
+			Local sym:=Kludges[id]
+			If sym sym="=~q"+sym+"~q"
 		
 		
 			SetFile( file )
 			SetFile( file )
 			
 			
 			If clang_isConstQualifiedType( type )
 			If clang_isConstQualifiedType( type )
-				buf.Push( "Const "+id+":"+ptype )
+				buf.Push( "Const "+id+":"+ptype+sym )
 			Else
 			Else
-				buf.Push( "Global "+id+":"+ptype )
+				buf.Push( "Global "+id+":"+ptype+sym )
 			Endif
 			Endif
 		Else
 		Else
 			Err( "Failed to convert type for var: "+id,cursor )
 			Err( "Failed to convert type for var: "+id,cursor )
@@ -570,6 +621,14 @@ Function Main()
 	If config.Contains( "anonEnumType" )
 	If config.Contains( "anonEnumType" )
 		AnonEnumType=config.GetString( "anonEnumType" )
 		AnonEnumType=config.GetString( "anonEnumType" )
 	Endif
 	Endif
+	
+	'kludges
+	If config.Contains( "kludges" )
+		For Local it:=Eachin config.GetArray( "kludges" )
+			Local name:=it.ToString()
+			Kludges[name]="bb_"+name
+		Next
+	Endif
 
 
 	'start clang	
 	'start clang	
 	Local index:=clang_createIndex( 1,1 )
 	Local index:=clang_createIndex( 1,1 )