[5.20 LTS] Conversion PB/Ini et C++... to PB Code

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20 LTS] Conversion PB/Ini et C++... to PB Code

Message par blendman »

Conversion de texte ou code en code purebasic, utilisable dans vos applications.


INFO

J'ai eu besoin de me coder un petit utilitaire qui me permettait de convertir un fichier (pb) en code "WriteString()" pour PB à inclure dans une autre application ^^.

Pour Mieux comprendre à quoi ça peut servir :
- application permettant de faciliter la conception de code Purebasic (éditeur de jeu 2D, 3D par exemple, ou d'application type Créateur de fenêtre (windowform...) : en sortie, on peut avoir besoin d'un fichier PB avec les infos liées à ce que l'on a effectué dans cette application.
- IDE pour PB
- éventuellement, ça pourrait être pour celui qui voudrait créer un convertisseur de code (C > PB, C++ > PB C# > PB, etc..)


Version PB
PB 5.20 LTS


Mise à jour


Version 0.3 :
29/09/2013 :
Début de l'ajout de conversion de code C++ vers du purebasic. C'est très sommaire, étant donné que je m'y connais peu en C++ (je connais juste les bases). J'essayerai d'ajouter d'autres possibilités par la suite.
Mais ça fonctionne déjà pour certains codes C++ basiques.

N'hésitez pas à poster si vous ajoutez des fonctions de conversion ;).

Conversion possible (code et condition simple):
- variable : int, char, float, double, string, const, #define
- Tableau simple à une ou deux dimensions
- For () {}
- While () {}
- Switch() {}
- If {}
- fonction simple
- commentaires : // et /**/
- remplacement de ++, --, ==, ||, &&, !

Il faut essayer d'être simple dans le code qu'on veut convertir, évitez les codes très particuliers au C++.

un code C++ à tester (je crois qu'il est à peu près correct ^^) :

Code : Tout sélectionner

   // Procedure
     int move()
     {
      Return 0;
     }

For (u=12;u<=25;u++)
  {
  truc +=12
  }

// un code test pour voir 
  If truc == 25
    {
    move()
    }

/* ici, on met un giga commentaire
sur plusieurs lignes
pour voir si 
ça marche
*/


// Define integer, string..
string name="Corky";
int i = 0;            //begin with the first cell of array
double d=0.5;

While (i< 10)    // loop test condition
{
i++;                            //increment counter by 1
}
   
   
// Array     
int Toto[10];
int Indice;
For (Indice = 0; Indice < 9; Indice++) 
  {
   Toto[Indice] = 0;
   }

Version 0.2 :
06/09/2013 :
Ajout de la conversion pour écriture de fichier ini/ pref :
- WritePreferenceInteger()
- WritePreferenceString()
- ReadPreferenceInteger()
- ReadPreferenceString()
- PreferenceGroup()
- PreferenceComment()

Version 0.1 :
05/09/2013 :
Conversion de texte pour écriture de fichier.
- WritestringN()


Utilisation :
- créer le fichier que vous souhaitez convertir en Code à insérer dans votre programme. Par exemple, un fichier Ini.
- l'ouvrir et le convertir avec cette application. Vous pourrez avoir le code en Write ou Read, pour les fichier Ini, et en WriteStringN() pour les autres fichiers (PB)

J'aimerai ajouter la conversion de fichier XML, ce qui permettrait de concevoir un éditeur de XMLDialog, la nouvelle fonction de purebasic 5.20beta ^^, mais ça risque de me prendre pas mal de temps.



Code

Code : Tout sélectionner

;{ info


; File To Txt, to use it in a conversion application

; Outil de conversion de fichier en code writestringN(), pour l'utiliser ensuite dans une 
; application de conversion : 
; - éditeur de jeu 2D, 3D
; - convertisseurs ( C > PB, C++>BP, C# > pb ...)
; - un utilitaire de création de code PB : utilitaire de création de genêtre, d'application, etc..


; Dev : Blendman


; date : 03/09/2013
;- première version, conversion PB code en writestring()

; Modifications :
; - 09/09/2013 : modification : ajout conversion d'un fichier Ini, ou txt quelconque. 
; - 27/09/2013 : ajout de la conversion depuis l'éditeur vers l'éditeur Convert, sans devoir ouvrir le fichier
; - 29/09/2013 : ajout de conversion de code C++ simple en code purebasic. Tout n'est pas possible, je n'ai pas le niveau en c++ ^^.

; Xml prévu pour plus tard.

; PB : win 5.20 LTS
; OS : normalement, tous OS

;}

;{ constantes

Enumeration Gadget
  
  #Panel
  #Editor
  #EditorConvert
  
  ; autre gadgets
  #Cb_Write
  #G_Convert
  #G_TypeCode
  
EndEnumeration

Enumeration Menu
  
  #menu_Convert
  
EndEnumeration

#File_Save =0
#CodeForPGC = 0 ; pour convertir pour PGC

Global Write$ = "Write"

;}

;{ procedures

Macro ConvertVar(name = "Int", mode = 0)
  
  ; mode = 0 > for variable
  ; mode = 1 > for constante (#define, const)
  
  
  If FindString(Line2$, name + " ", 1, #PB_String_NoCase)
    
    Fonction = 0
    
    ; is it a variable or a fonction ?
    LineNext$ = GetGadgetItemText(#editor, ligne + 1); next ligne
    
    If FindString(LineNext$, "{")
      Fonction = 1
    Else
      Fonction = -1
    EndIf
    
    
    Line2$ = RemoveString(Line2$, Name + " ", #PB_String_NoCase)
    Line2$ = RemoveString(Line2$, ";", #PB_String_NoCase)
    
    If mode = 0
      
      If FindString(Line2$, "[") ; dim
        
        
        
        count =0
        While FindString(Line2$, "[") > find
          find = FindString(Line2$, "[")
          count +1
        Wend
        
        FindArray = 1
        
        Debug "dim :" + Str(count)
        
        Select count
            
          Case 1 ; 1 dimension
            Debug "Array 1 dim"
            Line2$ = ReplaceString(line2$, "]","[")            
            a$ = StringField(Line2$,1,"[") ; the name of the array
            a1$ = StringField(Line2$,2,"["); the number of element
            Line2$ = "Dim " + a$ + "(" + a1$ + ")"
                        
          Case 2 ; 2 dimensions
            Debug "Array 2 dim"
            While FindString(Line2$, " ")
              line$ = ReplaceString(Line2$," ", "")
            Wend
            
            Line2$ = ReplaceString(line2$, "][",",")            
            Line2$ = ReplaceString(line2$, "]","[")            
            a$ = StringField(Line2$,1,"[") ; the name of the array
            a1$ = StringField(Line2$,2,"["); the number of element
            Line2$ = "Dim " + a$ + "(" + a1$ + ")"
                        
            
        EndSelect
                
      EndIf
      
      If Fonction <> - 1
        If FindString(Line2$, "(", 1, #PB_String_NoCase) ; Fonction
          Fonction = 1        
        EndIf  
      EndIf
      
    EndIf
    
    var$ = name
    
  EndIf
EndMacro

Procedure ConvertCode()
  
  Type$ = GetGadgetText(#G_TypeCode)
  
  Select Type$
      
      
    Case "pb"
     ;{ Code in PB
      ; le code converti (pour PGC)
      For ligne = 0 To CountGadgetItems(#editor) 
        
        line$   = GetGadgetItemText(#editor,ligne)
        line$   = ReplaceString(line$,Chr(34),Chr(34)+"+chr(34)+"+Chr(34))
        line2$  = "WriteStringN(#file_save,"+Chr(34)+line$+Chr(34)+")"
        Text$ + tab$ + line2$ + Chr(13)
        
      Next ligne
      ;}
      
      
    Case "ini"
     ;{ code pour fichier pref ou ini
      For ligne = 0 To CountGadgetItems(#editor) 
        
        line$ = GetGadgetItemText(#editor,ligne)
        line$=ReplaceString(line$,Chr(34),Chr(34)+"+chr(34)+"+Chr(34))
        pos = FindString(line$,"=")
        
        value = Asc(Mid(line$, pos+2, 1))
        i=2
        While value = 32
          value =Asc(Mid(line$, pos+i, 1))
          i+1
        Wend
        
        
        Select value
          Case 48 To 57, 45 ; chiffre et signe -
            ; c'est un chiffre
            Char2$ = "integer"
          Default
            Char2$ = "string"
        EndSelect
        
        char$ = Mid(line$,1,1)           
        
        Select char$ 
            
          Case ";" ; c'est un commentaire
            line2$ = "PreferenceComment("+Chr(34)+line$+Chr(34)+")"
            
          Case "[" ; c'est un groupe
            line2$ = "PreferenceGroup("+Chr(34)+line$+Chr(34)+")"
            
          Default; autre lettre de début de phrase, c'est donc un champ.
            
            Select char2$ 
                ; je ne vérifie que les integer et les string, pas les float, double, etc.. 
                ; à vous de l'ajouter si vous en avez besoin ;)
                
              Case "integer"
                ; on vérifie s'il n'y a pas d'espace en trop
                line$ = ReplaceString(line$," = ",Chr(34)+", ")
                line$ = ReplaceString(line$," =",Chr(34)+", ")
                line$ = ReplaceString(line$,"= ",Chr(34)+", ")
                line$ = ReplaceString(line$,"=",Chr(34)+", ")
                ; la phrase définitive                    
                line2$ = Write$ +"PreferenceInteger("+Chr(34)+line$+")"
                
                
                
              Default ; string
                ; on vérifie s'il n'y a pas d'espace en trop
                line$ = ReplaceString(line$," = ",Chr(34)+", "+Chr(34))
                line$ = ReplaceString(line$," =",Chr(34)+", "+Chr(34))
                line$ = ReplaceString(line$,"= ",Chr(34)+", "+Chr(34))
                line$ = ReplaceString(line$,"=",Chr(34)+", "+Chr(34))
                ; la phrase définitive
                line2$ = Write$+"PreferenceString("+Chr(34)+line$+Chr(34)+")"
                
            EndSelect
            
        EndSelect
        
        ; et hop, on sauve le fichier 
        Text$ + tab$ + line2$ + Chr(13)            
      Next ligne
      ;}
      
      
    Case "C#"  
      ;{ Todo ^^
      ;}
      
    Case "xml"
      ;{ Todo 
      
      ;}
      
      
    Case "C++" 
      ;{ Code in c++
      
      ; NOT FINISHED
      ; You can add some code if you want ;)
      
      For ligne = 0 To CountGadgetItems(#editor) 
        
        ; Get the line
        line$   = GetGadgetItemText(#editor,ligne)
        
        ; Replace all the double space
        While FindString(Line$, "  ")
          line$ = ReplaceString(line$,"  ", " ")
        Wend
        
        line2$ = line$
        
        
        ;{ Variables
        var$ =""
        ConvertVar("bool")       
        ConvertVar("int")       
        ConvertVar("char")       
        ConvertVar("string")       
        ConvertVar("float")       
        ConvertVar("double")       
        ConvertVar("#define", 1)       
        ConvertVar("const", 1)       
        
        If fonction <=0 ; it's not a fonction
          
          If FindArray = 0
            
            Select var$
                
              Case "int"
                line2$ = "Define " + line2$
                
              Case "char", "string"
                line2$ = "Define.s " + line2$
                
              Case "float"            
                line2$ = "Define.f " + line2$  
                
              Case "double"
                line2$ = "Define.d " + line2$  
                
              Case "bool" ; ?? 
                line2$ = "Define.a " + line2$  
                                
              Case   "#define", "const" ; constante
                line2$ = "#" + line2$  
                
            EndSelect
          Else 
            FindArray = 0
          EndIf
          
        Else
          
          Select var$
              
            Case "int"
              line2$ = "Procedure " + line2$
              
            Case "char", "string" ; char utilisable avec fonction ?
              line2$ = "Procedure.s " + line2$
              
            Case "float"            
              line2$ = "Procedure.f " + line2$  
              
            Case "double"
              line2$ = "Procedure.d " + line2$  
              
            Case "bool" ; utilisable avec fonction ?
              line2$ = "Procedure.a " + line2$  
                           
              
          EndSelect
          KeyWord$ = "fonction_begin"
          fonction = 0
        EndIf
              
        
        ;}
        
        ;{ Condition & loop : if, for, switch, while
        
        If FindString(Line$, "switch ", 1, #PB_String_NoCase)
          KeyWord$   ="select_begin"
          line2$ = ReplaceString(line2$, "switch", "Select")
        EndIf
        
          
        If FindString(Line$, "if ", 1, #PB_String_NoCase)
          
          KeyWord$   ="if_begin"
          line2$ = ReplaceString(line2$, "==", "=")
          
        EndIf
        
        
        If FindString(Line$, "while ", 1, #PB_String_NoCase)
          
          KeyWord$   ="while_begin"
          line2$ = ReplaceString(line2$, "==", "=")
;           
;           While FindString(Line2$, " ")
;             line2$ = ReplaceString(line2$," ", "")
;           Wend
          
        EndIf
        
                
        If FindString(Line$, "for ", 1, #PB_String_NoCase)
          ;{ keyword = for       
          
          While FindString(Line2$, " ")
            line2$ = ReplaceString(line2$," ", "")
          Wend
          
          line2$ = RemoveString(line2$, "(")
          line2$ = RemoveString(line2$, ")")
          line2$ = RemoveString(line2$, "for",#PB_String_NoCase)
          
          ; For
          a1$ = StringField(line2$,1,";") + " "
          
          varname$ = StringField(a1$,1,"="); the name of the variable to increment
          
          While FindString(varname$, " ")
            varname$ = ReplaceString(varname$," ", "")
          Wend
          
          ; To
          a2$ = StringField(line2$,2,";") + " "
          a2$ = RemoveString(a2$,varname$)
          a2$ = RemoveString(a2$,"<")          
          a2$ = RemoveString(a2$,">")
          a2$ = RemoveString(a2$,"=")
          
          ; Step
          a3$ = StringField(line2$,3,";") + " "
          a3$ = ReplaceString(a3$, "++", "1")
          a3$ = ReplaceString(a3$, "--", "-1")

          a3$ = RemoveString(a3$, "+")
          a3$ = RemoveString(a3$, varname$)
          
          ;RemoveString(a3$, "-")
          ;ReplaceString(line$, ";", "To", #PB_String_NoCase ,1,1)
          ;ReplaceString(line$, ";", "Step", #PB_String_NoCase ,1,1)
          
          line2$ = "For " + a1$ + "To " + a2$ + "Step "  + a3$
                   
          KeyWord$ = "for_begin" ; to continue until the KeyWord$ = "for_end" :{
          ;}          
        EndIf 
        ;}
        
        ;{ comments
        If FindString(Line$, "/*")
          KeyWord$ = "Comment_begin"
        EndIf
        
        If FindString(Line$, "*/")
          KeyWord$ = "Comment_end"
        EndIf
        ;}
        
        
        If FindString(Line$, "{", 1, #PB_String_NoCase)
          
              line2$ = RemoveString(line2$, "{")
                                  
        EndIf
        
        If FindString(Line$, "}", 1, #PB_String_NoCase)
          
          Select KeyWord$
              
            Case "if_begin"
              Line2$ = Chr(13) + ReplaceString(line2$, "}", "EndIf")
              
             Case "select_begin" 
              Line2$ = Chr(13) + ReplaceString(line2$, "}", "EndSelect")
              
            Case "for_begin"
              Line2$ = Chr(13) + ReplaceString(line2$, "}", "Next")
              
            Case "fonction_begin"
              Line2$ = Chr(13) + ReplaceString(line2$, "}", "EndProcedure")
              
            Case "while_begin"
              Line2$ = Chr(13) + ReplaceString(line2$, "}", "Wend")
              
            Case "fonction_begin" 
              line2$ = Chr(13) + ReplaceString(line2$, "}", "EndProcedure")
              
          EndSelect
          
          KeyWord$ = ""
                    
        EndIf
        
        ; the rest of the line
        
        Select KeyWord$
            
          Case "Comment_begin"
            Line2$ = RemoveString(Line$, "/*")
            Line2$ = "; " + Line2$
            
          Case "Comment_end"  
            Line2$ = RemoveString(Line$, "*/")
            Line2$ = "; " + Line2$
            KeyWord$ = ""
            
        EndSelect
        
        
        Line2$ = ReplaceString(Line2$, "++", "+1")
        Line2$ = ReplaceString(Line2$, "--", "-1")
        Line2$ = ReplaceString(Line2$, "+=", "+")
        Line2$ = ReplaceString(Line2$, "-=", "-")
        Line2$ = ReplaceString(Line2$, "//", ";")
        Line2$ = ReplaceString(Line2$, "||", " Or ")
        Line2$ = ReplaceString(Line2$, "&&", " And ")
        Line2$ = ReplaceString(Line2$, "!=", " <> ")
        Line2$ = ReplaceString(Line2$, "[", "(")
        Line2$ = ReplaceString(Line2$, "]", ")")
        Line2$ = ReplaceString(Line2$, "!", " Not ")
        Line2$ = ReplaceString(Line2$, "return", " ProcedureReturn ", #PB_String_NoCase)
        
        
        
        While (FindString(Line2$,";;") Or FindString(Line2$,"; ;"))
          Line2$ = ReplaceString(Line2$, ";;", " ; ")
          Line2$ = ReplaceString(Line2$, "; ;", " ; ")
        Wend
        
        Text$ + line2$ + Chr(13)
        
      Next ligne
      ;}
      
  EndSelect
  
  SetGadgetText(#editorConvert,Text$)

EndProcedure

Procedure OpenPbFile()
  Shared NomFichier$
  
  NomFichier$  = OpenFileRequester("Open a File","","Purebasic File(*.pb)|*.pb;*.pbi|Ini File(*.ini)|*.ini|Text File (*.txt)|*.txt|All Files (*.*)|*.*",0)
  
  If NomFichier$ <> ""
    ClearGadgetItems(#editor)
    If ReadFile(0,NomFichier$)
      While Eof(0) = 0
        a$ = ReadString(0)
        AddGadgetItem(#editor,-1,a$)
      Wend
      CloseFile(0)
    EndIf
  EndIf
 
EndProcedure

Procedure ConvertPbToTxt(save=1, type=0, mode=0)
  Shared NomFichier$,NewNomFichier$
  
  tab$ =""
  
  OpenPbFile()
  
  If NomFichier$ <> ""
    
    If mode = 0; détection automatique du type de fichier
      
      ext$ = GetExtensionPart(NomFichier$)
      
      Select ext$
          
        Case "pb", "txt"
          type = 0
          
        Case "ini", "pref"
          type = 1
          
        Case "xml"
          type = 2
          
        Default
          type = 0
          
      EndSelect
      
    EndIf
    
    ; le fichier de sortie
    NewNomFichier$ = GetFilePart(NomFichier$,#PB_FileSystem_NoExtension)
    NewNomFichier$ = NomFichier$+".txt"
    
    If OpenFile(0,NewNomFichier$)
      
      Select type 
          
        Case 0 ;{ pb, txt, all
          
          If #CodeForPGC = 0
            WriteStringN(#file_save,"")
            WriteStringN(#file_save,"#File_Save = 0")
            WriteStringN(#file_save,"file$=GetCurrentDirectory() + "+Chr(34)+"FichierResultat_TxtToPb.pb"+Chr(34)+"")
            WriteStringN(#file_save,"")
            WriteStringN(#file_save,"")
            WriteStringN(#file_save,"If CreateFile(#File_Save,file$)")
            WriteStringN(#file_save,"  ")
            WriteStringN(#file_save,"  ")
            tab$ = "  "
          EndIf
          
          ;{ le code converti (pour PGC)
          For ligne = 0 To CountGadgetItems(#editor) 
            line$ = GetGadgetItemText(#editor,ligne)
            line$=ReplaceString(line$,Chr(34),Chr(34)+"+chr(34)+"+Chr(34))
            
            line2$ = "WriteStringN(#file_save,"+Chr(34)+line$+Chr(34)+")"
            Text$ + tab$ + line2$ + Chr(13)
            WriteStringN(0, line2$)
          Next ligne
          ;}
          
          If #CodeForPGC = 0
            WriteStringN(#file_save,"  ")
            WriteStringN(#file_save,"  CloseFile(#File_Save)")
            WriteStringN(#file_save,"EndIf  ")
            WriteStringN(#file_save,"")
            WriteStringN(#file_save,"; IDE Options = PureBasic 5.20 beta 13 LTS (Windows - x86)")
            WriteStringN(#file_save,"; CursorPosition = 9")
            WriteStringN(#file_save,"; EnableXP")
            WriteStringN(#file_save,"; Executable = ConvertTxtToPB.exe")
            WriteStringN(#file_save,"")
          EndIf      
          ;}
          
        Case 1 ;{ ini, pref
          
          For ligne = 0 To CountGadgetItems(#editor) 
            
            line$ = GetGadgetItemText(#editor,ligne)
            line$=ReplaceString(line$,Chr(34),Chr(34)+"+chr(34)+"+Chr(34))
            pos = FindString(line$,"=")
            
            value = Asc(Mid(line$, pos+2, 1))
            i=2
            While value = 32
              value =Asc(Mid(line$, pos+i, 1))
              i+1
            Wend
            
            
            Select value
              Case 48 To 57, 45 ; chiffre et signe -
                ; c'est un chiffre
                Char2$ = "integer"
              Default
                Char2$ = "string"
            EndSelect
            
            char$ = Mid(line$,1,1)           
            
            Select char$ 
                
              Case ";" ; c'est un commentaire
                line2$ = "PreferenceComment("+Chr(34)+line$+Chr(34)+")"
                
              Case "[" ; c'est un groupe
                line2$ = "PreferenceGroup("+Chr(34)+line$+Chr(34)+")"
                
              Default; autre lettre de début de phrase, c'est donc un champ.
                
                Select char2$ 
                    ; je ne vérifie que les integer et les string, pas les float, double, etc.. 
                    ; à vous de l'ajouter si vous en avez besoin ;)
                    
                  Case "integer"
                    ; on vérifie s'il n'y a pas d'espace en trop
                    line$ = ReplaceString(line$," = ",Chr(34)+", ")
                    line$ = ReplaceString(line$," =",Chr(34)+", ")
                    line$ = ReplaceString(line$,"= ",Chr(34)+", ")
                    line$ = ReplaceString(line$,"=",Chr(34)+", ")
                    ; la phrase définitive                    
                    line2$ = Write$ +"PreferenceInteger("+Chr(34)+line$+")"
                    
                    
                                        
                  Default ; string
                     ; on vérifie s'il n'y a pas d'espace en trop
                    line$ = ReplaceString(line$," = ",Chr(34)+", "+Chr(34))
                    line$ = ReplaceString(line$," =",Chr(34)+", "+Chr(34))
                    line$ = ReplaceString(line$,"= ",Chr(34)+", "+Chr(34))
                    line$ = ReplaceString(line$,"=",Chr(34)+", "+Chr(34))
                     ; la phrase définitive
                    line2$ = Write$+"PreferenceString("+Chr(34)+line$+Chr(34)+")"
                    
                EndSelect
                
            EndSelect
            
            ; et hop, on sauve le fichier 
            Text$ + tab$ + line2$ + Chr(13)            
            WriteStringN(0, line2$)
          Next ligne
          ;}
          
        Case 2 ;{ xml - pas encore réalisé
          ;}
          
      EndSelect
  
      CloseFile(0)
      
    EndIf
    
  EndIf
  
  SetGadgetText(#editorConvert,Text$)
  ;CopyFile(NewNomFichier$,"Conversion.pb")
EndProcedure


Procedure ResizeEditor()
  
  H = WindowHeight(0)-MenuHeight()- 40
  ResizeGadget(#editor,#PB_Ignore,#PB_Ignore,       WindowWidth(0)-30, H - 40)
  ResizeGadget(#editorConvert,#PB_Ignore,#PB_Ignore,WindowWidth(0)-30, H - 40)
  ResizeGadget(#Panel,#PB_Ignore,#PB_Ignore,        WindowWidth(0)-10, H)
  
EndProcedure

;}

;{ open window

If OpenWindow(0,0,0,500,300,"Conversion Fichier (pb, ini..) en Code",
              #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  ;{ menu
  If CreateMenu(0,WindowID(0))
    MenuTitle("File")
    MenuItem(#menu_Convert,     "Convert a File (pb, ini, ..) to PBCode and save this code in a Txt File")
  EndIf  
  AddKeyboardShortcut(0,#PB_Shortcut_O|#PB_Shortcut_Control, 0)
  ;}  
  ;{ Gadgets
  
  CheckBoxGadget(#Cb_Write, 10, 5, 100, 20, "Write Mode")  
  GadgetToolTip(#Cb_Write, "If checked, the mode is write, if not, the mode is read (Ini File only)")
  SetGadgetState(#Cb_Write,1)
  
  ComboBoxGadget(#G_TypeCode, 130, 5 , 200, 20)
  AddGadgetItem(#G_TypeCode, 0, "pb")
  AddGadgetItem(#G_TypeCode, 1, "ini")
  AddGadgetItem(#G_TypeCode, 2, "C++")
  GadgetToolTip(#G_TypeCode,"Convert a text to a pb code for write or read fonction (writeStingN(), Writepreference()...), Or from other langage To PB code (c++ is a test)")
  
  SetGadgetState(#G_TypeCode, 0)
  
  ButtonGadget(#G_Convert, GadgetX(#G_TypeCode) + GadgetWidth(#G_TypeCode) + 10, 5, 70, 20, "Convert")
               
  If PanelGadget(#Panel,5,30,490,270)
    
    AddGadgetItem(#panel,-1,"Original")
    EditorGadget(#editor,5,5,470,230)
    
    AddGadgetItem(#panel,-1,"Converted")
    EditorGadget(#editorConvert,5,5,470,230)
    
    CloseGadgetList()
  EndIf
  
  ResizeEditor()
  ;}
  
    Repeat
      event = WaitWindowEvent()
      
      Select event
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
            Case #G_Convert
              ConvertCode()
              
            Case #Cb_Write
              write = GetGadgetState(#Cb_Write)
              If write
                write$ = "Write"
              Else
                write$ = " = Read"
              EndIf
              
            Case #G_TypeCode
              If GetGadgetText(#G_TypeCode) = "C++"
                
                If First_Type = 0
                  
                  First_Type = 1
                  MessageRequester("Info", " Not finished, use simple code (for()...")
                  
                EndIf
                
              EndIf
                            
          EndSelect
                        
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #menu_Convert
              ConvertPbToTxt()
                          
          EndSelect
          
        Case  #PB_Event_SizeWindow
          ResizeEditor()
          
      EndSelect
            
    Until event = #PB_Event_CloseWindow
    
  EndIf
  ;}  
N'hésitez pas à poster le code si vous le modifiez, que vous l'améliorez ou que vous ajoutez d'autres conversion (langage ou autre chose ^^)
Dernière modification par blendman le dim. 29/sept./2013 14:43, modifié 5 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par falsam »

Pour Mieux comprendre à quoi ça peut servir :
Heureusement que tu apportes quelques précisions sur l'utilité de ton code :)
Bien dormi ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par blendman »

falsam a écrit :Heureusement que tu apportes quelques précisions sur l'utilité de ton code :)
Bien dormi ?
:mrgreen:

En fait, J'ai eu besoin de cet utilitaire car je crée pendant mon temps libre un petit éditeur de jeu, qui me permet de sortir du code purebasic fonctionnel, en fonction de chose que j'effectue dans cet éditeur, comme un windowsform en quelque sorte.

Donc, dans ma procédure SaveInPbCode(), je notais à chaque fois le code à la main, genre :

Code : Tout sélectionner

 
WriteStringN(#file_save,";{ OpenWindow")      
WriteStringN(#file_save,"Flag = "+ Doc\Flag$)      
WriteStringN(#file_save,"If OpenWindow(#winmain,0,0,"+Doc\GameSizeW+","+Doc\GameSizeH+","+Chr(34)+Doc\name$+Chr(34)+",Flag)")
If doc\FullScreen
  
Else 
  WriteStringN(#file_save,"  If OpenWindowedScreen(WindowID(winmain),0,0,"+Doc\GameSizeW+","+Doc\GameSizeH+")")
  WriteStringN(#file_save,"  Else")
  WriteStringN(#file_save,"    MessageRequester("+Chr(34)+"Error"+Chr(34)+","+Chr(34)+"Unable To open the Screen."+Chr(34)+")")
  WriteStringN(#file_save,"    End")
  WriteStringN(#file_save,"  Endif")        
EndIf
WriteStringN(#file_save,"Else")
WriteStringN(#file_save,"    MessageRequester("+Chr(34)+"Error"+Chr(34)+","+Chr(34)+"Unable To open the Window."+Chr(34)+")")
WriteStringN(#file_save,"    End")
WriteStringN(#file_save,"Endif")
WriteStringN(#file_save,";}")
WriteStringN(#file_save,"")
Maintenant, je tape le code que je veux en sortie, je lance mon convertisseur , je n'ai plus qu'à copier-coller ce code dans mon fichier purebasic et à le modifier un peu, dans mon petit éditeur de jeu, là où je convertis mon jeu en fichier purebasic :) (dans ma procédure SaveInPbCode()).

ça me fait gagner de précieuses minutes , sans compter les problèmes de debug à cause d'une virgule mal placée ou autre qui sont du coup déjà réglé en partie.

Bientôt, quand j'aurai une version utilisable, je posterai un exemple de mon petit éditeur de jeu, tu comprendras mieux le gros intérêt de ce petit code du 1er message ;).

Sinon, oui, bien dormi.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par Backup »

en fait , j'ai peut etre pas compris le concept
mais chez moi , lorsque je prends un *****.Pb

que je le renomme en *****.txt
je peux ouvrir ce texte dans n'importe quel editeur .....

donc ce simple code permet de transformer un fichier *.pb en fichier *.txt

Code : Tout sélectionner

file$=OpenFileRequester("choisir un *.PB","*.pb","c:\",0)
path$=GetPathPart(file$)
nom$= stringfield(GetFilePart(file$),1,".")
extention$=".txt"
sortie$=path$+nom$+extention$
RenameFile(file$, sortie$) 

End
; EPB
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par blendman »

En fait, le concept, c'est de partir d'un fichier pb (ou un code) et d'ajouter les WritestringN() à chaque ligne en changeant les " par Chr(14), etc.. pour avoir ensuite un nouveau code qui est fonctionnel sous PB et qui m'écrit le même fichier PB (que le premier, car ainsi, je peux tester des fonctions qui fonctionnent et ensuite, je peux les inclure dans mon petit éditeur de jeu).

Par exemple :

Code en entrée :

Code : Tout sélectionner

;{ OpenWindow
Flag = #PB_Window_SystemMenu
If OpenWindow(0,0,0,0,0,"",Flag)
EndIf
;}
Et ensuite d'obtenir un fichier texte avec ça (je peux ensuite, ajouter ou remplacer facilement les passages que je veux, comme ici : Doc\flag$, Doc\GameSizeW, etc..) :
Code en sortie (avec mes quelques ajouts) :

Code : Tout sélectionner

WriteStringN(#file_save,";{ OpenWindow")     
WriteStringN(#file_save,"Flag = "+ Doc\Flag$)     
WriteStringN(#file_save,"If OpenWindow(#winmain,0,0,"+Doc\GameSizeW+","+Doc\GameSizeH+","+Chr(34)+Doc\name$+Chr(34)+",Flag)")
WriteStringN(#file_save,"EndIf")  
WriteStringN(#file_save,";}")  
C'est ce dernier code que j'ajoute dans ma procedure :

Code : Tout sélectionner

Procedure SaveGameInPb()
WriteStringN(#file_save,";{ OpenWindow")     
WriteStringN(#file_save,"Flag = "+ Doc\Flag$)     
WriteStringN(#file_save,"If OpenWindow(#winmain,0,0,"+Doc\GameSizeW+","+Doc\GameSizeH+","+Chr(34)+Doc\name$+Chr(34)+",Flag)")
WriteStringN(#file_save,"EndIf")  
WriteStringN(#file_save,";}")  
; Etc....
EndProcedure

Je suis en train de créer un petit éditeur de jeu et en sauvegarde, je veux avoir un fichier PB fonctionnel.
Si je compile ce fichier de sortie, normalement, le jeu est fonctionnel car le code est tout fait, via mon éditeur.
Donc, j'ai besoin de sauvegarder, dans mon éditeur, avec des WriteStringN() qui m'ajoute le code "converti" depuis mon éditeur.

Comme le WindowsForm de purebasic j'imagine.

Le code du 1er message me permet juste de gagner du temps et de vérifier d'abord que je code que je veux mettre dans ma procédure SaveGameInPb() est fonctionnel ^^.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par Backup »

oui je comprends

du code qui ecrit du code :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20 LTS] Conversion PB to Txt (writestring())

Message par blendman »

Dobro a écrit :du code qui écrit du code :)
Exactement ;)
Pour gagner un peu de temps.

Je viens d'ajouter la conversion d'un fichier Ini.
Ça peut être très utile lorsque l'on a déjà écrit le fichier Ini qu'on veut en sortie par exemple ^^.
Pour un fichier de préférence par exemple.

Utilisation :
- on écrit le fichier qu'on veut en sortie (en mettant des valeurs au hasard si besoin dans les champs)
- on convertit
- et on obtient le code à mettre dans notre programme. Il n'y a plus qu'à le modifier en insérant à la place des valeurs les variables qu'on veut sauvegarder :)

Je suis en train de réfléchir à l'ajout de conversion de fichier XML, mais là, ça va être beaucoup plus long ^^.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20 LTS] Conversion PB/Ini et C++... to PB Code

Message par blendman »

Salut

Je viens d'ajouter :
- la possibilité de convertir directement depuis un code qu'on tape ou qu'on colle dans l'éditeur
- la conversion de code simple C++ vers du purebasic.

Je ne m'y connais pas beaucoup en C++, donc c'est très limité.
Mais si quelqu'un qui s'y connait mieux veut modifier ou ajouter d'autres possibilités, surtout qu'il n'hésite pas ^^.
Répondre