Convert Newton header to BlitzMax code

A place to discuss everything related to Newton Dynamics.

Moderators: Sascha Willems, walaber

Convert Newton header to BlitzMax code

Postby 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
User avatar
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 14 guests

cron