Code archives/File Utilities/.decls Converter
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Basically, this is an application to convert Blitz3D/Plus .decls files to useable BlitzMax source code. There is an optional flag you can pass to it -- '/u'. This sets it up so that it calls LoadLibraryW instead of LoadLibraryA. By default it is not enabled since Pub.Win32 doesn't have it declared. This is by and large dependent on your code, which is why it isn't enabled by default. To use it you just compile it and drag decls files onto it. Simple as that, nothing hard. | |||||
SuperStrict
Framework Brl.Blitz
Import Brl.Filesystem
Import Brl.Stream
Import Brl.LinkedList
Global libs:TList = New TList
Global mode$="A"
For Local i:Int = 1 To AppArgs.Length-1
If AppArgs[i].ToLower( ) = "/u" Then
AppArgs[i] = ""
mode = "W"
EndIf
Next
For Local i:Int = 1 To AppArgs.Length-1
If AppArgs[i].Length = 0 Then Continue
ProcessDecl( AppArgs[i] )
Next
End
Type TFunc
Field sym$
Field decl$
Method Format$( s$ )
Return s.Replace( "$(SYM)", sym )..
.Replace( "$(DECL)", decl )
End Method
Function Create:TFunc( decl$, symbol$ )
Local f:TFunc = New TFunc
f.sym = symbol
f.decl = decl
Return f
End Function
End Type
Type TLib
Method New( )
link = libs.AddLast( Self )
funcs = New TList
End Method
Method Dispose( )
funcs.Clear( )
funcs = Null
link.Remove( )
link = Null
lib = Null
End Method
Field lib$
Field funcs:TList
Field link:TLink
End Type
Function ProcessDecl( declPath$ )
Local s:TStream = ReadStream( declPath )
Local lib:TLib
While Not s.Eof( )
Local l$ = s.ReadLine( ).Trim( )
Local cf% = l.Find( ";" )
If cf <> -1 Then l = l[..cf].Trim( )
If l.Length = 0 Then Continue
If l[0] = 46 Then ' Set lib
If lib Then
If lib.funcs.Count( ) = 0 Or lib.lib = "." Then
lib.Dispose( )
lib = Null
EndIf
EndIf
Local qb% = l.Find( "~q" )+1 ' Quote begin
If qb = 0 then Continue
Local qe% = l.Find( "~q", qb ) ' Quote end
If qe = -1 Then Continue
lib = New TLib
lib.lib = l[qb..qe]
ElseIf lib Then ' Parse function
Local s$[] = SplitString( l, ":~q" )
lib.funcs.AddLast( TFunc.Create( s[0].Replace("*","@ Ptr").Replace("$","$z"), s[1] ) )
EndIf
Wend
s.Close( )
lib = Null
s = WriteStream( StripExt(declPath)+".bmx" )
s.WriteLine( "Strict" )
s.WriteLine( "Import Pub.Win32" )
s.WriteLine( "" )
s.WriteLine( "Private" )
s.WriteLine( "Local lib%" )
s.WriteLine( "" )
s.WriteLine( "Public" )
For lib = EachIn libs
s.WriteLine( "" )
s.WriteLine( "lib = LoadLibrary"+mode+"(~q"+lib.lib+"~q)" )
s.WriteLine( "" )
For Local f:TFunc = EachIn lib.funcs
s.WriteLine( f.Format( "Global $(DECL) = GetProcAddress(lib, ~q$(SYM)~q)" ) )
Next
s.WriteLine( "" )
s.WriteLine( "lib = 0" )
Next
s.Close( )
s = Null
ClearLibs( )
End Function
Function ClearLibs( )
For Local i:TLib = EachIn libs
i.Dispose( )
Next
libs.Clear( )
End Function
Function SplitString$[]( s$, sp$ )
Local p:Int, l:Int, o$[32], x%
Local n:Int
For n = 0 To s.Length - 1
Local lx% = x
For p = 0 To sp.Length - 1
If s[n] = sp[p] Then
If x = o.Length Then o = o[..o.Length*2]
o[x] = s[l..n+(n = s.Length-1 And (Not (s[n]=sp[p])))].Trim( )
l = n+1
If o[x].Length=0 Then Exit
x :+ 1
Exit
EndIf
Next
If x <> lx Then Continue
If n = s.Length-1 Then
If x = o.Length Then o = o[..o.Length*2]
o[x] = s[l..n+(n = s.Length-1 And (Not (s[n]=sp[p])))].Trim( )
If o[x].Length = 0 Then Exit
x :+ 1
EndIf
Next
If x = 0 Then Return Null
Return o[0..x]
End Function |
Comments
| ||
| Excellent. Thanks, Noel. I was hoping for some way to get back all those old Decls files! |
| ||
| Banned or not, Noel, thank you so much - this is exactly what I've been trying to find forever. |
Code Archives Forum