Userlibs analysieren (von El_Choni)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Userlibs analysieren (von El_Choni)

Beitrag von Kiffi »

Hallo,

im englischen Forum hat El_Choni einen schönen Code gepostet, mit dem
man die Funktionen einer Userlib detailiert auflisten kann:

Code: Alles auswählen

Structure finfo
  FunName.s
  Args.s
  HelpLine.s
EndStructure

NewList allfunctions.finfo()

Structure Seeker
  StructureUnion
    b.b
    w.w
    l.l
  EndStructureUnion
EndStructure

Procedure ShowLibInfo(LibFile$)
  LibName$ = GetFilePart(LibFile$)
  If ReadFile(0, LibFile$)
    LibSize = Lof()
    *LibHeader = AllocateMemory(LibSize)
    ReadData(*LibHeader, LibSize)
    CloseFile(0)
    *LibEnd = *LibHeader+LibSize
    *LHSeeker.Seeker = *LibHeader
    If *LHSeeker\l='PURE' And PeekL(*LHSeeker+8)='LIB3' And PeekL(*LHSeeker+16)='3BIL'
      *LHSeeker.Seeker = *LibHeader+20
      While *LHSeeker\b<>0:*LHSeeker+1:Wend
      *LHSeeker+2
      If *LHSeeker>=*LibEnd:ProcedureReturn:EndIf
      nDLL = *LHSeeker\b
      If nDLL
        For i=1 To nDLL
          *LHSeeker+1
          DLL$+", "+PeekS(*LHSeeker)
          *LHSeeker+Len(PeekS(*LHSeeker))
        Next i
        DLL$ = Right(DLL$, Len(DLL$)-2)
        *LHSeeker+1
      EndIf
      *LHSeeker+1
      While *LHSeeker\b<>0:*LHSeeker+1:Wend
      *LHSeeker+1
      If *LHSeeker>=*LibEnd:ProcedureReturn:EndIf
      nPL = *LHSeeker\b
      If nPL
        For i=1 To nPL
          *LHSeeker+1
          nPL$+", "+PeekS(*LHSeeker)
          *LHSeeker+Len(PeekS(*LHSeeker))
        Next i
        nPL$ = Right(nPL$, Len(nPL$)-2)
      EndIf
      *LHSeeker+1
      If *LHSeeker>=*LibEnd:ProcedureReturn:EndIf
      While PeekL(*LHSeeker)<>'PURE' And PeekL(*LHSeeker+8)<>'DAT1'
        AddElement(allfunctions())
        allfunctions()\FunName = PeekS(*LHSeeker)
        *LHSeeker+Len(allfunctions()\FunName)+1
        *LHSeeker+*LHSeeker\b+5
        While *LHSeeker\b=0:*LHSeeker+1:Wend
        allfunctions()\Args = ""
        allfunctions()\HelpLine = ""
        If *LHSeeker\b='('
          arging = 1
          While *LHSeeker\b<>0
            If *LHSeeker\b='-'
              arging = 0
            EndIf
            If arging
              allfunctions()\Args+Chr(*LHSeeker\b)
            Else
              allfunctions()\HelpLine+Chr(*LHSeeker\b)
            EndIf
            *LHSeeker+1
          Wend
          allfunctions()\Args = LTrim(RTrim(allfunctions()\Args))
          allfunctions()\HelpLine = LTrim(RTrim(RemoveString(allfunctions()\HelpLine, "- ")))
          *LHSeeker+1
        EndIf
      Wend
    EndIf
    FreeMemory(*LibHeader)
  EndIf
  Debug "Library: "+LibName$
  Debug "PureLibraries used: "+nPL$
  Debug "DLLs used: "+DLL$
  ForEach allfunctions()
    Debug ""
    Debug "Function: "+allfunctions()\FunName
    Debug "Arguments: "+allfunctions()\Args
    Debug "Quick help: "+allfunctions()\HelpLine
  Next
  ClearList(allfunctions())
EndProcedure

Lib$ = "E:\Archivos de programa\PureBasic\PureLibraries\GadgetExtension"

ShowLibInfo(Lib$)
Grüße ... Kiffi