[TUTO] Le compilateur en mode « Standby »
[TUTO] Le compilateur en mode « Standby »
ça me turlupinait un temps de ne rien trouver à ce sujet. (Si j'ai loopé un tel sujet, son auteur m'en voit désolé). Mais j'ai été surpris de découvrir l'aide dans le répertoire SDK (grâce à un gars du forum anglais)
de PB (à mon nez et à ma barbe...).
Je poste la traduction de ces quelques
instructions.
___________________________________________________________
_______________________
Le compilateur PUREBASIC
______________________
Interface de communication avec éditeurs et scripts
____________________________________________________________
Compatibilité
Nous [la PBTeam] essayons de garder la compatibilité avec les anciennes
versions autant que possible, donc les anciens editeurs/
scripts peuvent encore fonctionner avec les nouvelles
versions de PB.
Les exceptions seront inscrites dans ce document fourni avec
chaque nouvelle version de compilateur.
Les anciennes versions de PB pour Windows (< 4.00)
utilisaient une Interface qui n'est plus valable pour les
versions récentes (> Version 4.00). Donc, si vous utilisiez
cette Interface, il vous faut faire la mise à jour.
Generalités
Quand le compilateur est démarré avec l'option /STANDBY (sous
Windows) ou l'option --standby (sous Linux et Mac), il va
attendre les commandes depuis l'entrée standard et répondre
vers la sortie standard. Cela permet de contrôler le
compilateur depuis un language ou script capable d'accéder
au canal standard du programme.
Sous PB, la librairie 'Process' permet cet échange
d'information.
Les commandes doivent être données sous forme de texte terminé
par un code de retour chariot (code ASCII 13, #CRLF ou #LF).
Il est important de respecter cette syntaxe sinon le compilateur
va mal réagir. La fonction 'WriteProgramStringN()' de la
librairie 'process' assure bien cette manoeuvre.
D'autres language ont cette même fonction comme fflush() en C.
Une commande doit être écrite en majuscule en début de ligne,
suivi d'éventuels arguments séparés par une tabulation.
(Les tabulations sont Notées <T> dans ce document).
Il ne doit pas y avoir d'espace, sauf s'ils appartiennent à un
des arguments d'une commande.
Excepté au démarrage, le compilateur écrira tout dans la sortie
standard en tant que réponse à une commande envoyée. Donc, vous
avez besoin de vérifier l'arrivée d'une réponse uniquement après
l'envoi d'une commande.
Le retour de réponse dépend donc uniquement du fait que l'on
envoie des commandes. Si rien n'est envoyé, la réponse est une
ligne unique de départ.
Dès le démarrage, le compilateur écrit cette ligne:
STARTING<T><VersionNr><VersionString>
<VersionNr> contient le numéro de version du compilateur sous
la forme '4.30'
Cette valeur peut être utilisée pour déterminer quelles commandes
sont supportés par le compilateur.
<VersionString> est la version du compilateur sous la forme
'PureBasic 4.10 (Windows - x86)'.
Ensuite, le compilateur charge ses librairies, et indique la ligne
suivante:
READY
- Le compilateur a fini son chargement initial et est prêt
à fonctionner
ERROR<T><Message>
- Le compilateur ne peut pas fonctionner
correctement pour les raisons données dans le message.
ERROR<T>SUBSYSTEM<T><SubsystemName>
- Le compilateur ne trouve pas le sous-système spécifié
Après le message 'READY', le compilateur attend désormais les
commandes sur le canal d'entrée standard.
Par contre, après un message 'ERROR', le compilateur s'arrête
immédiatement.
Sous-système et mode unicode
Les options de librairie sous-système et d'unicode ne peuvent
être modifiées pendant le fonctionnement du compilateur.
Pour effectuer un tel changement, le compilateur doit être
redémarré. C'est pourquoi ces deux types d'options sont
indisponibles ici. Ces deux types d'options doivent être
spécifiées dans la ligne de commande, au démarrage du
compilateur, au même titre que l'option /STANDBY.
Commandes supportées
(Depuis la version 4.10)
END
Ordonne au compilateur de s'arrêter
Paramètre(s) : Aucun
Réponse(s) : Aucune
SOURCE<T><FichierSource>
Indique au compilateur le nom du fichier source
pour la prochaine comilation
Paramètre(s) : Le nom du fichier source. (Il doit contenir
l'intégralité du chemin d'accès)
Réponse(s) : Aucune
SOURCEALIAS<T><SouceFile Alias>
Indique au compilateur le nom du fichier qui sera retourné dans
la constante #PB_Compiler_File pour le code source principal
à la place du nom de fichier spécifié par la commande SOURCE.
C'est utile pour les éditeurs qui compilent à partir d'un fichier
temporaire, mais qui veulent que le fichier source réel soit
reporté ici.
Paramètre(s) : Le nom du fichier (doit contenir l'intégralité du
chemin d'accès)
Réponse(s) : Aucune
INCLUDEPATH<T><Chemin>
Indique au compilateur quelles instructions de tous les
'FichierDInclusion' seront pris en compte. Cela permet de
mettre le fichier source dans répertoire temporaire en incluant
les fichiers relatifs au chemin d'origine. Si le chemin d'inclusion
n'est pas spécifié, le chemin du fichier source est utilisé par défaut.
Paramètre(s) : Le chemin d'accès. Il doit être complet et terminé
par un caractère '\' ou '/' (selon l'OS)
Réponse(s) : Aucune
RESOURCE<T><File>
(Pour Windows uniquement) Spécifie un script ressource (*.rc) à
inclure dans la compilation.
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
ICON<T><File>
Spécifie une icône pour l'application
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
Types de fichier supportés:
Windows : *.ico
MacOSX : *.icns
Linux : Non supporté
TARGET<T><FichierCible>
Spécifie le fichier cible pour la prochaine compilation.
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
CONSTANT<T><ConstantDefinition>
Définit une constant pour la prochaine compilation.
Paramètre(s) : La ligne définissant intégralement la constante
Réponse(s) : Aucune. Si la définition venait à créer une erreur, cette
erreur n'apparaîtra qu'à la prochaine compilation.
Note : C'est la même règle pour l'option /CONSTANT dans la ligne
de commande. Ce qui signifie que la syntaxe doit être du type
"NAME=Value" sans le caractère '#' et sans espace autour du
signe '='. Cela signifie aussi que les nombres seront interprétés
comme des constantes numériques alors que toute expression
autre qu'un nombre sera considérée comme une constante
chaîne.
LINKER<T><FichierCommandeLieur>
Spécifie les options de la ligne de commande pour le lieur
(Semblable à l'option /LINKER de la ligne de commande)
Paramètre(s) : Un nom de fichier contenant les commandes
pour le lieur (doit contenir le chemin complet)
Réponse(s) : Aucune
COMPILE<T><FlagsList>
Démarre la compilation avec un fichier source, un fichier
cible et les drapeaux d'état préalablement spécifiés.
Paramètre(s) : Liste des drapeaux d'état séparés par une
tabulation.
Drapeaux d'état possibles :
DEBUGGER - Compilateur avec débogueur
INLINEASM - Autorise l'assembleur en ligne
DLL - Crée un DLL
XPSKIN - Active les skins XP (Windows uniquement)
ADMINISTRATOR - Mode administrateur sous Vista (Windows uniquement)
USER - Mode utilisateur (Windows uniquement)
CONSOLE - Crée un exécutable en mode console (Windows uniquement)
ONERROR - Autorise les instructions de la librairie OnError
MMX - Crée un exécutable optimisé MMX
3DNOW - Crée un exécutable optimisé 3DNOW
SSE - Crée un exécutable optimisé SSE
SSE2 - Crée un exécutable optimisé SSE2
DYNAMICCPU - Crée un exécutable compatible à tous les CPUs
THREAD - - Crée un exécutable avec sécurisation des threads
PROGRESS - Indique la progression de la compilation (Cf plus bas)
WARNINGS - Affiche les messages d'avertissement (Ver 4.30 Cf plus bas)
Exemple: 'COMPILE<T>DEBUGGER<T>THREAD' compilera avec le
débogueur et avec la sécurisation des threads
Après que la commande ait été exécutée (avec ou sans succès),
toutes les options (SOURCE, TARGET, ICON, RESOURCE,
INCLUDEPATH, CONSTANT, LINKER) seront effacées.
Elles ont donc besoin d'être à nouveau spécifiées par la suite
pour une future compilation.
Réponse(s) :
Si le drapeau d'état PROGRESS est spécifié, le compilateur
répondra par une ou plusieurs des lignes suivantes :
PROGRESS<T>INCLUDE<T><FileName> - un nouveau fichier est inclu
PROGRESS<T>LINES<T><LinesCount> - renseigne de la progression
toutes les 1000 lignes ainsi qu'à la fin totale de la lecture
PROGRESS<T>ASSEMBLING - indique que l'assemblage est accompli
PROGRESS<T>LINKING - indique que les liens sont accomplis
De nouveaux indicateurs de progression devraient voir le jour à l'avenir, donc
pour assurer la compatibilité future, les lignes de réponse sous la forme
'PROGRESS<T>XXX' et qui ne sont pas comprises doivent être ignorées.
Pour les versions 4.30 et ultérieures, si le drapeau d'état 'WARNINGS' est
spécifié, le compilateur est susceptible d'émettre des messages
d'avertissement. La séquence est comme le modèle qui suit :
WARNING<T><Source NumeroLigne>
Un message d'avertissement est émis pour la ligne donnée
Ce qui suit est un nombre de lignes d'informations optionnelles terminé par
la ligne 'OUTPUT<T>COMPLETE'.
A l'avenir, il pourra y avoir plus de lignes en guise de réponse, donc pour
assurer la compatibilité future, il est recommandé de lire toutes les lignes
jusqu'à ce que la ligne 'OUTPUT<T>COMPLETE' soit atteinte en ignorant
ce qui est non identifiable.
INCLUDEFILE<T><NomFichier><T><NumeroLigne>
L'erreur décelé se situe dans un fichier d'inclusion. Les arguments
indiquent donc le nom de fichier et la ligne mise en cause dans le
fichier d'inclusion.
MESSAGE<T><Texte>
Le message d'avertissement actuel.
OUTPUT<T>COMPLETE
Indique la fin de la séquence d'avertissement.
Quand la compilation est effectuée, la réponse peut être :
SUCCESS
La compilation s'est passé correctement
ERROR<T>SYNTAX<T><Source NumeroLigne>
Une erreur a été détectée durant la compilation du code PB
L'argument <Source NumeroLigne> donne le numéro de ligne
où l'erreur s'est produite.
Ce qui suit est un ensemble d'informations optionnelles se
terminant toujours par le signal 'OUTPUT<T>COMPLETE'
A l'avenir, d'autres types de réponse pourront être ajoutées
donc... pour assurer... la compatibilité, il est... recommandé
de lire toutes les lignes jusqu'à ce que la ligne
'OUTPUT<T>COMPLETE' soit atteinte, en ignorant les lignes
qui ne sont pas identifiables.
INCLUDEFILE<T><NomFichier><T><NumeroLigne>
Une erreur s'est produite dans un fichier d'inclusion. Les
arguments donnent le nom de fichier et le numéro de
ligne dans lesquels s'est produite l'erreur.
MACRO<T><ErrorLine><T><TotalMacroLines>
Une erreur a eu lieu dans une macro. Ce qui suit cette ligne
est le contenu de la macro déployée. (<TotalMacroLines>
= nombre de lignes). Cela se termine par une ligne contenant
'MACRO<T>COMPLETE'
<ErrorLine> donne la ligne dans la macro a provoqué
une erreur.
MESSAGE<T><Texte>
Le message de l'erreur actuellement décelée.
OUTPUT<T>COMPLETE
Indique la fin de la séquence d'informations sur l'erreur de syntaxe.
Note : Si certain des numéros de ligne ne peuvent pas être
déterminés par le compilateur (par exemple pour les erreurs
qui ne peuvent pas être précisément localisées), le numéro de
ligne retourné sera -1. Donc, vous devez vous attendre à gérer
cetype de valeur.
ERROR<T>ASSEMBLER
ERROR<T>LINKER
ERROR<T>RESOURCE
Une erreur a été détectée durant l'assemblage, le linkage
ou la compilation des ressources de script. Les informations
qui suivent sont alors retournées par le compilateur sous la forme
d'une séquence se terminant par 'OUTPUT<T>COMPLETE'.
FUNCTIONLIST
Demande le listing des fonctions connues par le compilateur.
(Fonctions PB + Fonctions librairie utilisateur)
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de fonctions.
Il y succède une fonction par ligne avec le nom de la fonction et
une brève description (si spécifié durant la création de la librairie).
La séquence se termine par 'OUTPUT<T>COMPLETE'.
STRUCTURELIST
Demande le listing des structures connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de structures.
Il y succède un nom de structure par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.
INTERFACELIST
Demande le listing des interfaces connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre d'interfaces.
Il y succède un nom d'interface par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.
STRUCTURE<T><Nom>
Demande le contenu d'une structure connue par le compilateur.
Paramètre(s) : Le nom de la structure
Réponse(s) : La définition de la structure à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.
INTERFACE<T><Nom>
Demande le contenu d'une interface connue par le compilateur.
Paramètre(s) : Le nom de l'interface
Réponse(s) : La définition de l'interface à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.
HELPDIRECTORY<T><NomFonction>
Demande au compilateur le nom de la librairie d'une fonction
spécifiée.
Paramètre(s) : Le nom de la fonction
Réponse(s) : Soit 'API', soit 'UNKNOWN' soit le nom de
le librairie spécifiée
de PB (à mon nez et à ma barbe...).
Je poste la traduction de ces quelques
instructions.
___________________________________________________________
_______________________
Le compilateur PUREBASIC
______________________
Interface de communication avec éditeurs et scripts
____________________________________________________________
Compatibilité
Nous [la PBTeam] essayons de garder la compatibilité avec les anciennes
versions autant que possible, donc les anciens editeurs/
scripts peuvent encore fonctionner avec les nouvelles
versions de PB.
Les exceptions seront inscrites dans ce document fourni avec
chaque nouvelle version de compilateur.
Les anciennes versions de PB pour Windows (< 4.00)
utilisaient une Interface qui n'est plus valable pour les
versions récentes (> Version 4.00). Donc, si vous utilisiez
cette Interface, il vous faut faire la mise à jour.
Generalités
Quand le compilateur est démarré avec l'option /STANDBY (sous
Windows) ou l'option --standby (sous Linux et Mac), il va
attendre les commandes depuis l'entrée standard et répondre
vers la sortie standard. Cela permet de contrôler le
compilateur depuis un language ou script capable d'accéder
au canal standard du programme.
Sous PB, la librairie 'Process' permet cet échange
d'information.
Les commandes doivent être données sous forme de texte terminé
par un code de retour chariot (code ASCII 13, #CRLF ou #LF).
Il est important de respecter cette syntaxe sinon le compilateur
va mal réagir. La fonction 'WriteProgramStringN()' de la
librairie 'process' assure bien cette manoeuvre.
D'autres language ont cette même fonction comme fflush() en C.
Une commande doit être écrite en majuscule en début de ligne,
suivi d'éventuels arguments séparés par une tabulation.
(Les tabulations sont Notées <T> dans ce document).
Il ne doit pas y avoir d'espace, sauf s'ils appartiennent à un
des arguments d'une commande.
Excepté au démarrage, le compilateur écrira tout dans la sortie
standard en tant que réponse à une commande envoyée. Donc, vous
avez besoin de vérifier l'arrivée d'une réponse uniquement après
l'envoi d'une commande.
Le retour de réponse dépend donc uniquement du fait que l'on
envoie des commandes. Si rien n'est envoyé, la réponse est une
ligne unique de départ.
Dès le démarrage, le compilateur écrit cette ligne:
STARTING<T><VersionNr><VersionString>
<VersionNr> contient le numéro de version du compilateur sous
la forme '4.30'
Cette valeur peut être utilisée pour déterminer quelles commandes
sont supportés par le compilateur.
<VersionString> est la version du compilateur sous la forme
'PureBasic 4.10 (Windows - x86)'.
Ensuite, le compilateur charge ses librairies, et indique la ligne
suivante:
READY
- Le compilateur a fini son chargement initial et est prêt
à fonctionner
ERROR<T><Message>
- Le compilateur ne peut pas fonctionner
correctement pour les raisons données dans le message.
ERROR<T>SUBSYSTEM<T><SubsystemName>
- Le compilateur ne trouve pas le sous-système spécifié
Après le message 'READY', le compilateur attend désormais les
commandes sur le canal d'entrée standard.
Par contre, après un message 'ERROR', le compilateur s'arrête
immédiatement.
Sous-système et mode unicode
Les options de librairie sous-système et d'unicode ne peuvent
être modifiées pendant le fonctionnement du compilateur.
Pour effectuer un tel changement, le compilateur doit être
redémarré. C'est pourquoi ces deux types d'options sont
indisponibles ici. Ces deux types d'options doivent être
spécifiées dans la ligne de commande, au démarrage du
compilateur, au même titre que l'option /STANDBY.
Commandes supportées
(Depuis la version 4.10)
END
Ordonne au compilateur de s'arrêter
Paramètre(s) : Aucun
Réponse(s) : Aucune
SOURCE<T><FichierSource>
Indique au compilateur le nom du fichier source
pour la prochaine comilation
Paramètre(s) : Le nom du fichier source. (Il doit contenir
l'intégralité du chemin d'accès)
Réponse(s) : Aucune
SOURCEALIAS<T><SouceFile Alias>
Indique au compilateur le nom du fichier qui sera retourné dans
la constante #PB_Compiler_File pour le code source principal
à la place du nom de fichier spécifié par la commande SOURCE.
C'est utile pour les éditeurs qui compilent à partir d'un fichier
temporaire, mais qui veulent que le fichier source réel soit
reporté ici.
Paramètre(s) : Le nom du fichier (doit contenir l'intégralité du
chemin d'accès)
Réponse(s) : Aucune
INCLUDEPATH<T><Chemin>
Indique au compilateur quelles instructions de tous les
'FichierDInclusion' seront pris en compte. Cela permet de
mettre le fichier source dans répertoire temporaire en incluant
les fichiers relatifs au chemin d'origine. Si le chemin d'inclusion
n'est pas spécifié, le chemin du fichier source est utilisé par défaut.
Paramètre(s) : Le chemin d'accès. Il doit être complet et terminé
par un caractère '\' ou '/' (selon l'OS)
Réponse(s) : Aucune
RESOURCE<T><File>
(Pour Windows uniquement) Spécifie un script ressource (*.rc) à
inclure dans la compilation.
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
ICON<T><File>
Spécifie une icône pour l'application
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
Types de fichier supportés:
Windows : *.ico
MacOSX : *.icns
Linux : Non supporté
TARGET<T><FichierCible>
Spécifie le fichier cible pour la prochaine compilation.
Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune
CONSTANT<T><ConstantDefinition>
Définit une constant pour la prochaine compilation.
Paramètre(s) : La ligne définissant intégralement la constante
Réponse(s) : Aucune. Si la définition venait à créer une erreur, cette
erreur n'apparaîtra qu'à la prochaine compilation.
Note : C'est la même règle pour l'option /CONSTANT dans la ligne
de commande. Ce qui signifie que la syntaxe doit être du type
"NAME=Value" sans le caractère '#' et sans espace autour du
signe '='. Cela signifie aussi que les nombres seront interprétés
comme des constantes numériques alors que toute expression
autre qu'un nombre sera considérée comme une constante
chaîne.
LINKER<T><FichierCommandeLieur>
Spécifie les options de la ligne de commande pour le lieur
(Semblable à l'option /LINKER de la ligne de commande)
Paramètre(s) : Un nom de fichier contenant les commandes
pour le lieur (doit contenir le chemin complet)
Réponse(s) : Aucune
COMPILE<T><FlagsList>
Démarre la compilation avec un fichier source, un fichier
cible et les drapeaux d'état préalablement spécifiés.
Paramètre(s) : Liste des drapeaux d'état séparés par une
tabulation.
Drapeaux d'état possibles :
DEBUGGER - Compilateur avec débogueur
INLINEASM - Autorise l'assembleur en ligne
DLL - Crée un DLL
XPSKIN - Active les skins XP (Windows uniquement)
ADMINISTRATOR - Mode administrateur sous Vista (Windows uniquement)
USER - Mode utilisateur (Windows uniquement)
CONSOLE - Crée un exécutable en mode console (Windows uniquement)
ONERROR - Autorise les instructions de la librairie OnError
MMX - Crée un exécutable optimisé MMX
3DNOW - Crée un exécutable optimisé 3DNOW
SSE - Crée un exécutable optimisé SSE
SSE2 - Crée un exécutable optimisé SSE2
DYNAMICCPU - Crée un exécutable compatible à tous les CPUs
THREAD - - Crée un exécutable avec sécurisation des threads
PROGRESS - Indique la progression de la compilation (Cf plus bas)
WARNINGS - Affiche les messages d'avertissement (Ver 4.30 Cf plus bas)
Exemple: 'COMPILE<T>DEBUGGER<T>THREAD' compilera avec le
débogueur et avec la sécurisation des threads
Après que la commande ait été exécutée (avec ou sans succès),
toutes les options (SOURCE, TARGET, ICON, RESOURCE,
INCLUDEPATH, CONSTANT, LINKER) seront effacées.
Elles ont donc besoin d'être à nouveau spécifiées par la suite
pour une future compilation.
Réponse(s) :
Si le drapeau d'état PROGRESS est spécifié, le compilateur
répondra par une ou plusieurs des lignes suivantes :
PROGRESS<T>INCLUDE<T><FileName> - un nouveau fichier est inclu
PROGRESS<T>LINES<T><LinesCount> - renseigne de la progression
toutes les 1000 lignes ainsi qu'à la fin totale de la lecture
PROGRESS<T>ASSEMBLING - indique que l'assemblage est accompli
PROGRESS<T>LINKING - indique que les liens sont accomplis
De nouveaux indicateurs de progression devraient voir le jour à l'avenir, donc
pour assurer la compatibilité future, les lignes de réponse sous la forme
'PROGRESS<T>XXX' et qui ne sont pas comprises doivent être ignorées.
Pour les versions 4.30 et ultérieures, si le drapeau d'état 'WARNINGS' est
spécifié, le compilateur est susceptible d'émettre des messages
d'avertissement. La séquence est comme le modèle qui suit :
WARNING<T><Source NumeroLigne>
Un message d'avertissement est émis pour la ligne donnée
Ce qui suit est un nombre de lignes d'informations optionnelles terminé par
la ligne 'OUTPUT<T>COMPLETE'.
A l'avenir, il pourra y avoir plus de lignes en guise de réponse, donc pour
assurer la compatibilité future, il est recommandé de lire toutes les lignes
jusqu'à ce que la ligne 'OUTPUT<T>COMPLETE' soit atteinte en ignorant
ce qui est non identifiable.
INCLUDEFILE<T><NomFichier><T><NumeroLigne>
L'erreur décelé se situe dans un fichier d'inclusion. Les arguments
indiquent donc le nom de fichier et la ligne mise en cause dans le
fichier d'inclusion.
MESSAGE<T><Texte>
Le message d'avertissement actuel.
OUTPUT<T>COMPLETE
Indique la fin de la séquence d'avertissement.
Quand la compilation est effectuée, la réponse peut être :
SUCCESS
La compilation s'est passé correctement
ERROR<T>SYNTAX<T><Source NumeroLigne>
Une erreur a été détectée durant la compilation du code PB
L'argument <Source NumeroLigne> donne le numéro de ligne
où l'erreur s'est produite.
Ce qui suit est un ensemble d'informations optionnelles se
terminant toujours par le signal 'OUTPUT<T>COMPLETE'
A l'avenir, d'autres types de réponse pourront être ajoutées
donc... pour assurer... la compatibilité, il est... recommandé
de lire toutes les lignes jusqu'à ce que la ligne
'OUTPUT<T>COMPLETE' soit atteinte, en ignorant les lignes
qui ne sont pas identifiables.
INCLUDEFILE<T><NomFichier><T><NumeroLigne>
Une erreur s'est produite dans un fichier d'inclusion. Les
arguments donnent le nom de fichier et le numéro de
ligne dans lesquels s'est produite l'erreur.
MACRO<T><ErrorLine><T><TotalMacroLines>
Une erreur a eu lieu dans une macro. Ce qui suit cette ligne
est le contenu de la macro déployée. (<TotalMacroLines>
= nombre de lignes). Cela se termine par une ligne contenant
'MACRO<T>COMPLETE'
<ErrorLine> donne la ligne dans la macro a provoqué
une erreur.
MESSAGE<T><Texte>
Le message de l'erreur actuellement décelée.
OUTPUT<T>COMPLETE
Indique la fin de la séquence d'informations sur l'erreur de syntaxe.
Note : Si certain des numéros de ligne ne peuvent pas être
déterminés par le compilateur (par exemple pour les erreurs
qui ne peuvent pas être précisément localisées), le numéro de
ligne retourné sera -1. Donc, vous devez vous attendre à gérer
cetype de valeur.
ERROR<T>ASSEMBLER
ERROR<T>LINKER
ERROR<T>RESOURCE
Une erreur a été détectée durant l'assemblage, le linkage
ou la compilation des ressources de script. Les informations
qui suivent sont alors retournées par le compilateur sous la forme
d'une séquence se terminant par 'OUTPUT<T>COMPLETE'.
FUNCTIONLIST
Demande le listing des fonctions connues par le compilateur.
(Fonctions PB + Fonctions librairie utilisateur)
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de fonctions.
Il y succède une fonction par ligne avec le nom de la fonction et
une brève description (si spécifié durant la création de la librairie).
La séquence se termine par 'OUTPUT<T>COMPLETE'.
STRUCTURELIST
Demande le listing des structures connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de structures.
Il y succède un nom de structure par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.
INTERFACELIST
Demande le listing des interfaces connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre d'interfaces.
Il y succède un nom d'interface par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.
STRUCTURE<T><Nom>
Demande le contenu d'une structure connue par le compilateur.
Paramètre(s) : Le nom de la structure
Réponse(s) : La définition de la structure à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.
INTERFACE<T><Nom>
Demande le contenu d'une interface connue par le compilateur.
Paramètre(s) : Le nom de l'interface
Réponse(s) : La définition de l'interface à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.
HELPDIRECTORY<T><NomFonction>
Demande au compilateur le nom de la librairie d'une fonction
spécifiée.
Paramètre(s) : Le nom de la fonction
Réponse(s) : Soit 'API', soit 'UNKNOWN' soit le nom de
le librairie spécifiée
direct mis en post it et dans la rubrique des tutos
http://www.purebasic.fr/french/viewtopi ... 5087#65087
Merci pour le boulot
http://www.purebasic.fr/french/viewtopi ... 5087#65087
Merci pour le boulot

- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Manque plus qu'un petit code source pour tester.
Mais sinon trés bon tuto !
Mais sinon trés bon tuto !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
le code source est ici 
http://purebasic.developpez.com/faq/?pa ... ompilateur
Tu empiles les 4 codes sources à la suite et tu lances.

http://purebasic.developpez.com/faq/?pa ... ompilateur
Tu empiles les 4 codes sources à la suite et tu lances.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
>> Bravo pour le travail. Je n'avais même pas vu. Qu'est-ce que tu dois en baver à faire une telle page.comtois a écrit :le code source est ici
http://purebasic.developpez.com/faq/?pa ... ompilateur
Tu empiles les 4 codes sources à la suite et tu lances.
Voici un exemple succint qui affiche les fonctions dans un éditeur afin d'être copiées/collées...Progi1984 a écrit :Manque plus qu'un petit code source pour tester.
Mais sinon trés bon tuto !
Code : Tout sélectionner
EnableExplicit
#DispLib = 1
#DispFn = 2
#Gdt_A = 1
#Gdt_A1 = 2
#Gdt_A2 = 3
#Gdt_FnExplorer = #Gdt_A1
#Gdt_Editor = #Gdt_A2
#Spe_CR = Chr(13)
Structure ESInfo
DeskWidth.I
DeskHeight.I
DeskDepth.I
MainWinNo.I
MainWinWidth.I
MainWinHeight.I
WinEvt.I
EvtWin.I
EvtGdt.I
Evt.I
FnExplorerType.I
FnExplorerLib.S
EndStructure
Structure ProgInfo
Hnd.I
Name.S
Param.S
WorkDir.S
Flags.I
Exit.S
Request.S
Answer.S
CoreQty.I
SharedDuration.I
Tabulation.S
FnQty.I
FnSelect.I
LibQty.I
LibSelect.I
EndStructure
Structure LibInfo
Name.S
Guid.Q
EndStructure
Global Prog.ProgInfo
Global ES.ESInfo
Global Dim Fn.S(0)
Global Dim FnLib.Q(0)
Global Dim Lib.LibInfo(0)
Global Dim TempLib.LibInfo(0)
;-Autres
Procedure.S StringField2(String.S, Index.I, Separator.S)
Protected Result.S
Protected I.I
Protected Find.I
Protected No.I
Protected Length.I
Protected Start.I
Index - 1
Start = 1
If Index
For I = 1 To Index
Start = FindString(String, Separator, Start + 1)
Next
Start + Len(Separator)
EndIf
Find = FindString(String, Separator, Start + 1)
If Find = 0
Find = Len(String) + 1
EndIf
Length = Find - Start
Result = Mid(String, Start, Length)
ProcedureReturn Result
EndProcedure
;-COMPILER
Procedure.I LibExist(LibName.S)
Protected I.I
Protected Result.I
LibName = LCase(LibName)
For I = 0 To Prog\LibQty - 1
;Debug Lib(I)\Name + " = ? = " + LibName
If LCase(Lib(I)\Name) = LibName
Result = 1
Break
EndIf
Next I
ProcedureReturn Result
EndProcedure
Procedure.S AnswerField(Rank.I, NoUpdate.I = 0)
Protected Result.S
If NoUpdate = 0
Prog\Answer = ReadProgramString(Prog\Hnd)
EndIf
Result = StringField(Prog\Answer, Rank, Chr(9) )
ProcedureReturn Result
EndProcedure
Procedure Ask()
Protected I.I
Protected Field.S
Prog\Request = ReplaceString(Prog\Request, Prog\Tabulation, Chr(9) )
For I = 0 To CountString(Prog\Request, Chr(9) )
Field = StringField(Prog\Request, 1, Chr(9) )
If I = 0
Field = UCase(Field)
EndIf
Prog\Request = ReplaceString(Prog\Request, Field, Trim(Field), #PB_String_NoCase)
Next I
If ProgramRunning(Prog\Hnd)
WriteProgramStringN(Prog\Hnd, Prog\Request)
EndIf
EndProcedure
Procedure ExtractFunctions()
Protected I.I
Prog\Request = "functionlist"
Ask()
Prog\FnQty = Val(AnswerField(1) )
Global Dim Fn.S(Prog\FnQty - 1)
Global Dim FnLib.Q(Prog\FnQty - 1)
For I = 0 To Prog\FnQty - 1
Fn(I) = AnswerField(1)
Next I
AnswerField(2)
EndProcedure
Procedure SelectLib(LibName.S)
Protected I.I
LibName = LCase(LibName)
For I = 0 To Prog\LibQty - 1
If LCase(Lib(I)\Name) = LibName
Prog\LibSelect = I
Break
EndIf
Next I
EndProcedure
Procedure SelectFn(FnName.S)
Protected I.I
FnName = LCase(FnName)
For I = 0 To Prog\FnQty - 1
If LCase(StringField(Fn(I), 1, " ") ) = FnName
Prog\FnSelect = I
Break
EndIf
Next I
EndProcedure
Procedure PrepareLibs()
Protected I.I
Protected J.I
Protected Answer.S
For I = 0 To Prog\FnQty - 1
Prog\Request = "helpdirectory§§" + StringField(Fn(I), 1, " ")
Ask()
Answer = AnswerField(1)
If LibExist(Answer) = 0
Global Dim TempLib.LibInfo(Prog\LibQty)
For J = 0 To Prog\LibQty - 1
TempLib(J)\Name = Lib(J)\Name
TempLib(J)\Guid = Lib(J)\Guid
Next J
Global Dim Lib.LibInfo(Prog\LibQty)
For J = 0 To Prog\LibQty - 1
Lib(J)\Name = TempLib(J)\Name
Lib(J)\Guid = TempLib(J)\Guid
Next J
Global Dim TempLib.LibInfo(0)
Lib(Prog\LibQty)\Name = Answer
Lib(Prog\LibQty)\Guid = Val("$" + Left(MD5Fingerprint(@Lib(Prog\LibQty)\Name, Len(Lib(Prog\LibQty)\Name) ), 16) ) ; /!\ UTF-8 /!\
Prog\LibQty + 1
EndIf
SelectLib(Answer)
FnLib(I) = Lib(Prog\LibSelect)\Guid
Next I
SortStructuredArray(Lib(), #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(LibInfo\Name), #PB_Sort_String)
EndProcedure
Procedure Request()
Repeat
Delay(Prog\SharedDuration)
If ProgramRunning(Prog\Hnd)
Prog\Request = InputRequester("", "", "")
Ask()
Else
Break
EndIf
ForEver
EndProcedure
;-GUI
Procedure UpdateFnExplorer()
Protected I.I
Select ES\FnExplorerType
Case #DispLib
ClearGadgetItems(#Gdt_FnExplorer)
For I = 0 To Prog\LibQty - 1
AddGadgetItem(#Gdt_FnExplorer, I + 1, Lib(I)\Name, ImageID(0))
Next I
Case #DispFn
For I = 0 To Prog\LibQty - 1
If ES\FnExplorerLib = Lib(I)\Name
Prog\LibSelect = I
Break
EndIf
Next I
ClearGadgetItems(#Gdt_FnExplorer)
For I = 0 To Prog\FnQty - 1
If FnLib(I) = Lib(Prog\LibSelect)\Guid
AddGadgetItem(#Gdt_FnExplorer, I + 1, StringField(Fn(I), 1, " "), ImageID(0))
EndIf
Next I
EndSelect
EndProcedure
Procedure MainWindow()
Protected I.I
Protected Text.S
ExamineDesktops()
ES\DeskWidth = DesktopWidth(0)
ES\DeskHeight = DesktopHeight(0)
ES\DeskDepth = DesktopDepth(0)
ES\MainWinNo = OpenWindow(-1, 0, ES\DeskHeight >> 2, ES\DeskWidth, ES\DeskHeight >> 1, "PureUser", $CF0001)
SmartWindowRefresh(ES\MainWinNo, 1)
ES\MainWinWidth = WindowWidth(ES\MainWinNo)
ES\MainWinHeight = WindowHeight(ES\MainWinNo)
ListIconGadget(#Gdt_A1, 0, 0, ES\MainWinWidth, ES\MainWinHeight, "", 0, #PB_ListIcon_GridLines)
EditorGadget(#Gdt_A2, 0, 0, ES\MainWinWidth, ES\MainWinHeight)
SplitterGadget(#Gdt_A, 0, 0, ES\MainWinWidth, ES\MainWinHeight, #Gdt_A1, #Gdt_A2, #PB_Splitter_Vertical)
; LoadImage(0, "examples\sources\data\drive.bmp")
CreateImage(0, 32, 32)
StartDrawing(ImageOutput(0) )
Box(0, 0, 32, 32, 0)
Box(1, 1, 30, 30, #White)
StopDrawing()
SetGadgetAttribute(#Gdt_FnExplorer, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
ES\FnExplorerType = #DispLib
UpdateFnExplorer()
Repeat
Delay(1)
ES\WinEvt = WindowEvent()
If ES\WinEvt
ES\EvtWin = EventWindow()
ES\Evt = EventType()
If ES\EvtWin = ES\MainWinNo
Select ES\WinEvt
Case 16
Break
Case #PB_Event_SizeWindow
ES\MainWinWidth = WindowWidth(ES\MainWinNo)
ES\MainWinHeight = WindowHeight(ES\MainWinNo)
ResizeGadget(#Gdt_A, 0, 0, ES\MainWinWidth, ES\MainWinHeight)
UpdateFnExplorer()
Case #PB_Event_Gadget
ES\EvtGdt = EventGadget()
If ES\EvtGdt = #Gdt_A
UpdateFnExplorer()
EndIf
If ES\EvtGdt = #Gdt_FnExplorer
If ES\Evt = #PB_EventType_LeftClick
If ES\FnExplorerType = #DispLib
ES\FnExplorerType = #DispFn
ES\FnExplorerLib = GetGadgetItemText(#Gdt_FnExplorer, GetGadgetState(#Gdt_FnExplorer) )
UpdateFnExplorer()
Else
SelectFn(GetGadgetItemText(#Gdt_FnExplorer, GetGadgetState(#Gdt_FnExplorer) ) )
Text = StringField2(Fn(Prog\FnSelect), 1, " - ") + #Spe_CR
Text + StringField2(Fn(Prog\FnSelect), 2, " - ") + #Spe_CR
Text + #Spe_CR + GetGadgetText(#Gdt_Editor)
SetGadgetText(#Gdt_Editor, Text)
ES\FnExplorerType = #DispLib
UpdateFnExplorer()
EndIf
EndIf
EndIf
EndSelect
EndIf
EndIf
ForEver
CloseWindow(ES\MainWinNo)
EndProcedure
Prog\CoreQty = 1 ; Nombre de coeur(s) CPU
Prog\SharedDuration = Prog\CoreQty << 4 + 2
Prog\Tabulation = "§§"
Prog\Name = "PbCompiler.EXE"
Prog\Param = "/STANDBY"
Prog\WorkDir = #PB_Compiler_Home + "\Compilers"
Prog\Flags = #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Hide
Prog\Hnd = RunProgram(Prog\Name, Prog\Param, Prog\WorkDir, Prog\Flags)
If Prog\Hnd
MessageRequester(AnswerField(3), "Démarrage du compilateur")
If AnswerField(1) = "READY"
ExtractFunctions()
PrepareLibs()
Prog\Request = "end"
Ask()
EndIf
EndIf
SelectFn("createimage")
SelectLib("image")
MainWindow()
Delay(Prog\SharedDuration)
End
Re: [TUTO] Le compilateur en mode « Standby »
Bonjour à vous,
n'ayant que très peu de temps, je me permets de soumettre cette demande ouverte.
Fred a ajouté 'IMPORTLIST'. Est-il possible qu'une (ou plusieurs) âme charitable teste cet ajout, afin de compléter ce tutoriel?
Je rappelle, à moins que je me plante, que ce mode est un gage hors du commun de fiabilité dans le temps.
Il permet de faire évoluer le langage, tester la faisabilité de suggestions de nouvelles syntaxes, convertir à 100% toutes les autres syntaxes possibles et inimaginables connues (C, Pascal, Fortran, Python, etc... Si quelqu'un veut s'amuser avec la liste des langages du site Rosetta Code, il le peut), l'orienté objet y compris (d'où la nullité de tout débat à ce sujet).
Bon temps à vous.
n'ayant que très peu de temps, je me permets de soumettre cette demande ouverte.
Fred a ajouté 'IMPORTLIST'. Est-il possible qu'une (ou plusieurs) âme charitable teste cet ajout, afin de compléter ce tutoriel?
Je rappelle, à moins que je me plante, que ce mode est un gage hors du commun de fiabilité dans le temps.
Il permet de faire évoluer le langage, tester la faisabilité de suggestions de nouvelles syntaxes, convertir à 100% toutes les autres syntaxes possibles et inimaginables connues (C, Pascal, Fortran, Python, etc... Si quelqu'un veut s'amuser avec la liste des langages du site Rosetta Code, il le peut), l'orienté objet y compris (d'où la nullité de tout débat à ce sujet).
Bon temps à vous.