Outils pour ajouter les Declare des procédures d'un fichier

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Outils pour ajouter les Declare des procédures d'un fichier

Message par Marc »

Bonsoir à tous,

Un peu fatigué d'ajouter à la main les Declare en début des fichiers. Alors ci-dessous un code, à compiler en V4 et à ajouter au menu Outils de l'IDE.

Il ajoute ou met à jour donc les Declare relatifs aux procedures du fichier, et preserve les Declare relatifs à des procedures externes.

Cordialement

Code : Tout sélectionner

Declare.l CheckDeclare(Chaine.s)
Declare.s GetProcedureName(Chaine.s)
Declare.l CheckString(Chaine.s)

EnableExplicit
Global NewList MyProcedures.s()

Define Error.l = #False
Define Result.l = 0
Define Pos.l = 0
Define SourceFileName.s = ProgramParameter()
Define File01.s = ""
Define Chaine.s = ""
Define TempDir.s = GetTemporaryDirectory()
Define File01.s = TempDir + "DeclareGeneratorBKP.txt"

Procedure.l CheckDeclare(Chaine.s)

  Define Result.l = #False 
  Define MyProcName.s = ""
  Define Data01.s = Trim(Chaine)
  
  If FindString(Data01,"Declare",1) = 1
    MyProcName = GetProcedureName(Data01)
    ResetList(MyProcedures())
    While NextElement(MyProcedures())
      If MyProcedures() = MyProcName
        Result = #True
        Break  
      EndIf    
    Wend  
  EndIf
  
  ProcedureReturn Result

EndProcedure

Procedure.s GetProcedureName(Chaine.s)
  
  Define Ptr01.l = 0
  Define Ptr02.l = 0
  Define Result.s = ""
  Define Data01.s = Trim(Chaine)
  
  Ptr01 = FindString(Data01," ",1)
  Ptr02 = FindString(Data01,"(",1)
  If Ptr01 > 0 And Ptr02 > Ptr01
    Ptr01 + 1
    Result = Trim(Mid(Data01,Ptr01,Ptr02 - Ptr01))
  EndIf
  
  ProcedureReturn Result 
  
EndProcedure

Procedure.l CheckString(Chaine.s)

  Define Result.l = 0
  Define DoIt.l = #False
  Define Data01.s = Trim(Chaine)
  Define Data02.s = ""
    
  If FindString(Data01,"ProcedureReturn",1) = 1
    Result = 0
  Else    
    If FindString(Data01,"Procedure",1) = 1
      
      Data02 =  GetProcedureName(Chaine)
      AddElement(MyProcedures())
      MyProcedures() = Data02
      
      Data01 = StringField(Data01,1," ")
      If FindString(Data01,".",1) > 0
        Select Right(Data01,1)
          Case "b"  : Result = 2
          Case "c"  : Result = 3
          Case "w"  : Result = 4
          Case "l"  : Result = 5
          Case "f"  : Result = 6
          Case "q"  : Result = 7
          Case "d"  : Result = 8
          Case "s"  : Result = 9        
        EndSelect
      Else
        Result = 1
      EndIf 
    EndIf 
  EndIf
  
  ProcedureReturn Result

EndProcedure

If CopyFile(SourceFileName,File01) > 0

  If CreateFile(0,SourceFileName)
    If OpenFile(1,File01)
      While Eof(1) = 0
        Chaine = ReadString(1)        
        Result.l = CheckString(Chaine)
        If Result > 0
          Chaine = Trim(Chaine)
          Pos = FindString(Chaine," ",1)
          If Pos > 0
            Select Result 
              Case 1  : Chaine = "Declare   " + Right(Chaine,Len(Chaine) - Pos)
              Case 2  : Chaine = "Declare.b " + Right(Chaine,Len(Chaine) - Pos)
              Case 3  : Chaine = "Declare.c " +  Right(Chaine,Len(Chaine) - Pos)
              Case 4  : Chaine = "Declare.w " +  Right(Chaine,Len(Chaine) - Pos)
              Case 5  : Chaine = "Declare.l " +  Right(Chaine,Len(Chaine) - Pos)
              Case 6  : Chaine = "Declare.f " +  Right(Chaine,Len(Chaine) - Pos)
              Case 7  : Chaine = "Declare.q " +  Right(Chaine,Len(Chaine) - Pos)
              Case 8  : Chaine = "Declare.d " +  Right(Chaine,Len(Chaine) - Pos)
              Case 9  : Chaine = "Declare.s " +  Right(Chaine,Len(Chaine) - Pos)
            EndSelect
            WriteString(0,Chaine + Chr(13) + Chr(10))
          EndIf        
        EndIf        
      Wend
      WriteString(0,"")
      CloseFile(1) 
      If OpenFile(1,File01)        
        While Eof(1) = 0
          Chaine = ReadString(1)                    
          If CheckDeclare(Chaine) = #False
            WriteString(0,Chaine + Chr(13) + Chr(10))          
          EndIf
        Wend
        CloseFile(1)
      Else
        Error = #True
      EndIf     
    EndIf
    CloseFile(0)
  Else
    Error = #True
  EndIf
  If Error 
    CopyFile(File01,SourceFileName)
  EndIf 
EndIf

End

comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai compilé , j'ai déclaré l'outil avec %FILE comme argument, j'ai ouvert un code source avec des procédures et lancé l'outil, mais rien ne se passe, qu'ai-je oublié de faire ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message par Marc »

Bonsoir Comtois

Il faut indiquer:
- Attendre la fin du programme
- Recherger la source à la fin du programme (Dans le même onglet)

Cordialement
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Salut Marc

Ok j'ai compris pourquoi ça ne fonctionnait pas.
Je faisais l'essai avec un fichier qui se trouve dans un répertoire de ce style :

"Quad - Frustrum"

ça fait donc 3 paramètres pour ProgramParameter().Et du coup SourceFileName ne contenait pas le bon chemin.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message par Marc »

Le code demande à être blindé.

:idea:

On pourrai utiliser la fonction CountProgramParameters() afin de concaténer les paramètres retournés par ProgramParameter() et obtenir un path complet et si le fichier existe alors on le traite.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'avais fait l'essai avec CountProgramParameters() mais je n'ai pas proposé cette solution parce qu'on ne sait pas combien il y a d'espaces.
C'est vrai que dans la plupart des situations ça devrait suffire , mais c'est pas une solution fiable à 100%, je cherchais une autre solution.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

et en mettant le paramètre entre guillemets ?
"C:\Program Files\" ne fera qu'un paramètre

Dri

PS. j'ai lu en diagonale, désolé si je suis HS
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Dr. Dri a écrit :PS. j'ai lu en diagonale, désolé si je suis HS
Pas grave si tu es HS, ça fait toujours plaisir de te lire :)

En fait il s'agit d'un outil et il utilise le paramètre %FILE dans la configuration outils de l'IDE, c'est l'IDE qui devrait changer sa façon de mettre le chemin à disposition.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Et en faisant "%FILE" ca fonctionne pas ?

Dri
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Dr. Dri a écrit :Et en faisant "%FILE" ca fonctionne pas ?

Dri
Bien vu :)

Tu n'étais pas hors sujet , merci.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est dans l'aide de PB
Example:
MyProgram.exe MyText.txt /FAST "Special Mode"

The first time that ProgramParameter() is called, it will return "MyText.txt", the second time "/FAST" and the third time "Special Mode".
Dri
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Excellent outil, moi aussi j'en avais marre de taper ces declare, je me suis permis de modifier ton code, le resultas est transferé dans le presse papier, il suffit de faire un coller pour inserer les declares trouvés dans le code source traité, ne pas oublier section argument de mettre "%FILE" et pas seulement %FILE sinon les noms de fichiers avec espace sont tronqués et ne passent pas...

Code : Tout sélectionner

; Description : au lieu d'ajouter manuellement les Declare en début des fichiers sources. ce code permet
; de le faire automatiquement, cree les declare relatifs aux procedures du code a traiter, à compiler en V4 
; et à ajouter au menu Outils de l'IDE....
;
; ne pas oublier dans la section arguments de mettre "%FILE" au lieu de seulement %FILE sinon les noms
; de fichiers avec espace ne passent pas...
;
; Code creé par Mark trouvé sur le forum francais de purebasic
;
; Modifié par Coolman le 11 Fevrier 2007, le resultas est transferé dans le presse papier a charge pour 
; l'utilisateur de faire un coller en debut de code...
;
Declare.l CheckDeclare(Chaine.s)
Declare.s GetProcedureName(Chaine.s)
Declare.l CheckString(Chaine.s)

EnableExplicit
Global NewList MyProcedures.s()

Define Error.l = #False
Define Result.l = 0
Define Pos.l = 0
Define SourceFileName.s = ProgramParameter()
Define File01.s = ""
Define Chaine.s = ""
Define TempDir.s = GetTemporaryDirectory()
Define File01.s = TempDir + "DeclareGeneratorBKP.txt"
Define Tmpchaine.s = ""
Define Compteur.l = 0
Define RC.s = Chr(13) + Chr(10)

Procedure.l CheckDeclare(Chaine.s)

  Define Result.l = #False
  Define MyProcName.s = ""
  Define Data01.s = Trim(Chaine)
 
  If FindString(Data01,"Declare",1) = 1
    MyProcName = GetProcedureName(Data01)
    ResetList(MyProcedures())
    While NextElement(MyProcedures())
      If MyProcedures() = MyProcName
        Result = #True
        Break 
      EndIf   
    Wend 
  EndIf
 
  ProcedureReturn Result

EndProcedure

Procedure.s GetProcedureName(Chaine.s)
 
  Define Ptr01.l = 0
  Define Ptr02.l = 0
  Define Result.s = ""
  Define Data01.s = Trim(Chaine)
 
  Ptr01 = FindString(Data01," ",1)
  Ptr02 = FindString(Data01,"(",1)
  If Ptr01 > 0 And Ptr02 > Ptr01
    Ptr01 + 1
    Result = Trim(Mid(Data01,Ptr01,Ptr02 - Ptr01))
  EndIf
 
  ProcedureReturn Result
 
EndProcedure

Procedure.l CheckString(Chaine.s)

  Define Result.l = 0
  Define DoIt.l = #False
  Define Data01.s = Trim(Chaine)
  Define Data02.s = ""
   
  If FindString(Data01,"ProcedureReturn",1) = 1
    Result = 0
  Else   
    If FindString(Data01,"Procedure",1) = 1
     
      Data02 =  GetProcedureName(Chaine)
      AddElement(MyProcedures())
      MyProcedures() = Data02
     
      Data01 = StringField(Data01,1," ")
      If FindString(Data01,".",1) > 0
        Select Right(Data01,1)
          Case "b"  : Result = 2
          Case "c"  : Result = 3
          Case "w"  : Result = 4
          Case "l"  : Result = 5
          Case "f"  : Result = 6
          Case "q"  : Result = 7
          Case "d"  : Result = 8
          Case "s"  : Result = 9       
        EndSelect
      Else
        Result = 1
      EndIf
    EndIf
  EndIf
 
  ProcedureReturn Result

EndProcedure

If SourceFileName="" : End : EndIf
If MessageRequester("Information", "Analyser le fichier "+ SourceFileName + " (O/N) !" , #PB_MessageRequester_YesNo)  <> 6 : End : EndIf     

If CopyFile(SourceFileName,File01) > 0  
    If OpenFile(1,File01)
      While Eof(1) = 0
        Chaine = ReadString(1) : Result.l = CheckString(Chaine)
        If Result > 0
          Chaine = Trim(Chaine) : Pos = FindString(Chaine," ",1)
          If Pos > 0
            Select Result
              Case 1  : Chaine = "Declare   " + Right(Chaine,Len(Chaine) - Pos)
              Case 2  : Chaine = "Declare.b " + Right(Chaine,Len(Chaine) - Pos)
              Case 3  : Chaine = "Declare.c " +  Right(Chaine,Len(Chaine) - Pos)
              Case 4  : Chaine = "Declare.w " +  Right(Chaine,Len(Chaine) - Pos)
              Case 5  : Chaine = "Declare.l " +  Right(Chaine,Len(Chaine) - Pos)
              Case 6  : Chaine = "Declare.f " +  Right(Chaine,Len(Chaine) - Pos)
              Case 7  : Chaine = "Declare.q " +  Right(Chaine,Len(Chaine) - Pos)
              Case 8  : Chaine = "Declare.d " +  Right(Chaine,Len(Chaine) - Pos)
              Case 9  : Chaine = "Declare.s " +  Right(Chaine,Len(Chaine) - Pos)
            EndSelect            
            Tmpchaine + Chaine + RC : Compteur + 1            
          EndIf       
        EndIf       
      Wend      
      If Compteur>0      
          SetClipboardText(Tmpchaine) 
          MessageRequester("Information", Str(Compteur)+" 'Declare(s)' detecté(s) et transferé(s) dans le presse papier" + RC +"faites un coller pour l'inserer dans votre code source...", 0)
      Else
          MessageRequester("Information", "Desolé, aucun resultas...", 0)      
      EndIf    
      CloseFile(1)      
      DeleteFile(File01)  
    EndIf        
Else
    MessageRequester("Information", "Desolé, une erreur s'est produite lors de la creation du fichier temporaire "+File01+" !", 0);
    End
EndIf  
End

Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

j'ai egallement enlevé la creation du fichier temporaire inutile ici puisque le programme ne touche en aucun cas au code original, j'ai testé sur un code de plusieurs millier de ligne, c'est beaucoup plus rapide et le resultas est quasiment instantanée...

Code : Tout sélectionner

; Description : au lieu d'ajouter manuellement les Declare en début des fichiers sources. ce code permet
; de le faire automatiquement, cree les declare relatifs aux procedures du code a traiter, à compiler en V4 
; et à ajouter au menu Outils de l'IDE....
;
; ne pas oublier dans la section arguments de mettre "%FILE" au lieu de seulement %FILE sinon les noms
; de fichiers avec espace ne passent pas...
;
; Code creé par Mark trouvé sur le forum francais de purebasic
;
; Modifié par Coolman le 12 Fevrier 2007, le resultas est transferé dans le presse papier a charge pour 
; l'utilisateur de faire un coller en debut de code...
;
Declare.l CheckDeclare(Chaine.s)
Declare.s GetProcedureName(Chaine.s)
Declare.l CheckString(Chaine.s)

EnableExplicit
Global NewList MyProcedures.s()

Define Result.l = 0
Define Pos.l = 0
Define SourceFileName.s = ProgramParameter()
Define Chaine.s = ""
Define TempDir.s = GetTemporaryDirectory()
Define Tmpchaine.s = ""
Define Compteur.l = 0
Define RC.s = Chr(13) + Chr(10)

Procedure.l CheckDeclare(Chaine.s)

  Define Result.l = #False
  Define MyProcName.s = ""
  Define Data01.s = Trim(Chaine)
 
  If FindString(Data01,"Declare",1) = 1
    MyProcName = GetProcedureName(Data01)
    ResetList(MyProcedures())
    While NextElement(MyProcedures())
      If MyProcedures() = MyProcName
        Result = #True
        Break 
      EndIf   
    Wend 
  EndIf
 
  ProcedureReturn Result

EndProcedure

Procedure.s GetProcedureName(Chaine.s)
 
  Define Ptr01.l = 0
  Define Ptr02.l = 0
  Define Result.s = ""
  Define Data01.s = Trim(Chaine)
 
  Ptr01 = FindString(Data01," ",1)
  Ptr02 = FindString(Data01,"(",1)
  If Ptr01 > 0 And Ptr02 > Ptr01
    Ptr01 + 1
    Result = Trim(Mid(Data01,Ptr01,Ptr02 - Ptr01))
  EndIf
 
  ProcedureReturn Result
 
EndProcedure

Procedure.l CheckString(Chaine.s)

  Define Result.l = 0
  Define DoIt.l = #False
  Define Data01.s = Trim(Chaine)
  Define Data02.s = ""
   
  If FindString(Data01,"ProcedureReturn",1) = 1
    Result = 0
  Else   
    If FindString(Data01,"Procedure",1) = 1
     
      Data02 =  GetProcedureName(Chaine)
      AddElement(MyProcedures())
      MyProcedures() = Data02
     
      Data01 = StringField(Data01,1," ")
      If FindString(Data01,".",1) > 0
        Select Right(Data01,1)
          Case "b"  : Result = 2
          Case "c"  : Result = 3
          Case "w"  : Result = 4
          Case "l"  : Result = 5
          Case "f"  : Result = 6
          Case "q"  : Result = 7
          Case "d"  : Result = 8
          Case "s"  : Result = 9       
        EndSelect
      Else
        Result = 1
      EndIf
    EndIf
  EndIf
 
  ProcedureReturn Result

EndProcedure

If SourceFileName="" : End : EndIf
If MessageRequester("Information", "Analyser le fichier "+ SourceFileName + " (O/N) !" , #PB_MessageRequester_YesNo)  <> 6 : 

End : EndIf     

If OpenFile(1,SourceFileName)
      While Eof(1) = 0
        Chaine = ReadString(1) : Result.l = CheckString(Chaine)
        If Result > 0
          Chaine = Trim(Chaine) : Pos = FindString(Chaine," ",1)
          If Pos > 0
            Select Result
              Case 1  : Chaine = "Declare   " + Right(Chaine,Len(Chaine) - Pos)
              Case 2  : Chaine = "Declare.b " + Right(Chaine,Len(Chaine) - Pos)
              Case 3  : Chaine = "Declare.c " +  Right(Chaine,Len(Chaine) - Pos)
              Case 4  : Chaine = "Declare.w " +  Right(Chaine,Len(Chaine) - Pos)
              Case 5  : Chaine = "Declare.l " +  Right(Chaine,Len(Chaine) - Pos)
              Case 6  : Chaine = "Declare.f " +  Right(Chaine,Len(Chaine) - Pos)
              Case 7  : Chaine = "Declare.q " +  Right(Chaine,Len(Chaine) - Pos)
              Case 8  : Chaine = "Declare.d " +  Right(Chaine,Len(Chaine) - Pos)
              Case 9  : Chaine = "Declare.s " +  Right(Chaine,Len(Chaine) - Pos)
            EndSelect            
            Tmpchaine + Chaine + RC : Compteur + 1            
          EndIf       
        EndIf       
      Wend      
      If Compteur>0      
          SetClipboardText(Tmpchaine) 
          MessageRequester("Information", Str(Compteur)+" 'Declare(s)' detecté(s) et transferé(s) dans le presse papier" + RC 

+"faites un coller pour l'inserer dans votre code source...", 0)
      Else
          MessageRequester("Information", "Desolé, aucun resultas...", 0)      
      EndIf    
      CloseFile(1)           
Else
     MessageRequester("Information", "Desolé, une erreur s'est produite lors de l'acces au fichier "+SourceFileName+" !", 0)
     End
EndIf        
End

Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message par Marc »

Pas mal la version en utilisant le presse papier, je vais voir celà...

une option qui sera peut être un jour intégrée à l'IDE sous une forme ou une autre.

Marc
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

C'est vrai que ce genre de fonctions assez pratique devraient etre integrées a l'editeur :)
Répondre