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
;}