Page 1 sur 2

Premiers tours de Pure_moulinette v0.0 !+questions

Publié : lun. 06/nov./2006 23:09
par Huitbit
OBJECTIF : voir rapidemment la structure d'un programme.
La moulinette récolte les commentaires principaux et détecte les procédures ainsi que les liens qui existent entre-elles.
Chaque zone du programme est repérée par ses numéros de lignes
Pour l'instant c'est un embryon, faut pas trop le secouer(noms de procedures ou commentaires trop longs...)

PRINCIPE: avec les fonctions de la bibliothèque STRING, je récupère tous les infos sur les procédures, puis je scanne le programme principal pour voir de quelle manière elles interviennent.

La grosse difficulté revient à remplir puis à dessiner des blocs du type:
bloc(generation,noeud,branche)
(sachant qu'il existe des liens entre ces blocs)

EXEMPLE: programme passé à la moulinette

Code : Tout sélectionner

Procedure p3()
EndProcedure
Procedure p4()
EndProcedure
Procedure p5()
EndProcedure
Procedure p2()
p3()
p4()
p5()
EndProcedure
Declare p6()
Procedure p1()
p2()
EndProcedure
Procedure p6()
p2()
p3()
p1()
EndProcedure

;programme principal
;action 1
;action 2
p1()
;action 3
;action 5
p6()
p2()
;action 6
RESULTAT:(aucun icône n'est actif pour le moment
Image

[EDIT] modifié le 7/11 suppression des 4 lignes de code
qui s'ajoutent automatiquement à la fin du programme

Code : Tout sélectionner

;**********************************
Enumeration
#spr_icones
#spr_code_var 
#spr_arbre
#spr_fermer 
#spr_souris 
#spr_panorama
#spr_bloc
#spr_sprite_final
EndEnumeration
#Longueur=128 ;longueur d'un bloc
#hbloc=18; hauteur d'un bloc
;**********************
Structure infos
nom.s
enfant.l
nom_enfant.s
ligne_debut_code.l
ligne_fin_code.l
occupe.b
visible.b
origine.s
descendance.s
decalage_y.d
delta.d ;grandeur de reference pour dessiner les branches

EndStructure 

;variables**********************
 ligne.l=0
ligne_max.l=0
compteur_procedure.l=0
arret_comptage.b=0
 branche.l=0
generation.l=0

 Global noeud.l, compteur_procedure_max.l,generation_max.l,enfant_max.l,noeud_max.l
 Global Largeur.l,Hauteur.l,delta.l,branche_max.l
 
 delta=#hbloc+1;ecart minimal entre deux blocs
  Largeur=48;dimensions du sprite qui sera "clipper" pour faire les icones 16*16
 Hauteur=32
;tableau********************************
Global Dim tableau(Largeur-1, Hauteur-1)
Global Dim info_procedure.infos(100); info_procedure.infos(compteur_procedure)
Global Dim bloc.infos(20,300,100);bloc.infos(generation,noeud,branche)
Global Dim memo_generation.l(20,300,100) 
Global Dim memo_noeud.l(20,300,100)
Global Dim memo_branche.l(20,300,100)

 ;procedures************************
 Procedure.l initialisation()
 For i=1 To generation_max
For j=1 To noeud_max
For k=1 To enfant_max
bloc(i,j,k)\enfant=0
bloc(i,j,k)\nom=""
bloc(i,j,k)\nom_enfant=""
Next k
Next j
Next i

For i=1 To generation_max
For j=1 To noeud_max
bloc(i,j,0)\occupe=0
Next j
Next i
EndProcedure
 
 Procedure dessin_icones()
 CreateSprite(#spr_icones, Largeur, Hauteur,0)
 StartDrawing(SpriteOutput(#spr_icones))
  ; mise en tableau ************
For i = 0 To Largeur -1
 For j = 0 To Hauteur -1 
  Read donnees.l 
  tableau(i, j)=donnees.l 
Next j
Next i
 ; dessin point par point**************************
For i = 0 To Largeur -1
 For j = 0 To Hauteur -1 
  Plot(i,j,tableau(i,j)) 
 Next j
Next i
 StopDrawing() 
EndProcedure
 Procedure dessin(nom.b,x.b,y.b,w.b,h.b)
  CopySprite(#spr_icones,nom,0)
  ClipSprite(nom,x,y,w,h)
 EndProcedure


Procedure.l detection_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)

;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)

;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud.l=1
 While bloc(mgen+1,newnoeud,0)\occupe=1 
     newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris 
     If newnoeud>noeud_max;calcul du nombre max de noeuds
         noeud_max=newnoeud
     EndIf 
 Wend
 
 bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
;création d'un nombre de blocs égal au nombre des descendants directs
For   i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles

    bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
            
    For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
        If  bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
            bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
            bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
       EndIf
    Next j      

    If  bloc(mgen+1,newnoeud,i)\enfant<>0 ;test du bloc crée(récursivité!)
        detection_enfant(mgen+1,newnoeud,i)   
    EndIf

Next i

EndProcedure


Procedure.l detectionbis_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)

;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)

If bloc(mgen,mnoeud,mbranche)\enfant=0 And mgen<generation_max;gestion des blocs sans enfants

    ;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
    newnoeud1.l=1
    While bloc(mgen+1,newnoeud1,0)\occupe=1
        newnoeud1=newnoeud1+1; on change de noeud si ce nom de noeud est déjà pris
    Wend

    bloc(mgen+1,newnoeud1,0)\occupe=1
    bloc(mgen+1,newnoeud1,0)\enfant=0
    bloc(mgen+1,newnoeud1,0)\nom=Str(mgen+1)+"#"+Str(newnoeud1)
    bloc(mgen+1,newnoeud1,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
 
    detectionbis_enfant(mgen+1,newnoeud1,0)
 
Else; si le bloc a des descendants
    ;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
    newnoeud.l=1
    While bloc(mgen+1,newnoeud,0)\occupe=1 
        newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris 
    Wend

    bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
    bloc(mgen+1,newnoeud,0)\enfant=bloc(mgen,mnoeud,mbranche)\enfant
    bloc(mgen+1,newnoeud,0)\nom=Str(mgen+1)+"#"+Str(newnoeud)
    bloc(mgen+1,newnoeud,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
    ;création d'un nombre de blocs égal au nombre des descendants directs
    For   i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles
 
         bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
         
         For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
             If  bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
                 bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
                 bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
                 bloc(mgen+1,newnoeud,i)\ligne_debut_code=info_procedure(j)\ligne_debut_code
                 bloc(mgen+1,newnoeud,i)\ligne_fin_code=info_procedure(j)\ligne_fin_code
             EndIf
         Next j      

  
        If mgen<generation_max
            detectionbis_enfant(mgen+1,newnoeud,i)   
        EndIf

    Next i
EndIf   

If mnoeud>noeud_max;calcul du nombre max de noeuds
    noeud_max=mnoeud
EndIf 

EndProcedure




 Procedure.l traitement_du_programme_choisi()
 fichier_choisi$=OpenFileRequester("prog_detection","C:\Documents and Settings\Ploucky\Bureau\programmation\programmation_PBv4.0","Fichiers Purebasic|*.pb",0)
a$="fichier_a_traiter.text"
CreateFile(0,a$);on crée le fichier .text  à partir du prog .pb choisi
CloseFile(0);fermer le fichier crée avant de le modifier!
CopyFile(fichier_choisi$,a$);on copie le fichier crée précedemment  pour pouvoir le manipuler sans risques

;premier passage pour detecter les procedures et leur emplacement(ligne de  debut de code)
ligne=0
OpenFile(0,a$)
While Eof(0)=0
    ligne=ligne+1
    texte$=LCase(Trim((ReadString(0,#PB_Ascii  ))));  lecture avec espace devant et derrière supprimés+tout en minuscule

    If  FindString(texte$,"endprocedure",1)=0 And FindString(texte$,";",1)=0  And FindString(texte$,"endprocedure",1)=0 And FindString(texte$,"_procedure",1)=0 And FindString(texte$,"procedure",1)<>0
        compteur_procedure+1
        info_procedure(compteur_procedure)\nom=StringField(texte$,2," ")
        info_procedure(compteur_procedure)\ligne_debut_code=ligne
    EndIf

Wend
ligne_max=ligne
compteur_procedure_max=compteur_procedure
CloseFile(0)

;deuxième passage pour trouver la descendance et la ligne de fin de code
For compteur_procedure=1 To compteur_procedure_max
ligne=0
arret_comptage=0
OpenFile(0,a$)
While Eof(0)=0
    ligne=ligne+1
    texte$=LCase(Trim((ReadString(0,#PB_Ascii  ))))
    
    ;detection de la ligne de  fin de code de la procedure  
    If ligne>=info_procedure(compteur_procedure)\ligne_debut_code  And arret_comptage=0
        info_procedure(compteur_procedure)\ligne_fin_code=ligne

        ;recherche des descendants directs dans la procedure
            For i=1 To compteur_procedure_max
                ;pour la recherche on prend le nom de la procedure débarassée de ses parenthèses
                If  i<> compteur_procedure And FindString(texte$,StringField(info_procedure(i)\nom,1,"("),1)<>0  
                    info_procedure(compteur_procedure)\enfant=info_procedure(compteur_procedure)\enfant+1
                   
                    ;listes des procedures filles séparées par un caractère "|"
                    info_procedure(compteur_procedure)\nom_enfant= info_procedure(compteur_procedure)\nom_enfant+info_procedure(i)\nom+"|"
                EndIf
            Next i

        If  FindString(texte$,"endprocedure",1)<>0
            arret_comptage=1 
        EndIf
    EndIf
Wend
CloseFile(0)
Next compteur_procedure
 
;troisième passage  pour détecter les bloc.infos(generation=0, noeud=1,branche )
 ligne=0
 generation=0
 noeud=1
 branche=0
 
; OpenFile(0,a$)
; While Eof(0)=0  
; ligne=ligne+1
; texte$=LCase(Trim((ReadString(0,#PB_Ascii  ))))
; 
; 
; If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code 
; 
;     If FindString(texte$,";",1)=1
;         branche=branche+1
;         bloc(generation,noeud,branche)\nom=texte$
;         bloc(generation,noeud,branche)\ligne_debut_code=ligne
;     EndIf
; 
; EndIf 
; Wend
;  CloseFile(0)
;********************modif Dobro********************
OpenFile (0,a$) 
     While Eof (0)=0 
        ligne=ligne+1 
        texte$= LCase ( Trim (( ReadString (0, #PB_Ascii )))) 
         If Left (texte$,13)= "; japbe versi" Or Left (texte$,12)= "; ide option" 
            Break 1 
         EndIf 
         
         
         If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code 
             
             If FindString (texte$, ";" ,1)=1 
                branche=branche+1 
                bloc(generation,noeud,branche)\nom= texte$ 
                bloc(generation,noeud,branche)\ligne_debut_code=ligne 
             EndIf 
             
         EndIf 
     Wend 
  
     CloseFile (0)  
branche_max=branche
;**************************************
  ;calcul des lignes de fin de blocs 
For branche=1 To branche_max-1 
    bloc(generation,noeud,branche)\ligne_fin_code=bloc(generation,noeud,branche+1)\ligne_debut_code-1
Next branche
bloc(generation,noeud,branche_max)\ligne_fin_code=ligne_max
  
 ;quatrième passage, detection des descendances des bloc(0,1,branche)
 generation=0
 noeud=1
For branche=1 To branche_max
    ligne=0
    OpenFile(0,a$)
    While Eof(0)=0  
        ligne=ligne+1
        texte$=LCase(Trim((ReadString(0,#PB_Ascii  ))))

        If  ligne>=bloc(generation,noeud,branche)\ligne_debut_code And ligne<=bloc(generation,noeud,branche)\ligne_fin_code
            For  i=1 To compteur_procedure_max
                chaine_de_recherche$=StringField(info_procedure(i)\nom,1,"(")+"("
                If FindString(texte$,chaine_de_recherche$,1)<>0
                    bloc(generation,noeud,branche)\enfant=bloc(generation,noeud,branche)\enfant+1
                    bloc(generation,noeud,branche)\nom_enfant=bloc(generation,noeud,branche)\nom_enfant+info_procedure(i)\nom+"|"
                EndIf
            Next i   
         EndIf  
    Wend
    CloseFile(0)

 Next branche
 
 ; remplissage des blocs, appel de la procedure detection_enfant
For branche = 1 To branche_max   
    If bloc(0,1,branche)\enfant<>0
        detection_enfant(0,1,branche)      
    EndIf     
Next branche 

;recherche du nombre max d'enfants
enfant_max=0
For compteur_procedure=1 To compteur_procedure_max
    If  info_procedure(compteur_procedure)\enfant>enfant_max
        enfant_max= info_procedure(compteur_procedure)\enfant
    EndIf        
Next compteur_procedure

;detection du nombre max de generations
generation_max=0
While bloc(generation_max,1,1)\nom<>""
    generation_max=generation_max+1
Wend; il y a (generation-1) noeuds!

;nouveau passage pour combler les branches vides jusqu'a generation_max=>renumérotation 
 initialisation()
 noeud_max=0
 bloc(0,1,0)\origine="0#1"
For branche = 1 To branche_max
    detectionbis_enfant(0,1,branche);gestion des blocs avec ou sans enfants dans la procedure  
Next branche 
EndProcedure

Procedure decalage_des_blocs()
;remplissage de la structure descendance 
For generation=0 To generation_max-1
    For noeud=0 To noeud_max
        bloc(generation,noeud,0)\descendance="|"
        If bloc(generation,noeud,0)\nom<>""
            nom$="|"+Str(generation)+"#"+Str(noeud)+"|"
            For i=0 To generation_max-1
                For j=0 To noeud_max
                    If FindString(bloc(i,j,0)\origine,nom$,1)<>0
                        bloc(generation,noeud,0)\descendance= bloc(generation,noeud,0)\descendance+Str(i)+"#"+Str(j)+"|"
                    EndIf
                Next j
            Next i
        EndIf
    Next noeud
Next generation
     
;decalage des noeuds de la derniere generation + remplissage des delta(voir plus loin)
generation_noeud.l=generation_max-1; il y a (generation-1) noeuds!
bloc(generation_noeud,1,0)\decalage_y=0
For noeud=2 To noeud_max; on decale les blocs de delta puis on tient compte des voisins du dessus et du dessous!
    If  bloc(generation_noeud,noeud,0)\nom<>""
        bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud-1,0)\decalage_y+delta

        If bloc(generation_noeud,noeud-1,0)\enfant<>0
            bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud-1,0)\enfant-1)*delta/2
        EndIf
        If bloc(generation_noeud,noeud,0)\enfant<>0
            bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud,0)\enfant-1)*delta/2
        EndIf

    EndIf
    bloc(generation_noeud,noeud,0)\delta=delta
Next noeud

;decalage des noeuds 
For generation=generation_noeud-1 To 0 Step -1
    For noeud=1 To noeud_max
        If  bloc(generation,noeud,0)\nom<>""
            i=generation+1
            For j=1 To noeud_max
                If  bloc(i,j,0)\nom<>""
                    nom$="|"+Str(i)+"#"+Str(j)+"|"
                    If FindString(bloc(generation,noeud,0)\descendance,nom$,1)<>0
                        If bloc(generation,noeud,0)\enfant<>0
                            bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y/bloc(generation,noeud,0)\enfant
                        Else
                            bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y
                        EndIf
                    EndIf
                EndIf
            Next j
        EndIf
    Next noeud
Next generation

;calcul des delta  des noeuds(dimension de reference des branches pour les noeuds)
For generation=generation_noeud-1 To 1 Step -1
    For noeud=1 To noeud_max
        If  bloc(generation,noeud,0)\nom<>"" And bloc(generation,noeud,0)\enfant<>0
            noeudmin$="|"+StringField(bloc(generation,noeud,0)\descendance,2,"|")+"|";pour calculer delta on a besoin des branches extremes du noeud
            noeudmax$="|"+StringField(bloc(generation,noeud,0)\descendance,bloc(generation,noeud,0)\enfant+1,"|")+"|"

            i=generation+1;on s'interresse juste à la generation suivante
            For j=1 To noeud_max
                If  bloc(i,j,0)\nom<>"" And noeudmax$<>noeudmin$
                    If FindString("|"+bloc(i,j,0)\nom+"|",noeudmin$,1)<>0
                        bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta-bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
                    EndIf
                    If FindString("|"+bloc(i,j,0)\nom+"|",noeudmax$,1)<>0
                        bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta+bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
                    EndIf 
                EndIf
            Next j

        EndIf
    Next noeud
Next generation

;decalage des blocs de generation 0
For branche=1 To branche_max
    If  bloc(0,1,branche)\nom<>""
        bloc(0,1,branche)\decalage_y=bloc(1,branche,0)\decalage_y
    EndIf
Next branche

;decalage des autres blocs (prise en compte des enfants donc des bloc(g,n,0)\delta)
For generation=1 To generation_max
    For noeud=1 To noeud_max
        If bloc(generation,noeud,0)\enfant<>0
            For branche=1 To bloc(generation,noeud,0)\enfant
                bloc(generation,noeud,branche)\decalage_y=bloc(generation,noeud,0)\decalage_y+(2*(branche-1)-(bloc(generation,noeud,0)\enfant-1))*bloc(generation,noeud,0)\delta/2
            Next branche
        EndIf
    Next noeud
Next generation


EndProcedure


  Procedure dessin_bloc(nom_bloc.s,parent.b)
 CreateSprite(#spr_bloc,#Longueur,#hbloc)
 UseBuffer(#spr_bloc)
 StartDrawing(SpriteOutput(#spr_bloc))
 Box(0,0,128,18,RGB(255,255,0))
 DrawText(49,1,nom_bloc)
 StopDrawing()
 DisplayTransparentSprite(#spr_code_var ,1,1)
 Select  parent ;affichage d'icones differents en fonction de la variable "parent" 
     Case 1
     DisplayTransparentSprite(#spr_arbre ,33,1)
     Case 2 
     DisplayTransparentSprite(#spr_fermer ,33,1)
 EndSelect
 
 UseBuffer(#spr_sprite_final)
 EndProcedure
 
 Procedure dessin_final()
CreateSprite(#spr_sprite_final,1024,768)
UseBuffer(#spr_sprite_final)
For generation=0 To 20
    For noeud =0 To 300
        For branche=1 To 100
        
            If bloc(generation,noeud,branche)\nom<>""
        
                dessin_bloc(bloc(generation,noeud,branche)\nom,1)
                DisplaySprite(#spr_bloc,10+generation*3*#Longueur/2,bloc(generation,noeud,branche)\decalage_y)
        
                StartDrawing(SpriteOutput(#spr_sprite_final))
                    If generation<>0
                        Line(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
                    EndIf
                    If bloc(generation,noeud,branche)\enfant<>0 And branche<>0
                        Line(10+generation*3*#Longueur/2+#Longueur,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
                    EndIf
                    If bloc(generation,noeud,0)\enfant<>0 
                        LineXY(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,1)\decalage_y+#hbloc/2,10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,bloc(generation,noeud,0)\enfant)\decalage_y+#hbloc/2,RGB(255,255,255))
                    EndIf
                StopDrawing()

            EndIf


        Next branche
    Next noeud
Next generation

UseBuffer(-1)


 EndProcedure
 
 
;initialisation*******************************
InitSprite() 
InitMouse()

traitement_du_programme_choisi()
decalage_des_blocs()
;ouverture d'un écran 1024*768*********************
OpenScreen(1024,768,32,"icones")
TransparentSpriteColor(#PB_Default ,RGB(0,128,0))
;création du sprite #spr_icones***************************
dessin_icones()
;dessin des sprites
 dessin(#spr_code_var,0,0,32,16)
 dessin(#spr_arbre,0,16,16,16)
 dessin(#spr_fermer,16,16,16,16)
 dessin(#spr_souris,32,0,16,16)
 dessin(#spr_panorama,32,16,16,16)
;programme principal*******************
dessin_final()
Repeat; tant que bouton droit relaché*******************
    Delay(10)
    ExamineMouse()
    ;affichage des sprites******************************
  
    DisplaySprite(#spr_sprite_final,0,0)
    DisplayTransparentSprite(#spr_souris,MouseX(),MouseY())

    FlipBuffers()

Until MouseButton(#PB_MouseButton_Right )<>0
 

End

DataSection
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,8421376,8421376,8421376,16777215,16777215,16777215,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,16777215,16777215,16777215,16777215,16777215,16777215,16777215,0,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,16777215,16777215,8421376,8421376,8388608,16711680,8421376,8421376,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,0,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,12632256,12632256,0,12632256,12632256,16777215,12632256,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,12632256,16777215,0,12632256,16777215,0,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,16777215,16777215,0,12632256,16777215,0,16777215,16777215,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 32768,16711680,8421376,16777215,16777215,16777215,16777215,16777215,16777215,16777215,12632256,12632256,12632256,12632256,8388608,32768,32768,16711680,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8388608,32768
Data.l 32768,16711680,8421376,16777215,16777215,12632256,12632256,12632256,12632256,12632256,12632256,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,12632256,12632256,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8388608,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,8421376,65535,32896,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,128,8421376,8421376,255,255,255,128,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,255,255,128,8421376,255,128,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,255,128,8421376,255,255,128,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,65535,32896,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,255,128,8421376,8421376,255,255,128,8421376,8421376,8388608
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,128,255,255,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,128,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,128,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,128,255,255,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,65535,16777215,16777215,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,128,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,128,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,128,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,128,16777215,128,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,128,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,128,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,128,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,65535,16777215,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
 
 
EndDataSection 
 
J'ai utilisé les datas(pure_post de DOBRO :wink: ) pour fabriquer un sprite qui contient tous les icônes(je l'ai clippé ensuite)

Pour les branches j'ai bricolé une fonction du genre:
ybranche=ypère+(2*(n°branche-1)-(n°maxbranche-1))*delta/2
branche varie de 1 à maxbranche

BILAN: la partie graphique était plus compliquée que prévue :roll:
(il y a encore des petits trucs à corriger :roll: , des petits décalages peuvent apparaître dans certains cas car j'additionne des fractions pour calculer la position des blocs)
Fabriquer un arbre ça pourrait être un challenge du forum! :wink:

Si quelqu'un a déjà essayé, son avis m'interesse(tous les avis m'interessent:P !)
Mon erreur a été de vouloir tout faire en une seule procédure (ça marchait presque!)
J'ai du créer des branches fantômes pour ne pas avoir de problèmes dans les décalages des blocs!

La partie détection des procédures n'est pas au point(si les noms des procédures sont voisins par exemple, dessin_z() et dessin_x())

J'ai dû utiliser la récursivité(il y a peut-être des variables inutiles (newnoeud1 et newnoeud) mais c'est par sécurité que je les ai mises, la récursivité c'est un peu mystique(pour moi)!)

Quand les icônes seront actifs, je compte ouvrir des petites fenêtre au format .text où le bout de code concerné apparaîtra.

Pour l'instant les tableaux sont limités : (20,300;100)


QUESTIONS:
-peut-on récuperer le nom des procédures proprement?(j'ai fouillé dans la bibliothèque PROCESS, mais c'est trop hot pour moi!)
-idem pour les variables utilisées dans le programme

Publié : lun. 06/nov./2006 23:26
par Backup
c'est marrant , je commençais petit a petit a reflechir a faire un prg dans le genre , Bravo c'est une bonne idée

l'idéal a plus ou moins long terme serai de pouvoir programmer en mettent des icônes, puis du code dedans :D

je crois que sur Amiga il y avait un langage qui se programmais comme ça :D (perdu le nom)

par cntre je ne suis pas arrivé a le faire fonctionner avec mes prg

j'ai essaye aussi cette exemple

Code : Tout sélectionner

Procedure A(a,b)
EndProcedure
Procedure b(a,b)
    A(a,b)
EndProcedure
Procedure c(a,b)
EndProcedure
Procedure d(a,b)
    c(a,b)
    b(a,b)
EndProcedure

d(a,b)
A(a,b)
 b(a,b)
marche pas , en fait c'est long a afficher ?
car je vois l'ecran noir, un icone qui indique EOF
pis c'est tout :?

le fichier a traiter m'indique ça
; jaPBe Version=3.6.10.580
; Build=0
; Language=0x0000 Language Neutral
; FirstLine=0
; CursorPosition=14
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF

Point faible n°1

Publié : lun. 06/nov./2006 23:54
par Huitbit
Il faut que les blocs du programme principal commencent par un commentaire c'est à dire un point virgule au minimum!
Il faut que les commentaires ne contiennent pas des mots qui ressemblent aux noms des procedures!!!

Tout ça vient de mes détections un poil bancales!!!!

C'est pour ça que je demande si en s'attaquant au fichier *.pb on peut pas avoir directemment ces infos :?

:oops:

PS: @Dobro, c'est pour quand la prochaine video?

Publié : lun. 06/nov./2006 23:57
par Backup
pour la detection du nom de procedure, une fois que tu as trouvé

"procedure", comme tu le fait
tu prends tout ce qu'il y a jusqu'a le Chr($0D)+chr($0A) de fin de ligne
t'es sur de tout avoir quelque soit la longueur ...

Video de quoi deja ? :lol:

Publié : mar. 07/nov./2006 0:19
par Kwai chang caine
C'est super cool bravo. 8)

Je ne suis pas un caid de la prog, donc mon avis n'a pas beaucoup d'importance, mais je trouve cette idée balaise.
En plus elle peut bien aider les débutants comme moi.

C'est un peu le monde a l'envers car on fait le diagramme avant de faire le prog en general (enfin les pros), mais ça peut etre super utile pour se retrouver dans un code compliqué, et aussi pour le faire comprendre a autruis.

Encore bravo huitbit :10:
Continue apparement tu as deja 2 clients :lol:

Bonne journée a vous deux

Publié : mar. 07/nov./2006 0:24
par Backup
[quote="Huitbit"]Il faut que les blocs du programme principal commencent par un commentaire c'est à dire un point virgule au minimum!
comment retirer l'obligation de la présence des commentaires dans ton code ?

Oops!

Publié : mar. 07/nov./2006 2:25
par Huitbit
j'ai glissé :oops:

Publié : mar. 07/nov./2006 2:35
par Huitbit
Voilà la partie du code qui décide de ça!

Code : Tout sélectionner

;troisième passage  pour détecter les bloc.infos(generation=0, noeud=1,branche ) 
 ligne=0 
 generation=0 
 noeud=1 
 branche=0 
  
OpenFile(0,a$) 
While Eof(0)=0  
ligne=ligne+1 
texte$=LCase(Trim((ReadString(0,#PB_Ascii  )))) 


If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code 

    If FindString(texte$,";",1)=1 
        branche=branche+1 
        bloc(generation,noeud,branche)\nom=texte$ 
        bloc(generation,noeud,branche)\ligne_debut_code=ligne 
    EndIf 

EndIf 
Wend 
 CloseFile(0) 
 branche_max=branche 
  
  ;calcul des lignes de fin de blocs 
For branche=1 To branche_max-1 
    bloc(generation,noeud,branche)\ligne_fin_code=bloc(generation,noeud,branche+1)\ligne_debut_code-1 
Next branche 
bloc(generation,noeud,branche_max)\ligne_fin_code=ligne_max 
On peut le contourner en ne mettant qu'un seul point virgule au debut du programme.
Il n'y aura qu'un bloc pour la génération 0, les procédures apparaîtrons ensuite!

La seule concession à faire c'est UN guillemet en début de programme principal :P

EXEMPLE:

Code : Tout sélectionner

Procedure p3()
EndProcedure
Procedure p4()
EndProcedure
Procedure p5()
EndProcedure
Procedure p2()
p3()
p4()
p5()
p3()
p5()
EndProcedure
Declare p6()
Procedure p1()
p2()
EndProcedure
Procedure p6()
p2()
p3()
p1()
EndProcedure

;programme principal
action 1
action 2
p1()
action 3
action 5
p6()
p2()
action 6
Image

@Kwai chang caine:Merci
A lire tes posts, tu es bien plus "aware" que moi en info(et plus productif)!
En plus tu as amené sur le forum de l'énergie positive!

A propos de ce programme:
Je l'ai commencé après Pure_guitare (toujours en cours!), c'est avec ce programme que j'ai compris qu'il fallait être un peu ordonné, sinon la moindre modification est ....épuisante!
Plus tard j'ai lu un article sur un patron de boîte informatique qui évaluait les projets de ses employés grâce à un logiciel(qu'il avait fait) qui extrayait tous les commentaires du programme.
Si en lisant les commentaires il pouvait comprendre le programme, il donnait son accord(c'était un débat sur la programmation spontanée!)

C'est vrai qu'à terme on pourrait utiliser la moulinette comme ça:
On fait le squelette du programme en commentaires et en procedures, puis on rajoute le code après!

J'ai vu mieux encore, un truc qui s'appelle Windev.
Apparemment, il y a des symboles officiels(carrés, losanges, cercle...) qui existent pour faire apparaître la structure d'un code

Question:
j'aimerais bien enlever les quatre lignes qui se mettent systématiquement en fin de programme :mad: :mad:

Publié : mar. 07/nov./2006 9:37
par Kwai chang caine
Bonjour huitbit

Je te remercie pour le compliment qui me va droit au coeur.
Tu me remonte le moral, car j'avais plutot l'impression de gonfler le monde sur ce forum avec mes questions à la ....

Je ne sais pas si je suis productif, mais par contre, je fais le maximum (comme minimir :lol: ).
Je clapote presque 18h par jour 7/7 au boulot et chez moi, il faut dire qu'entre pure et moi ça a été le coup de foudre.

J'espere un jour etre un peu reconnu dans le monde de la prog, je me bas pour ça, mais c'est dur.
Il y a 1 an, j'etait manard et on me traitait comme un chien, maintenant grace a la prog ça a changé.

Bon courage pour ta geniale idée.
Je vais suivre ça avec interet en tant que spectateur (car je suis bon qu'a ça pour l'instant :cry:)

Excelente journée à toi. :wink:

Publié : mar. 07/nov./2006 10:12
par Backup
Huitbit a écrit : Question:
j'aimerais bien enlever les quatre lignes qui se mettent systématiquement en fin de programme :mad: :mad:
a partir de la ligne 270

tu mets ça


OpenFile (0,a$)
     While Eof (0)=0
        ligne=ligne+1
        texte$= LCase ( Trim (( ReadString (0, #PB_Ascii ))))
         If Left (texte$,13)= "; japbe versi" Or Left (texte$,12)= "; ide option"
            Break 1
         EndIf
        
        
         If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code
            
             If FindString (texte$, ";" ,1)=1
                branche=branche+1
                bloc(generation,noeud,branche)\nom= texte$
                bloc(generation,noeud,branche)\ligne_debut_code=ligne
             EndIf
            
         EndIf
     Wend
 
     CloseFile (0)


ça retire pas mal de choses :D

Modifié!

Publié : mar. 07/nov./2006 10:40
par Huitbit
Ca y est j'ai modifié le listing du post n°1
Merci M'sieur! :P

Question: Est-ce que tout le monde est concerné par ces 4 lignes qui s'affichent automatiquement à la fin du programme?



Bon ben je vais bosser...
Bonne journée!

Publié : mar. 07/nov./2006 13:20
par Frenchy Pilou
Original comme programme!
(pourquoi dans ton programme principal, il n'y a pas en en en-tête, la description du programme lui-même :)
C'est plus commode pour celui qui tombe de la lune :)
Car là (bien sûr, il y a le texte explicatif d'intro de ton post) cela démarre d'un coup :)
J'hésitais à faire partir le premier :D

Que va-t-il se passer quand tu vas charger un programme de plusieurs milliers de lignes?
L'arborescencce va -être horizontale ou verticale?

Pas tout à fait le même objectif (c'est même l'inverse) mais...
...cela me rappelle un programme très amusant qui permettait de programmer des expériences de savant fou, en plaçant des "icônes" à la souris!
Programmation visuelle quoi :)
ici commentaires (bas de la page)
http://www.abstractmachine.net/lexique/texts/diagf.htm

ici le bidule 6 megas :)
http://download.yousendit.com/B51149FB321BBE08

Grrr!..

Publié : mar. 07/nov./2006 19:55
par Huitbit
Je viens d'être sévèrement cambriolé...
Ils ont tout pris, sauf mes guitares (ça prouve que ce sont vraiment des crétins!).

Donc...

Pas de mises à jour avant longtemps....
Désolé...

Publié : mar. 07/nov./2006 22:47
par Frenchy Pilou
Pas de chance, il n'y a plus de respect dans ce bas monde! :? :(
Je ne sais si cette chanson à la guitare pourrait te réconforter :cry:
"Stances à un cambrioleur"
http://www.nomorelyrics.net/fr/chanson/ ... oleur.html

Publié : mar. 07/nov./2006 22:50
par Backup
t'as encore l'ordi ? 8O

c'est quoi tes guitares ?