Code: Select all
;/ 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
ProcedureDLL RunTBOP(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,11)="PROCEDUREDLL"
ZoneFichier=#DebutZone
LigneProcedure.s=Ligne
ElseIf Left(Temp,11)="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
; RunTBOP("c:\Printer_Lib.pb","c:\afficheTBOP.txt","c:\Program Files\PureBasic4\TailBite",#True)
; RunProgram("c:\afficheTBOP.txt","","c:\")