PBLC - Line Count

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

PBLC - Line Count

Message par flaith »

Salutation,

un petit programme en mode console permettant de compter le nombre effectifs de lignes de code d'un programme Purebasic, avec possibilité de faire un total sur +sieurs fichiers.

Il compte chaque ligne du programme en ne comptabilisant pas les lignes avec commentaire seule ou lignes vides.

J'ai fait ce programme pour connaitre le nombre total de ligne du programme que je suis entrain de faire.

Code : Tout sélectionner

; *****************************
; ***                       ***
; ***   pblc - count line   ***
; ***                       ***
; *****************************
;
; count effectives lines of PureBasic programs without remarks and empty lines
; and count number of procedures

Global argc.i, thefile.s, totline.i, totproc.i

Procedure.i Get_NBLINE(thefile.s)
Protected NewList line_prg.s(), tmp.s
Protected ligne.i = 0, proc.i = 0, i.i = 1
Protected rem.i = #False : car.i = #False

  ClearList(Line_prg())
  
  If ReadFile(0, thefile)
    While Eof(0) = 0
      tmp = ReadString(0)
      AddElement(Line_prg())
        line_prg() = tmp
    Wend
    CloseFile(0)
  Else
    PrintN("Unable to read " + thefile)
    End
  EndIf
  
  ResetList(line_prg())
  ForEach line_prg()
    l = Len(line_prg())
    rem = #False : car = #False : i = 1
    While i <= l
      a$ = Mid(line_prg(),i,1)
      If a$ = Chr(32) : i + 1 : EndIf
      If a$ = ";" And car = #False : i + 1 : rem = #True : EndIf
      If a$ > Chr(32) And a$ < Chr(128) : car = #True : EndIf
      i + 1
    Wend
    If car = #True And rem = #False : ligne + 1 : EndIf
    If FindString(line_prg(),"EndProcedure",1) And rem = #False : proc + 1 : EndIf
  Next
  
  PrintN(RSet(Str(ligne),6," ") + " " + thefile + "("+Str(proc)+")")
  totproc + proc
  ProcedureReturn ligne
EndProcedure

OpenConsole()
  argc = CountProgramParameters()
  totproc = 0
  
  If argc = 0
    PrintN("Usage : pblc <filename>")
    End
  EndIf
  
  If argc > 1                                    ; several files (because we're using joker/wildcard "*" or "?")
    For i = 0 To argc - 1
      thefile = ProgramParameter(i)
      totline + Get_NBLINE(thefile)
    Next i
    PrintN("------------")
    PrintN(RSet(Str(totline),6," ") + " total("+Str(totproc)+")")
  Else
    Get_NBLINE(ProgramParameter())
  EndIf
  
CloseConsole()
NB: je me suis inspiré de "wc" sous GNU/Linux
NB2 : wc c'est pour word count, pas autre chose :wink:

*** EDIT *** : affiche le nombre de procédures
Dernière modification par flaith le sam. 17/janv./2009 20:27, modifié 2 fois.
Anonyme

Message par Anonyme »

Prend pas en compte les includes :(
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Cpl.Bator a écrit :Prend pas en compte les includes :(
ouais je sais, c'était pas mon but premier, mais c'est une idée d'amélioration du code, je me pencherais dessus, sinon tu peux faire comme ca en attendant :

Code : Tout sélectionner

./pblc adir_*.pb adir_*.pbi
ou aussi

Code : Tout sélectionner

./pblc adir_*.pb*
:wink:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

*** AJOUT : Affiche le nombre de procédure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

sympath cet utilitaire :)

mais je prefere l'avoir sous cette forme !!
ne serait ce que pour le tester !!

car pour etre franc, je ne suis pas arrivé a le lancer via la console :?

au moins de cette façon c'est clair, ça te demande quel fichier *.PB
charger , puis ça te rend le résultat du compte des lignes.... :)

Code : Tout sélectionner

; *****************************
; ***                       ***
; ***   pblc - count line   ***
; ***                       ***
; *****************************
;
; count effectives lines of PureBasic programs without remarks and empty lines
; and count number of procedures

Global argc.i, thefile.s, totline.i, totproc.i
Declare .i Get_NBLINE(thefile.s)

filename$=OpenFileRequester("charge","C:\","*.pb",0)
Resultat=Get_NBLINE(filename$)

MessageRequester("resultat","le nombre de ligne est : "+Str(Resultat),#PB_MessageRequester_Ok)



Procedure.i Get_NBLINE(thefile.s)
    Protected NewList line_prg.s(), tmp.s
    Protected ligne.i = 0, proc.i = 0, i.i = 1
    Protected rem.i = #False : car.i = #False
    
    ClearList(line_prg())
    
    If ReadFile(0, thefile)
        While Eof(0) = 0
            tmp = ReadString(0)
            AddElement(line_prg())
            line_prg() = tmp
        Wend
        CloseFile(0)
    Else
        MessageRequester("erreur","Unable to read " + thefile,#PB_MessageRequester_Ok)
       ; PrintN("Unable to read " + thefile)
        End
    EndIf
    
    ResetList(line_prg())
    ForEach line_prg()
        l = Len(line_prg())
        rem = #False : car = #False : i = 1
        While i <= l
            a$ = Mid(line_prg(),i,1)
            If a$ = Chr(32) : i + 1 : EndIf
            If a$ = ";" And car = #False : i + 1 : rem = #True : EndIf
            If a$ > Chr(32) And a$ < Chr(128) : car = #True : EndIf
            i + 1
        Wend
        If car = #True And rem = #False : ligne + 1 : EndIf
        If FindString(line_prg(),"EndProcedure",1) And rem = #False : proc + 1 : EndIf
    Next
    
    ;PrintN(RSet(Str(ligne),6," ") + " " + thefile + "("+Str(proc)+")")
   ; MessageRequester("procedures",RSet(Str(ligne),6," ") + " " + thefile + "("+Str(proc)+")",#PB_MessageRequester_Ok )
    totproc + proc
    ProcedureReturn ligne
EndProcedure

d'autant que dans ton code il y a ça :

Code : Tout sélectionner

Else
    PrintN("Unable to read " + thefile)
    End
  EndIf 
en clair , si le fichier ne peut etre lu le message "Unable to read " + thefile
s'affiche a la vitesse de la lumiere, que deja le prg se termine !!

:lol:
pour faire comme KCC :

"Flaith il est un androide, il peut lire les messages d'erreur plus vite que son ombre !! " :lol:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

:D merci Dobro

autre version, elle va incorporer les fichiers dans "IncludeFile" ou "XincludeFile"

Code : Tout sélectionner

; *****************************
; ***                       ***
; ***   pblc - count line   ***
; ***                       ***
; *****************************
;
; count effectives lines of PureBasic programs without remarks and empty lines
; and count number of procedures
; added : get include files

Global argc.i, thefile.s, totline.i, totproc.i
Global NewList prg.s()

Procedure.i Get_NBLINE(thefile.s)
Protected NewList line_prg.s(), tmp.s
Protected ligne.i = 0, proc.i = 0, i.i = 1
Protected rem.i = #False : car.i = #False

  ClearList(Line_prg())
  
  If ReadFile(0, thefile)
    While Eof(0) = 0
      tmp = ReadString(0)
      AddElement(Line_prg())
        line_prg() = tmp
    Wend
    CloseFile(0)
  Else
    PrintN("Unable to read " + thefile)
    PrintN("Hit a key : ") : Input(Key$)                       ;Special Dobro ;)
    End
  EndIf
  
  ResetList(line_prg())
  ForEach line_prg()
    l = Len(line_prg())
    rem = #False : car = #False : i = 1
    While i <= l
      a$ = Mid(line_prg(),i,1)
      If a$ = Chr(32) : i + 1 : EndIf
      If a$ = ";" And car = #False : i + 1 : rem = #True : EndIf
      If a$ > Chr(32) And a$ < Chr(128) : car = #True : EndIf
      i + 1
    Wend
    If car = #True And rem = #False : ligne + 1 : EndIf
    If FindString(line_prg(),"EndProcedure",1) And rem = #False : proc + 1 : EndIf
  Next
  
  PrintN(RSet(Str(ligne),6," ") + " " + thefile + "("+Str(proc)+")")
  totproc + proc
  ProcedureReturn ligne
EndProcedure

Procedure MakeUnique()
Protected Dim prg_tmp.s(1)
Protected i.i = 0, l.i = 0
Protected tmp.s

  l = ListSize(prg())
  ReDim prg_tmp(l)
  SortList(prg(),#PB_Sort_Ascending)

  ResetList(prg())
  ForEach prg()
    prg_tmp(i) = prg()
    i+1
  Next

  ClearList(prg())

  i = 0
  tmp = prg_tmp(i)
  While i < l
    If prg_tmp(i+1) <> tmp
      AddElement(prg())
        prg() = tmp
    EndIf
    i+1
    tmp = prg_tmp(i)
  Wend
EndProcedure

Procedure CheckInclude()
Protected pos.i, pos2.i, pos3.i
Protected ltmp.s, ltmp2.s

  ResetList(prg())
  ForEach prg()
    If ReadFile(0, prg())
      While Eof(0) = 0
        ltmp = ReadString(0)
        pos = FindString(ltmp,"IncludeFile",1)
        If pos
          pos2 = FindString(ltmp,Chr(34),pos+1)
          If pos2 > pos
            pos3 = FindString(ltmp,Chr(34),pos2+1)
            If pos3 > pos2
              ltmp2 = Mid(ltmp,pos2+1,(pos3)-(pos2+1))
              AddElement(prg())
                prg() = ltmp2
            EndIf
          EndIf
        EndIf
      Wend
      CloseFile(0)
    Else
      PrintN("Unable to read " + prg())
      End
    EndIf
  Next
EndProcedure

OpenConsole()
  argc = CountProgramParameters()
  totproc = 0
  
  If argc = 0
    PrintN("Usage : pblc <filename>")
    End
  EndIf
  
  For i = 0 To argc - 1
    AddElement(prg())
      prg() = ProgramParameter(i)
  Next i

  CheckInclude()
  MakeUnique()

  ResetList(prg())
  If ListSize(prg()) > 1                                    ; several files (because we're using joker/wildcard "*" or "?")
    ForEach prg()
      totline + Get_NBLINE(prg())
    Next
    PrintN("------------")
    PrintN(RSet(Str(totline),6," ") + " total("+Str(totproc)+")")
  Else
    FirstElement(prg())
    Get_NBLINE(prg())
  EndIf

CloseConsole()
Le procédure CheckInclude() va rechercher dans chaque source s'il existe une ligne avec "iIcludeFile" et l'ajoute dans la liste des sources, puis la procédure MakeUnique() va supprimer les doublons

:wink:
Dernière modification par flaith le dim. 18/janv./2009 17:44, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

aarg ! :D

tu as remis :

Code : Tout sélectionner

Else
    PrintN("Unable to read " + thefile)
    End
  EndIf 
il faudrai mettre soit un delay() soit carrement un Chaine$ = Input()

Code : Tout sélectionner

Else
    PrintN("Unable to read " + thefile)
Chaine$ = Input()  ; <----------------- ici !!
    End
  EndIf 
pour que les gens aient le temps de lire le message d'erreur !! :lol: :)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

:D oui c'est vrai mais c'est normal car ce programme doit être lancé d'une console et on tape la commande sauf, effectivement, si tu fais "Démarrer" -> "Exécuter", puis la commande et la il faut le input() :wink:

(Dernier code modifié)
Anonyme

Message par Anonyme »

Prend pas en compte les répertoires pour les includes :D
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Cpl.Bator a écrit :Prend pas en compte les répertoires pour les includes :D
Héhé, je savais bien qu'on me poserai la question, j'y ai pensé et je ferais prochainement une mise à jour, bien joué Cpl Bator :wink:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

version pour GNU/Linux & windows

Code : Tout sélectionner

; *****************************
; ***                       ***
; ***   pblc - count line   ***
; ***                       ***
; *****************************
;
; count effectives lines of PureBasic programs without remarks and empty lines
; and count number of procedures
; added : get include files

Global argc.i, thefile.s, totline.i, totproc.i
Global NewList prg.s()

Procedure.i Get_NBLINE(thefile.s)
Protected NewList line_prg.s(), tmp.s
Protected ligne.i = 0, proc.i = 0, i.i = 1
Protected rem.i = #False : car.i = #False

  ClearList(Line_prg())
  
  If ReadFile(0, thefile)
    While Eof(0) = 0
      tmp = ReadString(0)
      AddElement(Line_prg())
        line_prg() = tmp
    Wend
    CloseFile(0)
  Else
    PrintN("Unable to read " + thefile)
    End
  EndIf
  
  ResetList(line_prg())
  ForEach line_prg()
    l = Len(line_prg())
    rem = #False : car = #False : i = 1
    While i <= l
      a$ = Mid(line_prg(),i,1)
      If a$ = Chr(32) : i + 1 : EndIf
      If a$ = ";" And car = #False : i + 1 : rem = #True : EndIf
      If a$ > Chr(32) And a$ < Chr(128) : car = #True : EndIf
      i + 1
    Wend
    If car = #True And rem = #False : ligne + 1 : EndIf
    If FindString(line_prg(),"EndProcedure",1) And rem = #False : proc + 1 : EndIf
  Next
  
  PrintN(RSet(Str(ligne),6," ") + " " + thefile + "("+Str(proc)+")")
  totproc + proc
  ProcedureReturn ligne
EndProcedure

Procedure MakeUnique()
Protected Dim prg_tmp.s(1)
Protected i.i = 0, l.i = 0
Protected tmp.s

  l = ListSize(prg())
  ReDim prg_tmp(l)
  SortList(prg(),#PB_Sort_Ascending)

  ResetList(prg())
  ForEach prg()
    prg_tmp(i) = prg()
    i+1
  Next

  ClearList(prg())

  i = 0
  tmp = prg_tmp(i)
  While i < l
    If prg_tmp(i+1) <> tmp
      AddElement(prg())
        prg() = tmp
    EndIf
    i+1
    tmp = prg_tmp(i)
  Wend
EndProcedure

Procedure CheckInclude()
Protected pos.i, pos2.i, pos3.i
Protected ltmp.s, ltmp2.s

  ResetList(prg())
  ForEach prg()
    If ReadFile(0, prg())
      While Eof(0) = 0
        ltmp = ReadString(0)
        pos = FindString(ltmp,"IncludeFile",1)
        If pos
          pos2 = FindString(ltmp,Chr(34),pos+1)
          If pos2 > pos
            pos3 = FindString(ltmp,Chr(34),pos2+1)
            If pos3 > pos2
              ltmp2 = Mid(ltmp,pos2+1,(pos3)-(pos2+1))
              AddElement(prg())
                prg() = ltmp2
            EndIf
          EndIf
        EndIf
      Wend
      CloseFile(0)
    Else
      PrintN("Unable to read " + prg())
      End
    EndIf
  Next
EndProcedure

OpenConsole()
  argc = CountProgramParameters()
  totproc = 0
  
  If argc = 0
    PrintN("Usage : pblc <filename>")
    End
  EndIf
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
; from Gebee
      file.s = ProgramParameter()
      dir = ExamineDirectory(#PB_Any, GetPathPart(file.s), GetFilePart(file.s))
      While NextDirectoryEntry(dir)
        AddElement(prg())
          prg() = DirectoryEntryName(dir)
      Wend
      FinishDirectory(dir) 
    CompilerCase #PB_OS_Linux
      For i = 0 To argc - 1
        AddElement(prg())
          prg() = ProgramParameter(i)
      Next i

  CompilerEndSelect

  CheckInclude()
  MakeUnique()

  ResetList(prg())
  If ListSize(prg()) > 1                                    ; several files (because we're using joker/wildcard "*" or "?")
    ForEach prg()
      totline + Get_NBLINE(prg())
    Next
    PrintN("------------")
    PrintN(RSet(Str(totline),6," ") + " total("+Str(totproc)+")")
  Else
    FirstElement(prg())
    Get_NBLINE(prg())
  EndIf

CloseConsole()
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PBLC - Line Count

Message par Kwai chang caine »

Je l'avais trouvé super ce code 8)
Mais je suis a la recherche du meme style qui pourrais remonter toutes les lignes de code d'un source.
Bon allez vous me dire :

Ouvre le ".pb" et lis le banane :?
Oui j'y ai pensé, mais j'ai des INCLUDES :oops:

Bouffon...t'as pas vu que le génial FLAITH il a inclus les INCLUDES :?
Si si..j'ai vu, et je l'en remercie.....mais mon probleme c'est que les chemins de mes includes sont parfois dans des constantes :oops:
Et la...bah ce genial programme il trouve pas les includes :cry:

Ce qu'il me faudrais c'est pouvoir demander au compilateur de cracher toutes les lignes qu'il va compiler avant qu'il les compilent :mrgreen:

Y a t'il ce genre d'option ??? :roll:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: PBLC - Line Count

Message par flaith »

Kwai chang caine a écrit :Je l'avais trouvé super ce code 8)
Mais je suis a la recherche du meme style qui pourrais remonter toutes les lignes de code d'un source.
Bon allez vous me dire :

Ouvre le ".pb" et lis le banane :?
Oui j'y ai pensé, mais j'ai des INCLUDES :oops:

Bouffon...t'as pas vu que le génial FLAITH il a inclus les INCLUDES :?
Si si..j'ai vu, et je l'en remercie.....mais mon probleme c'est que les chemins de mes includes sont parfois dans des constantes :oops:
Et la...bah ce genial programme il trouve pas les includes :cry:

Ce qu'il me faudrais c'est pouvoir demander au compilateur de cracher toutes les lignes qu'il va compiler avant qu'il les compilent :mrgreen:

Y a t'il ce genre d'option ??? :roll:
J'y rejetterais un œil dès que j'aurais un moment :mrgreen:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PBLC - Line Count

Message par Kwai chang caine »

Merci beaucoup FLAITH.
Il est vraiment bien ton outil....j'avais deja mis un temps fou a comprendre qu'il fallait le compiler en console la premiere fois que je l'avais utilisé :oops:

Faut dire que la console, je l'utilise jamais....toi t'es un LINUX man donc tu doit avoir les doigts musclés :mrgreen:
Car ça vous connait le mode console.

Mais pour les WINDOZIENS..j'suis sur que 80% des utilisateurs ne savent meme pas que ça existe :roll:

C'est vrai ce serais cool d'avoir le listing complet d'une appli.
Par exemple, j'ai une DLL qui a presque 10 onglets PBI et qui a des includes dont les chemins passent par des constantes que j'ai inclues dans les RES de PB.
Alors au depart, j'ai essayé en lisant bettement le code..mais je me suis vite rendu compte, que surement juste le compileur, etait capable de restituer le code source complet.... :roll:

Peut etre que la 4.40 pourra le faire avec sa gestion de projets...ou peut etre que mon bon GNOZAL y va encore venir m'ennerver le nerf....en me disant : "JAPBE il le fait" :?
C'est vrai, y m'ennerve ce JAPBE...y sait tout faire :?

Au passage, j'etais un des premiers a demander la gestion de projets, comme dans VB.
Et ben l'autre jour, j'ai pris mon courage a deux mains...et j'ai enfin utilisé la 4.40 et essayé de faire un projet :D
Et depuis ce jour...ma vie a changée...........je suis content de pouvoir l'utiliser a nouveau........................la 4.30 :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre