Anzahl der Programmzeilen ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Anzahl der Programmzeilen ermitteln

Beitrag von SBond »

Hallo Leute.

Gibt es eine einfache Möglichkeit, die Programmzeilen zu ermitteln? Ich meine damit die Anzahl, die PureBasic auch beim Kompilieren oder bei der Syntax-Überprüfung ausgibt:
[17:10:49] [COMPILER] Syntax check finished (20244 lines)

In der PB-Hilfe bin ich auf folgendes gestoßen: #PB_Compiler_Line
Allerdings gibt diese Konstante nur die aktuelle Zeile zuück.

Habt ihr eine Idee?
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Anzahl der Programmzeilen ermitteln

Beitrag von NicTheQuick »

An welcher Stelle möchtest du das denn wissen? Zur Laufzeit? Zur Übersetzungszeit? Innerhalb eines IDE-Tools?
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Anzahl der Programmzeilen ermitteln

Beitrag von SBond »

Es wäre schön, wenn mir diese Information während der Laufzeit zur Verfügung steht.

Ich möchte in der lauffähigen Anwendung einige Informationen über den Quellcode einbetten. Das sind z.B. Informationen, über die verwendeten Module, Modulversionen. Die Anzahl der Programmzeilen (des kompletten Programms) wollte ich auch gerne mit aufnehmen.

viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Anzahl der Programmzeilen ermitteln

Beitrag von NicTheQuick »

Wäre das eine Variante die dir gefällt?

Code: Alles auswählen

Global programLines.i
Gosub getProgramLines

; Hier
; der
; komplette
; Code.

Debug programLines

; Hier
; noch
; mehr
; Code.

End
getProgramLines:
programLines = #PB_Compiler_Line + 1
Return
Ansonsten wäre es am einfachsten, sich ein Tool zu schreiben, was das erledigt und automatisch die ermittelten Werte in Konstanten in den Code einfügt, bevor er kompiliert wird.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Anzahl der Programmzeilen ermitteln

Beitrag von SBond »

...das klappt leider nicht bei mir <)

Ich habe bei mir Programmcode ausgelagert, die ich in der Hauptdatei inkludiere. Diese werden von #PB_Compiler_Line nicht mitgezählt, sondern nur die Zeilen der aktuellen Datei.

Naja... notfalls muss ich den Wert immer von Hand in eine Variable eintragen.
Nochmals danke für deinen Ratschlag.

viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Sicro
Beiträge: 969
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Anzahl der Programmzeilen ermitteln

Beitrag von Sicro »

Mit einem Werkzeug für die Purebasic-IDE lässt sich das realisieren:

Code: Alles auswählen

; ######################################################################
; Tool zweimal zu den Werkzeugen hinzufügen!
;
; Werkzeug-Einstellungen:
;   Argumente: "%FILE %COMPILEFILE" (ohne "") eintragen
;   Checkbox "Warten bis zum Beenden des Werkzeugs" anhaken
;   Checkbox "Werkzeug vom Hauptmenü verstecken" anhaken
;   1. Eintrag >> Ereignis auf "Vor dem Erstellen des Executable" setzen
;   2. Eintrag >> Ereignis auf "Vor dem Kompilieren/Starten" setzen
; ######################################################################

Global NewList Macros.s()
Global CountOfAllCodeLines
Global CodeFileFolderPath.s  = GetPathPart(ProgramParameter(0)) ; GetPathPart(%FILE)
Global CompileCodeFilePath.s = ProgramParameter(1)              ; %COMPILEFILE

Procedure.s RemoveLeadingTabsAndWhiteSpacesFromString(String.s)
  Repeat
    If Left(String, 1) = " "
      String = LTrim(String)
    ElseIf Left(String, 1) = #TAB$
      String = LTrim(String, #TAB$)
    Else
      Break
    EndIf
  ForEver
  ProcedureReturn String
EndProcedure

Procedure.i IsAbsolutePath(Path.s)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      If Mid(Path, 2, 1) = ":"
        ProcedureReturn #True
      EndIf
    CompilerDefault
      If Left(Path, 1) = "/"
        ProcedureReturn #True
      EndIf
  CompilerEndSelect
EndProcedure

Procedure.s AddEndSlash(Path.s)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      If Right(Path, 1) <> "\": Path + "\": EndIf
    CompilerDefault
      If Right(Path, 1) <> "/": Path + "/": EndIf
  CompilerEndSelect
  ProcedureReturn Path
EndProcedure

Procedure ScanPBCodeFile(FilePath.s)
  Protected.i File, BOM
  Protected.s LineText
  
  File = ReadFile(#PB_Any, FilePath, #PB_File_SharedRead)
  If IsFile(File)
    BOM = ReadStringFormat(File)
    
    While Not Eof(File)
      LineText = ReadString(File, BOM)
      
      ; IDE-Einstellungen am Code-Ende überspringen
      If Left(LineText, 25) = "; IDE Options = PureBasic"
        Continue
      EndIf
      
      LineText = RemoveLeadingTabsAndWhiteSpacesFromString(LineText) ; evtl. Tabs oder Leerzeichen entfernen
      CountOfAllCodeLines + 1
      
      ; Macros auslesen
      If Left(LCase(LineText), 5) = "macro"
        LineText = Mid(LineText, 6) ; "macro" entfernen
        LineText = RemoveLeadingTabsAndWhiteSpacesFromString(LineText) ; evtl. Tabs oder Leerzeichen entfernen
        AddElement(Macros())
        Macros() = LineText
        Continue
      EndIf
      
      ; IncludePath auslesen
      If Left(LCase(LineText), 11) = "includepath"
        LineText = Mid(LineText, 12)                                   ; "includepath" entfernen
        LineText = RemoveLeadingTabsAndWhiteSpacesFromString(LineText) ; evtl. Tabs oder Leerzeichen entfernen
        LineText = Mid(LineText, 2)                                    ; Anführungszeichen entfernen
        LineText = Left(LineText, FindString(LineText, #DQUOTE$) - 1)  ; Anführungszeichen am Ende und den Rest entfernen
        If IsAbsolutePath(LineText)
          FilePath = AddEndSlash(LineText)
        Else
          If FilePath = CompileCodeFilePath
            FilePath = CodeFileFolderPath
          EndIf
          FilePath = AddEndSlash(GetPathPart(FilePath) + LineText)
        EndIf
        Continue
      EndIf
      
      ; IncludeFile und XIncludeFile auslesen
      ;TODO: XInclude: kein mehrfaches Hinzufügen beachten
      LineText = ReplaceString(LineText, "XIncludeFile", "IncludeFile")
      If Left(LCase(LineText), 11) = "includefile"
        LineText = Mid(LineText, 12) ; "includefile" entfernen
        LineText = RemoveLeadingTabsAndWhiteSpacesFromString(LineText) ; evtl. Tabs oder Leerzeichen entfernen
        LineText = Mid(LineText, 2)                                    ; Anführungszeichen entfernen
        LineText = Left(LineText, FindString(LineText, #DQUOTE$) - 1)  ; Anführungszeichen am Ende und den Rest entfernen
        If IsAbsolutePath(LineText)
          ScanPBCodeFile(LineText)                                     ; Include-File rekursive auslesen
        Else
          If FilePath = CompileCodeFilePath
            FilePath = CodeFileFolderPath
          EndIf
          ScanPBCodeFile(GetPathPart(FilePath) + LineText)             ; Include-File rekursive auslesen
        EndIf
      EndIf
    Wend
    
    CloseFile(File)
  EndIf
EndProcedure

Define.i File, BOM
Define.s FileContent, Macros

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    #LineFeed = #CRLF$
  CompilerDefault
    #LineFeed = #LF$
CompilerEndSelect

ScanPBCodeFile(CompileCodeFilePath)

File = ReadFile(#PB_Any, CompileCodeFilePath, #PB_File_SharedRead)
If IsFile(File)
  BOM = ReadStringFormat(File)
  FileContent = ReadString(File, BOM | #PB_File_IgnoreEOL)
  CloseFile(File)
  
  ; Variable "%CountOfAllCodeLines%" ersetzen
  FileContent = ReplaceString(FileContent, "%CountOfAllCodeLines%", Str(CountOfAllCodeLines))
  
  ; Variable "%ListOfAllMacros%" ersetzen
  ForEach Macros()
    Macros + Macros() + #DQUOTE$ + " + #CRLF$ + " + #LineFeed + #DQUOTE$
  Next
  Macros = RTrim(Macros, " + #CRLF$ + " + #LineFeed + #DQUOTE$)
  FileContent = ReplaceString(FileContent, "%ListOfAllMacros%", Macros)
  
  ; Änderungen in Datei schreiben
  File = CreateFile(#PB_Any, CompileCodeFilePath)
  If IsFile(File)
    WriteStringFormat(File, BOM)
    WriteString(File, FileContent, BOM)
    CloseFile(File)
  EndIf
EndIf
Test-Code:

Code: Alles auswählen

Macro TestMacro1
  "test"
EndMacro

Macro TestMacro2
  "test"
EndMacro

z = a + b

;IncludeFile "TestCode2.pbi"

MessageRequester("Code-Informationen", "Code-Zeilen: %CountOfAllCodeLines%" + #CRLF$ + #CRLF$ + "Enhaltene Macros:" + #CRLF$ + "%ListOfAllMacros%")
liefert die Ausgabe:
Code-Zeilen: 13

Enhaltene Macros:
TestMacro1
TestMacro2
Include-Dateien können wieder welche enthalten (Stichwort: rekursiv)

Update 24.08.14
* Rekursiver Scan der Include-Dateien funktioniert nun korrekt
* IncludePath-Unterstützung hinzugefügt
* Pfadangabe von IncludePath und (X)IncludeFile kann nun auch absolut sein
Zuletzt geändert von Sicro am 25.08.2014 18:07, insgesamt 4-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Anzahl der Programmzeilen ermitteln

Beitrag von SBond »

cool.

vielen Dank. Die rekursive Suche scheint zwar nicht zu funktionieren, aber damit bekomme ich es bestimmt gelöst. Mit den Werkzeugen habe ich in PB noch nie gearbeitet. Dennoch scheint es genau das richtige zu sein.
...jetzt weiß ich wie ich da rangehe

vielen Dank für eure Hilfe <)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Sicro
Beiträge: 969
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Anzahl der Programmzeilen ermitteln

Beitrag von Sicro »

SBond hat geschrieben:Die rekursive Suche scheint zwar nicht zu funktionieren [...]
Ohje, da hast du Recht. Die "%COMPILEFILE"-Datei wird im Temp-Verzeichnis erstellt und da ich den Pfad zur Include-Datei relativ von dieser Datei zusammenbaue, wird die Include-Datei relativ vom Temp-Verzeichnis gesucht. Beim Testen hat alles prima geklappt, weil ich die Include-Datei im Temp-Verzeichnis erstellt hatte. Ich werde den Code nachher korrigieren.
SBond hat geschrieben:Mit den Werkzeugen habe ich in PB noch nie gearbeitet.
Ging mir ähnlich, daher wollte ich mich damit jetzt mal intensiver beschäftigen.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten