Meine neue Version von GetPBInfo.pb für PureBasic 5.10 gibt nun auch über 13.700 Konstanten aus (CONSTANTLIST ist neu ab PB 5.10):
Code: Alles auswählen
;
; GetPBInfo.pb
;
; by Danilo
;
; Version: PureBasic 5.10
;
; [X] Create temporary executable in the source directory
; [ ] Create unicode executable
;
CompilerIf #PB_Compiler_Unicode
CompilerError "Please turn off compiler option 'Create unicode executable'"
CompilerEndIf
EnableExplicit
#Compiler = #PB_Compiler_Home+"compilers\pbcompiler.exe"
Procedure StartCompiler()
ProcedureReturn RunProgram(#Compiler,"/STANDBY","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)
EndProcedure
Procedure StopCompiler(compiler)
WriteProgramStringN(compiler, "END")
WaitProgram(compiler,5000)
CloseProgram(compiler)
EndProcedure
Procedure SendCompilerCommand(compiler,command$)
If ProgramRunning(compiler)
WriteProgramStringN(compiler, command$)
EndIf
EndProcedure
Procedure.s GetCompilerOutput(compiler)
If AvailableProgramOutput(compiler)
ProcedureReturn ReadProgramString(compiler)
EndIf
EndProcedure
Procedure FillList(compiler,List out.s(),space=0)
Protected out$
Protected space$=Space(space)
While out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR"
out$=GetCompilerOutput(compiler)
If out$ And out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR" And FindString("0123456789",Mid(out$,1,1))=0
AddElement(out())
out()=space$+out$
EndIf
Wend
EndProcedure
Procedure FillConstantList(compiler,List out.s(),space=0)
Protected out$
Protected space$=Space(space)
While out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR"
out$=GetCompilerOutput(compiler)
If out$<>"" And out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR" And FindString("0123456789",Mid(out$,2,1))=0
If FindString("01",Mid(out$,1,1))
out$ = "#"+Mid(out$,2,Len(out$)-1)
out$ = ReplaceString(out$,#TAB$," = ")
out$ = ReplaceString(out$,"# = ","#")
ElseIf FindString("2",Mid(out$,1,1))
Protected i, found_non_printable = #False
Protected oldout$ = out$
Protected sconst_value$ = StringField(oldout$,3,Chr(9))
out$ = "#"+StringField(oldout$,2,#TAB$)
For i = 1 To Len(sconst_value$)
If Asc(Mid(sconst_value$,i)) < 32 Or Asc(Mid(sconst_value$,i)) > 126
found_non_printable = #True
EndIf
Next i
If out$ = "#TAB$"
out$ + " = Chr(9)"
ElseIf out$ = "#HT$"
out$ + " = Chr(9)"
ElseIf out$ = "#CRLF$"
out$ + " = Chr(13) + Chr(10)"
ElseIf out$ = "#LFCR$"
out$ + " = Chr(10) + Chr(13)"
ElseIf out$ = "#LF$"
out$ + " = Chr(10)"
ElseIf out$ = "#CR$"
out$ + " = Chr(13)"
ElseIf out$ = "#DOUBLEQUOTE$"
out$ + " = Chr(34)"
ElseIf out$ = "#DQUOTE$"
out$ + " = Chr(34)"
ElseIf found_non_printable = #False
out$ + " = " + #DQUOTE$ + StringField(oldout$,3,#TAB$) + #DQUOTE$
Else
out$ + " ="
Protected temp$ = StringField(oldout$,3,#TAB$)
For i = 0 To Len(sconst_value$)-1
out$ + " Chr("+Str(PeekB(@temp$+(i*SizeOf(Character)))) + ") +"
Next
EndIf
out$ = RTrim(out$,"+")
out$ = Trim(out$)
Else
Debug out$
EndIf
out$ = Trim(out$)
If out$
AddElement(out())
out()=space$+out$
EndIf
EndIf
Wend
EndProcedure
Procedure GetStructureList(compiler,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"STRUCTURELIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetProcedureList(compiler,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"FUNCTIONLIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetConstantsList(compiler,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"CONSTANTLIST")
FillConstantList(compiler,out())
EndIf
EndProcedure
Procedure GetInterfaceList(compiler,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"INTERFACELIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetStructureInfo(compiler,struct$,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"STRUCTURE"+#TAB$+struct$)
FillList(compiler,out(),4)
EndIf
EndProcedure
Procedure GetInterfaceInfo(compiler,interf$,List out.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"INTERFACE"+#TAB$+interf$)
FillList(compiler,out(),4)
EndIf
EndProcedure
Procedure WaitCompilerReady(compiler)
Protected out$
While out$<>"READY" And Left(out$,5)<>"ERROR"
out$ = GetCompilerOutput(compiler)
If out$
Debug out$
EndIf
Wend
EndProcedure
Define pb, out$
NewList constants.s()
NewList structures.s()
NewList procedures.s()
NewList interfaces.s()
NewList structureInfo.s()
NewList interfaceInfo.s()
pb = StartCompiler()
If pb
WaitCompilerReady(pb)
GetStructureList(pb,structures())
Debug "found "+Str(ListSize(structures()))+" structures"
GetProcedureList(pb,procedures())
Debug "found "+Str(ListSize(procedures()))+" procedures"
GetConstantsList(pb,constants())
Debug "found "+Str(ListSize(constants()))+" constants"
SortList(constants(),#PB_Sort_Ascending|#PB_Sort_NoCase)
GetInterfaceList(pb,interfaces())
Debug "found "+Str(ListSize(interfaces()))+" interfaces"
ClearList(structureInfo())
ForEach structures()
AddElement(structureInfo())
structureInfo()="Structure "+structures()
GetStructureInfo(pb,structures(),structureInfo())
AddElement(structureInfo())
structureInfo()="EndStructure"
AddElement(structureInfo())
structureInfo()=""
Next
ClearList(interfaceInfo())
ForEach interfaces()
AddElement(interfaceInfo())
interfaceInfo()="Interface "+interfaces()
GetInterfaceInfo(pb,interfaces(),interfaceInfo())
AddElement(interfaceInfo())
interfaceInfo()="EndInterface"
AddElement(interfaceInfo())
interfaceInfo()=""
Next
If CreateFile(0,GetPathPart(ProgramFilename())+"Structures.pb")
ForEach structureInfo()
WriteStringN(0,structureInfo())
Next
CloseFile(0)
EndIf
If CreateFile(0,GetPathPart(ProgramFilename())+"Interfaces.pb")
ForEach interfaceInfo()
WriteStringN(0,interfaceInfo())
Next
CloseFile(0)
EndIf
If CreateFile(0,GetPathPart(ProgramFilename())+"Constants.pb")
ForEach constants()
WriteStringN(0,constants())
Next
CloseFile(0)
EndIf
If CreateFile(0,GetPathPart(ProgramFilename())+"Procedures.pb")
ForEach procedures()
WriteStringN(0,procedures())
Next
CloseFile(0)
EndIf
StopCompiler(pb)
Debug "DONE."
EndIf