Yes, i agree.
Maybe some of you might be interested to look at this 'PureLibraries Explorer' (quickly made just for fun) :
Code: Select all
;-
;- PureLibraries Explorer
;- flype, 2006
;-
EnableExplicit
;-
;-
Macro PeekA(x)
PeekS(x, -1, #PB_Ascii)
EndMacro
Macro PeekU(x)
PeekS(x, -1, #PB_Unicode)
EndMacro
;-
;-
Enumeration ; SizeOf
#LByte = SizeOf(Byte)
#LWord = SizeOf(Word)
#LLong = SizeOf(Long)
EndEnumeration
Enumeration ; #ID_
#ID_PURE = 'PURE'
#ID_RES3 = 'RES3'
#ID_RES4 = 'RES4'
#ID_LIB3 = 'LIB3'
#ID_LIB4 = 'LIB4'
#ID_DAT1 = 'DAT1'
#ID_EDLL = 'EDLL'
#ID_ARCH = $0A3E686372613C21
EndEnumeration
Structure CHUNK
StructureUnion
Chunk64.q
Chunk32.LARGE_INTEGER
EndStructureUnion
ChunkName.l
ChunkData.Byte[0]
EndStructure
Structure LIB3FUNC
name.s
help.s
nArg.l
EndStructure
Structure LIB3
name.s
help.s
nFuncs.l
nSysLibs.l
nPureLibs.l
SysLibs.s[255]
PureLibs.s[255]
func.LIB3FUNC[255]
EndStructure
;-
;-
Procedure.l arch(*addr.CHUNK)
Debug "ARCH"
EndProcedure
Procedure.l res3(*addr.CHUNK)
Debug "RES3"
EndProcedure
Procedure.l res4(*addr.CHUNK)
Debug "RES4"
EndProcedure
Procedure.l lib3(*addr.CHUNK)
Protected i.l, x.LIB3
;- Header
*addr = *addr\ChunkData + #LLong
x\name = PeekA(*addr)
*addr + Len(x\name) + #LByte + #LByte
;- System Libs
x\nSysLibs = PeekB(*addr) : *addr + #LByte
If x\nSysLibs
For i = 0 To x\nSysLibs - 1
x\SysLibs[i] = PeekA(*addr) : *addr + Len(x\SysLibs[i]) + #LByte
Next
EndIf
*addr + #LByte
;- Inline Help
x\help = PeekA(*addr) : *addr + Len(x\help) + #LByte
;- PureBasic Libs
x\nPureLibs = PeekB(*addr) : *addr + #LByte
If x\nPureLibs
For i = 0 To x\nPureLibs - 1
x\PureLibs[i] = PeekA(*addr) : *addr + Len(x\PureLibs[i]) + #LByte
Next
EndIf
;- Functions
i = 0
While *addr\Chunk32\lowpart <> #ID_PURE And *addr\ChunkName <> #ID_DAT1
x\func[i]\name = PeekA(*addr) : *addr + #LByte + Len(x\func[i]\name)
x\func[i]\nArg = PeekB(*addr) : *addr + #LByte : *addr + (x\func[i]\nArg * #LByte) + #LLong
x\func[i]\help = PeekA(*addr) : *addr + #LByte + Len(x\func[i]\help)
i + 1
Wend
x\nFuncs = i
;- Populate the TreeGadget
AddGadgetItem(0, -1, x\name, #Null, 0)
AddGadgetItem(0, -1, "Help File: " + x\help, #Null, 1)
AddGadgetItem(0, -1, "SystemLibs (" + Str(x\nSysLibs) + ")", #Null, 1)
If x\nSysLibs
For i = 0 To x\nSysLibs - 1
AddGadgetItem(0, -1, x\SysLibs[i], #Null, 2)
Next
Else
AddGadgetItem(0, -1, "None", #Null, 2)
EndIf
AddGadgetItem(0, -1, "PureLibs (" + Str(x\nPureLibs) + ")", #Null, 1)
If x\nPureLibs
For i = 0 To x\nPureLibs - 1
AddGadgetItem(0, -1, x\PureLibs[i], #Null, 2)
Next
Else
AddGadgetItem(0, -1, "None", #Null, 2)
EndIf
AddGadgetItem(0, -1, "Functions (" + Str(x\nFuncs) + ")", #Null, 1)
If x\nFuncs
For i = 0 To x\nFuncs - 1
If x\func[i]\help
AddGadgetItem(0, -1, x\func[i]\name + x\func[i]\help, #Null, 2)
EndIf
Next
Else
AddGadgetItem(0, -1, "None", #Null, 2)
EndIf
AddGadgetItem(0, -1, "Hidden Functions", #Null, 1)
For i = 0 To x\nFuncs - 1
If Not x\func[i]\help
AddGadgetItem(0, -1, x\func[i]\name, #Null, 2)
EndIf
Next
;-
EndProcedure
Procedure.l lib4(*addr.CHUNK)
Debug "LIB4"
EndProcedure
Procedure.l edll(*addr.CHUNK)
Debug "EDLL"
EndProcedure
Procedure.l pure(*addr.CHUNK)
If *addr\Chunk64 = #ID_ARCH
arch(*addr)
Else
If *addr\Chunk32\lowpart = #ID_PURE
If *addr\Chunk32\highpart = #ID_EDLL
edll(*addr)
Else
Select *addr\ChunkName
Case #ID_RES3: res3(*addr)
Case #ID_RES4: res4(*addr)
Case #ID_LIB3: lib3(*addr)
Case #ID_LIB4: lib4(*addr)
EndSelect
EndIf
EndIf
EndIf
EndProcedure
Procedure.l open(fileName.s)
Protected id.l, *addr
id = ReadFile(#PB_Any, fileName)
If id
*addr = AllocateMemory(Lof(id))
If *addr
If ReadData(id, *addr, Lof(id))
pure(*addr)
EndIf
FreeMemory(*addr)
EndIf
CloseFile(id)
EndIf
EndProcedure
Procedure.l enum(pathName.s)
Protected id.l = ExamineDirectory(#PB_Any, pathName, "*.*")
While NextDirectoryEntry(id)
Select DirectoryEntryType(id)
Case #PB_DirectoryEntry_File
open(pathName + DirectoryEntryName(id))
Case #PB_DirectoryEntry_Directory
Select DirectoryEntryName(id)
Case ".", ".."
; do nothing
Default
enum(pathName + DirectoryEntryName(id) + "\")
EndSelect
EndSelect
Wend
EndProcedure
;-
;-
If OpenWindow(0, 0, 0, 640, 480, "PureLibraries Explorer", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
TreeGadget(0, 5, 5, 630, 470)
EndIf
enum(#PB_Compiler_Home + "PureLibraries\")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf
;-
;-