A place to discuss everything related to Newton Dynamics.
Moderators: Sascha Willems, walaber
by Leadwerks » Sun Dec 07, 2008 2:26 pm
newtonmakelib
- Code: Select all
in:TStream=ReadFile("Newton.h")
out:TStream=WriteFile("Newton.bmx")
Type TNewtonFunc Extends TTypeDef
Global list:TList=New TList
Method New()
list.addlast(Self)
link.remove
EndMethod
EndType
Type TNewtonParameter
Field name$
Field ptype$
EndType
Type TTypeDef
Global list:TList=New TList
Field link:TLink
Field name$
Field returntype$
Field params:TList=New TList
Field paramstring$
Method New()
link=list.addfirst(Self)
EndMethod
Method EvaluateParams(s$)
Local sarr$[],parr$[]
sarr=s.split(",")
For n=0 To sarr.length-1
If Trim(sarr[n])<>""
param:TNewtonParameter=New TNewtonParameter
params.addlast(param)
parr=sarr[n].split("")
param.name=parr[parr.length-1]
r$=""
For m=0 To parr.length-2
r:+parr[m]
If m<parr.length-2 r:+" "
Next
Select r
Case "int","unsigned" param.ptype="Int"
Case "dFloat" param.ptype="Float"
Case "dFloat*","const dFloat*" param.ptype="Float Ptr"
Case "void*" param.ptype="Byte Ptr"
Case "size_t" param.ptype="Int"
Default
param.ptype="Byte Ptr"
For typedef:TTypeDef=EachIn TTypeDef.list
If typedef.name=r
param.ptype=""
param.name=typedef.name
If typedef.returntype<>"" param.name:+":"+typedef.returntype
param.name:+"("+typedef.paramstring+")"
Exit
EndIf
Next
EndSelect
If param.name.contains("*")
param.name=param.name.Replace("*","")
If param.ptype="Float" param.ptype="Float Ptr" Else param.ptype="Byte Ptr"
EndIf
param.name=param.name.Replace("[]","")
If param.name="end" param.name="_end"
If param.name="ptr" param.name="_ptr"
EndIf
Next
n=0
s$=""
For param:TNewtonParameter=EachIn params
s:+param.name
If param.ptype<>"" s:+":"
s:+param.ptype+","
n:+1
Next
If n s=Left(s,s.length-1)
paramstring=s
EndMethod
EndType
Local sarr:String[]
Local parr:String[]
Local farr:String[]
While Not in.Eof()
s$=ReadCLine(in)
If Trim(s)="" Continue
'Notify s
'If s.contains("NewtonCreateCollisionFromSerialization") Notify s
sarr=s.split("")
Select sarr[0]
Case "typedef"
If s.contains("(")
td:TTypeDef=New TTypeDef
'Return type
td.name=sarr[2]
parr=td.name.split(")")
td.name=parr[0]
parr=s.split("(")
params$=parr[2]
'Notify params
params=params.Replace("(","")
params=params.Replace(")","")
params=params.Trim()
td.name=td.name.Replace("(","")
td.name=td.name.Replace(")","")
td.name=td.name.Replace("*","")
td.name=td.name.Trim()
'Notify td.name
Select sarr[1]
Case "void" td.returntype=""
Case "int","unsigned" td.returntype="Int"
Case "void*" td.returntype="Byte Ptr"
Case "dFloat" td.returntype="Float"
Case "dFloat*" td.returntype="Float Ptr"
Default
td.returntype="Byte Ptr"
EndSelect
'Notify params
td.EvaluateParams params
'Notify td.paramstring
'td.name:+"("+td.paramstring+")"
'
'Notify td.name
'Print td.name
'If td.name.contains("*")
' td.name=td.name.Replace("*","")
' td.returntype="Byte Ptr"
'EndIf
EndIf
Case "NEWTON_API"
func:TNewtonFunc=New TNewtonFunc
'Function name
farr=sarr[2].split("(")
func.name=farr[0]
'Print func.name
'Return type
Select sarr[1]
Case "void" func.returntype=""
Case "int","unsigned" func.returntype="Int"
Case "void*" func.returntype="Byte Ptr"
Case "dFloat" func.returntype="Float"
Case "dFloat*" func.returntype="Float Ptr"
Default
func.returntype="Byte Ptr"
EndSelect
If func.name.contains("*")
func.name=func.name.Replace("*","")
func.returntype="Byte Ptr"
EndIf
'Parse parameters
sarr=s.split("(")
s=sarr[1]
sarr=s.split(")")
s=sarr[0]
func.EvaluateParams(s)
Rem
sarr=s.split(",")
For n=0 To sarr.length-1
If Trim(sarr[n])<>""
param:TNewtonParameter=New TNewtonParameter
func.params.addlast(param)
parr=sarr[n].split("")
param.name=parr[parr.length-1]
'Notify "!"+func.name+"!"
r$=""
For m=0 To parr.length-2
r:+parr[m]
If m<parr.length-2 r:+" "
Next
Select r
Case "int","unsigned" param.ptype="Int"
Case "dFloat" param.ptype="Float"
Case "dFloat*" param.ptype="Float Ptr"
Case "void*" param.ptype="Byte Ptr"
Default param.ptype="Byte Ptr"
EndSelect
If param.name.contains("*")
param.name=param.name.Replace("*","")
param.ptype="Byte Ptr"
EndIf
param.name=param.name.Replace("[]","")
If param.name="end" param.name="_end"
EndIf
Next
EndRem
EndSelect
Wend
in.close()
out.WriteLine "Import Pub.Win32"
out.WriteLine "Strict"
out.WriteLine ""
For func:TNewtonFunc=EachIn TNewtonFunc.list
s="Global "+func.name
If func.returntype<>"" s:+":"+func.returntype
s:+"("
Rem
n=0
For param:TNewtonParameter=EachIn func.params
s:+param.name
If param.ptype<>"" s:+":"
s:+param.ptype+","
n:+1
Next
If n s=Left(s,s.length-1)
EndRem
s:+func.paramstring
s:+") ~qc~q"
out.WriteLine s
Next
out.WriteLine ""
out.WriteLine "Function InitNewton:Int()"
out.WriteLine " Global hLib:Int"
out.WriteLine ""
out.WriteLine " Select hLib"
out.WriteLine " Case -1 Return"
out.WriteLine " Case 0 'Continue"
out.WriteLine " Default Return hLib"
out.WriteLine " EndSelect"
out.WriteLine " hLib=LoadLibraryA(~qNewton.dll~q)"
out.WriteLine " If Not hLib"
out.WriteLine " hLib=-1"
out.WriteLine " Return"
out.WriteLine " EndIf"
out.WriteLine ""
For func:TNewtonFunc=EachIn TNewtonFunc.list
out.WriteLine " "+func.name+"=GetProcAddress(hLib,~q"+func.name+"~q)"
Next
out.WriteLine ""
out.WriteLine " Return hLib"
out.WriteLine "EndFunction"
out.close()
End
Function ReadCLine:String(stream:TStream)
s$=""
Local sarr:String[]
Repeat
If stream.Eof() Return
c$=Trim(stream.ReadLine())
sarr=c.split("//")
c=sarr[0]
c=Trim(c)
s:+c
If Right(c,1)=";"
Return Left(s,s.length-1)
EndIf
Forever
EndFunction
-
Leadwerks
-
- Posts: 569
- Joined: Fri Oct 27, 2006 2:54 pm
Return to General Discussion
Who is online
Users browsing this forum: No registered users and 36 guests