Tailbite et paramètres optionnels

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Tailbite et paramètres optionnels

Message par Droopy »

Ce code convertit les procedure avec paramètres optionels au format de tailbite ( prêt à être compilé )

Code : Tout sélectionner

;/ PureBasic 4.0 / Droopy 06/11/06

;{/ Enumerations

Enumeration ;/ Zone Fichier
  #Read
  #Write
  #DebutZone
  #DansZone
  #FinZone
  #HorsZone
EndEnumeration

Enumeration ;/ Zone de Procédure
  #Inconnu
  #Variable
  #Valeur
  #Commentaires
EndEnumeration

;}

Structure DetailProcedure
  Optionnel.l
  NomVariable.s
  Valeur.s
EndStructure

Global NewList Proc.DetailProcedure(), ContenuProcedure.s

Procedure InsertionTBProcedure(Ligne.s)
  
  ClearList(Proc())
  
  ;/ Mise en forme de la ligne
  Ligne=LTrim(RTrim(Ligne))
  
  ;/ Extraction du Nom de la procedure
  NomProcedure.s=StringField(Ligne,2," ")
  NomProcedure=LTrim(RTrim(StringField(NomProcedure,1,"(")))
  
  ;/ Garde juste les paramètres
  Ligne.s=LTrim(RTrim(Right(Ligne,Len(Ligne)-14-Len(NomProcedure))))
  
  Zone=#Inconnu
  For n=1 To Len(Ligne)
    
    c.s=Mid(Ligne,n,1)
    a=Asc(c)
    
    Select Zone
      
      Case #Inconnu
        If (a>64 And a<91) Or (a>96 And a<123) ;/ C'est un nom de variable
          AddElement(Proc())
          Proc()\NomVariable+c
          Zone=#Variable
        ElseIf c=")"
          Zone=#Commentaires
        EndIf
        
      Case #Variable
        Select c
          Case ")"
            Zone=#Commentaires
          Case ","
            Zone=#Inconnu
          Case " "
            
          Case "="
            NbParaOptionnels+1
            Proc()\Optionnel=1
            Zone=#Valeur
            
          Default
            Proc()\NomVariable+c
        EndSelect
        
        
      Case #Valeur
        
        If a=34 ;/ Détermine si je rentre ou sort d'une zone de guillemet
          If ZoneGuillemet=1
            ZoneGuillemet=0
          Else
            ZoneGuillemet=1
          EndIf
        EndIf
        
        If ZoneGuillemet=1
          Proc()\Valeur+c 
        Else
          Select c  
            Case ","
              Zone=#Inconnu
              
            Case ")"
              Zone=#Commentaires
              
            Default
              Proc()\Valeur+c
              
          EndSelect
        EndIf
        
      Case #Commentaires
        Commentaires.s+c
        
    EndSelect
  Next
  
  Commentaires=LTrim(RTrim(Commentaires))
  Commentaires=LTrim(Right(Commentaires,Len(Commentaires)-1))
  
  If NbParaOptionnels 
    ;- Il y a des paramètres optionnels
    
    ; Ecriture de la déclaration
    Temp.s="Declare "+NomProcedure+Str(NbParaOptionnels+1)+"("
    ForEach Proc()
      Temp+Proc()\NomVariable
      
      If ListIndex(Proc())<CountList(Proc())-1
        Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable
      EndIf
    Next
    Temp+")"
    WriteStringN(#Write,Temp)
    
    For n= 0 To NbParaOptionnels
      
      ; Ecrit le nom de la procédure
      Temp.s=#crlf$+"ProcedureDLL "+NomProcedure
      
      ; Ecriture du N° de la procédure
      If n
        Temp+Str(n+1)
      EndIf
      Temp+ "("
      
      ; Ecrit juste les paramètres necessaires
      ForEach Proc()
        
        If ListIndex(Proc())=n
          Break ; Quitte si on atteind le paramètre max requis
        EndIf
        
        Temp+Proc()\NomVariable
        
        If ListIndex(Proc())<n-1 
          Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable
        EndIf
        
      Next
      
      ; Finalise la ligne de ProcedureDLL en y ajoutant les commentaires
      Temp+")"
      If Commentaires<>""
        Temp+" ; "+Commentaires
      EndIf
      
      WriteStringN(#Write,Temp)
      If n=NbParaOptionnels
        ; Ecriture du contenu de la procédure
        WriteStringN(#Write,ContenuProcedure)
      Else
        ; Ecriture de l'appel à la procédure principale
        Temp2.s="  "+NomProcedure+Str(NbParaOptionnels+1)+"("
        ForEach Proc()
          If ListIndex(Proc())>n-1
            Temp2+Proc()\Valeur
          Else
            Temp2+Proc()\NomVariable
          EndIf
          
          If ListIndex(Proc())<CountList(Proc())-1 
            Temp2+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable
          EndIf
        Next
        Temp2+")"
        
        WriteStringN(#Write,Temp2)
        WriteStringN(#Write,"EndProcedure")
      EndIf
      
    Next
    
    
  Else 
    ;- Aucun paramètre optionnels
    Temp.s="ProcedureDLL "+NomProcedure+"("
    ForEach Proc()
      Temp+Proc()\NomVariable
      If ListIndex(Proc())<CountList(Proc())-1
        Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable
      EndIf
    Next
    Temp+")"
    If Commentaires<>""
      Temp+" ; "+Commentaires
    EndIf
    
    WriteStringN(#Write,Temp)
    WriteStringN(#Write,ContenuProcedure)
    
  EndIf
  
EndProcedure

Procedure TBOP(FileIn.s,FileOut.s,TailbitePath.s,Compile)
  
  ;{/ Boucle de lecture du fichier en entrée / Génération du fichier de sortie
  
  CreateFile(#Write,FileOut)
  If ReadFile(#Read,FileIn)=0 
    End 
  EndIf
  
  ZoneFichier=#HorsZone
  
  While Eof(#Read)=0
    
    Ligne.s=ReadString(#Read)
    Temp.s=UCase(LTrim(Ligne))
    
    If Left(Temp,12)="PROCEDUREDLL"
      ZoneFichier=#DebutZone
      LigneProcedure.s=Ligne
    ElseIf Left(Temp,12)="ENDPROCEDURE" And (ZoneFichier=#DebutZone Or ZoneFichier=#DansZone)
      ZoneFichier=#FinZone
    EndIf
    
    Select ZoneFichier
      Case #HorsZone
        WriteStringN(#Write,Ligne)
        
      Case #DebutZone
        ZoneFichier=#DansZone
        ContenuProcedure.s=""
        
      Case #DansZone
        If ContenuProcedure=""
          ContenuProcedure.s+Ligne
        Else
          ContenuProcedure.s+#crlf$+ Ligne
        EndIf
        
      Case #FinZone
        ZoneFichier=#HorsZone
        ContenuProcedure+#crlf$+Ligne
        InsertionTBProcedure(LigneProcedure)
         
    EndSelect
    
  Wend
  ;}
  
  CloseFile(#Read)
  CloseFile(#Write)
  
  If Compile
    RunProgram("TailBite.exe",FileOut,TailbitePath)
  EndIf
  
EndProcedure

; TBOP("d:\affiche.pb","d:\Out.txt","c:\Program Files\PureBasic4\TailBite",#True)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Sympa.
Tu pourrais même rajouter de séparer les fichiers pour la création des résidents ! :D
Ca pourrait devenir un bon outil...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui excellent, pas encore testé mais j'aime bien l'idée.
Image
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

J'ai corrigé pas mal de bugs :

Code : Tout sélectionner

;/ PureBasic 4.0 / Droopy 06/11/06 

;/ Oublié que ProcedureDLL.l --> Le .l foutait la merde
;/ Pas pensé que passage d'un pointeur foutait la merde (*toto)
;/ Gestion des paramètres optionnels si précédés de paramètres non optionnels

;{/ Enumerations 

Enumeration ;/ Zone Fichier 
  #Read 
  #Write 
  #DebutZone 
  #DansZone 
  #FinZone 
  #HorsZone 
EndEnumeration 

Enumeration ;/ Zone de Procédure 
  #Inconnu 
  #Variable 
  #Valeur 
  #Commentaires 
EndEnumeration 

;} 

Structure DetailProcedure 
  Optionnel.l 
  NomVariable.s 
  Valeur.s 
EndStructure 

Global NewList Proc.DetailProcedure(), ContenuProcedure.s 

Procedure InsertionTBProcedure(Ligne.s) 
  
  ClearList(Proc()) 
  
  ;/ Mise en forme de la ligne 
  Ligne=LTrim(RTrim(Ligne)) 
  
  ;/ Extraction du Nom de la procedure 
  NomProcedure.s=StringField(Ligne,2," ") 
  NomProcedure=LTrim(RTrim(StringField(NomProcedure,1,"("))) 
  
  ;/ Regarde si .? est indiqué après ProcedureDLL et si oui le mémorise dans une variable temporaire
  If Mid(Ligne,13,1)="."
    Type.s=Mid(Ligne,13,2)
  Else
    Type=""
  EndIf
  
  ;/ Garde juste les paramètres 
  Ligne.s=Right(Ligne,Len(Ligne)-14-Len(NomProcedure)-Len(Type))
  Ligne.s=LTrim(RTrim(Ligne)) 
  
  Zone=#Inconnu 
  For n=1 To Len(Ligne) 
    
    c.s=Mid(Ligne,n,1) 
    a=Asc(c) 
    
    Select Zone 
      
      Case #Inconnu 
        If (a>64 And a<91) Or (a>96 And a<123) Or a=42 ;/ C'est un nom de variable ou *
          AddElement(Proc()) 
          Proc()\NomVariable+c 
          Zone=#Variable 
        ElseIf c=")" 
          Zone=#Commentaires 
        EndIf 
        
      Case #Variable 
        Select c 
          Case ")" 
            Zone=#Commentaires 
          Case "," 
            Zone=#Inconnu 
          Case " " 
            
          Case "=" 
            NbParaOptionnels+1 
            Proc()\Optionnel=1 
            Zone=#Valeur 
            
          Default 
            Proc()\NomVariable+c 
        EndSelect 
        
        
      Case #Valeur 
        
        If a=34 ;/ Détermine si je rentre ou sort d'une zone de guillemet 
          If ZoneGuillemet=1 
            ZoneGuillemet=0 
          Else 
            ZoneGuillemet=1 
          EndIf 
        EndIf 
        
        If ZoneGuillemet=1 
          Proc()\Valeur+c 
        Else 
          Select c  
            Case "," 
              Zone=#Inconnu 
              
            Case ")" 
              Zone=#Commentaires 
              
            Default 
              Proc()\Valeur+c 
              
          EndSelect 
        EndIf 
        
      Case #Commentaires 
        Commentaires.s+c 
        
    EndSelect 
  Next 
  
  
  Commentaires=LTrim(RTrim(Commentaires)) 
  Commentaires=LTrim(Right(Commentaires,Len(Commentaires)-1)) 
  
  If NbParaOptionnels 
    ;- Il y a des paramètres optionnels 
    
    ; Ecriture de la déclaration 
    Temp.s="Declare"+ Type+" "+NomProcedure+Str(NbParaOptionnels+1)+"(" 
    ForEach Proc() 
      Temp+Proc()\NomVariable 
      
      If ListIndex(Proc())<CountList(Proc())-1 
        Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable 
      EndIf 
    Next 
    Temp+")" 
    WriteStringN(#Write,Temp) 
    
    For n= 0 To NbParaOptionnels 
      
      ; Ecrit le nom de la procédure 
      Temp.s=#crlf$+"ProcedureDLL"+Type+" "+NomProcedure 
      
      ; Ecriture du N° de la procédure 
      If n 
        Temp+Str(n+1) 
      EndIf 
      Temp+ "(" 
      
      ; Ecrit juste les paramètres necessaires de la procédure
      For i= 0 To CountList(Proc())-NbParaOptionnels+n-1
        
        SelectElement(Proc(),i)
        Temp+Proc()\NomVariable 
        
        If i<CountList(Proc())-NbParaOptionnels+n-1
          Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable 
        EndIf 
        
      Next 
      
      ; Finalise la ligne de ProcedureDLL en y ajoutant les commentaires 
      Temp+")" 
      If Commentaires<>"" 
        Temp+" ; "+Commentaires 
      EndIf 
      
      WriteStringN(#Write,Temp) 
      If n=NbParaOptionnels 
        ; Ecriture du contenu de la procédure 
        WriteStringN(#Write,ContenuProcedure) 
      Else 
        ; Ecriture de l'appel à la procédure principale 
        Temp2.s="  "+NomProcedure+Str(NbParaOptionnels+1)+"(" 
        
        ForEach Proc() 
          
          If ListIndex(Proc())> n+CountList(Proc())-NbParaOptionnels-1
            Temp2+Proc()\Valeur 
          Else 
            Temp2+Proc()\NomVariable 
          EndIf 
          
          If ListIndex(Proc())<CountList(Proc())-1 
            Temp2+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable 
          EndIf 
        Next 
        Temp2+")" 
          
        WriteStringN(#Write,Temp2) 
        WriteStringN(#Write,"EndProcedure") 
      EndIf 
      
    Next 
    
    
  Else 
    ;- Aucun paramètre optionnels 
    
    Temp.s="ProcedureDLL"+Type+" "+NomProcedure+"(" 
    ForEach Proc() 

      Temp+Proc()\NomVariable 
      If ListIndex(Proc())<CountList(Proc())-1 
        Temp+"," ; Ajoute une virgule uniquement si necessaire entre chaque variable 
      EndIf 
    Next 
    
    Temp+")" 
    If Commentaires<>"" 
      Temp+" ; "+Commentaires 
    EndIf 
    
    WriteStringN(#Write,Temp) 
    WriteStringN(#Write,ContenuProcedure) 
    
  EndIf 
  
EndProcedure 

Procedure TBOP(FileIn.s,FileOut.s,TailbitePath.s,Compile) 
  
  ;{/ Boucle de lecture du fichier en entrée / Génération du fichier de sortie 
  
  CreateFile(#Write,FileOut) 
  If ReadFile(#Read,FileIn)=0 
    End 
  EndIf 
  
  ZoneFichier=#HorsZone 
  
  While Eof(#Read)=0 
    
    Ligne.s=ReadString(#Read) 
    Temp.s=UCase(LTrim(Ligne)) 
    
    If Left(Temp,12)="PROCEDUREDLL" 
      ZoneFichier=#DebutZone 
      LigneProcedure.s=Ligne 
    ElseIf Left(Temp,12)="ENDPROCEDURE" And (ZoneFichier=#DebutZone Or ZoneFichier=#DansZone) 
      ZoneFichier=#FinZone 
    EndIf 
    
    Select ZoneFichier 
      Case #HorsZone 
        WriteStringN(#Write,Ligne) 
        
      Case #DebutZone 
        ZoneFichier=#DansZone 
        ContenuProcedure.s="" 
        
      Case #DansZone 
        If ContenuProcedure="" 
          ContenuProcedure.s+Ligne 
        Else 
          ContenuProcedure.s+#crlf$+ Ligne 
        EndIf 
        
      Case #FinZone 
        ZoneFichier=#HorsZone 
        ContenuProcedure+#crlf$+Ligne 
        InsertionTBProcedure(LigneProcedure) 
        
    EndSelect 
    
  Wend 
  ;} 
  
  CloseFile(#Read) 
  CloseFile(#Write) 
  
  If Compile 
    RunProgram("TailBite.exe",FileOut,TailbitePath) 
  EndIf 
  
EndProcedure 

; TBOP("c:\Printer_Lib.pb","c:\afficheTBOP.txt","c:\Program Files\PureBasic4\TailBite",#True) 
; RunProgram("c:\afficheTBOP.txt","","c:\")
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Au fait,

El choni arrête Tailbite ?
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Il n'a rien indiqué dans ce sens, mais il ne semble plus joignable ni passer sur le forum depuis un bout de temps.
Répondre