Première reéussite dans l'utilisation d'une
variable d'environnement d'Apache. (remise en forme d'un message
électronique).
- les deux petits scripts suivants s'exécutent sur un
serveur web (avec Apache).
- sur le navigateur d'un client, s'affiche un formulaire classique
(saisie d'infos personnelles, réponse dans un forum...).
Quand le client le décide, il clique "envoyer" sur le bouton
qui va bien.
- le script Bash s'exécute, sur le serveur, en
réaction au clic du bouton sur le client. Il s'agit d'une
sorte de "cache-misère" qui me permet de contourner le fait
que je ne sais pas lancer directement un script en Forth.
Il affiche "Vous avez cliqué sur le bouton Valider" sur le
navigateur du client (fonction de vérification) et lance le
script en Gforth par
./cuicui2.fs
- le script Gforth se sert de la variable d'environnement d'Apache
appelée
QUERY_STRING
pour récupérer l'adresse et la longueur de la
chaine de caractères qui contient le résultat de
la saisie (celle-ci est concaténée en un seul
flot de caractères).
En détail, cela donne :
256 Constant max-line (
définition d'une constante annexe )
Create boite max-line allot ( création d'un tableau de 256
caractères )
variable lg 0 ( variable de type integer pour définir la
longueur utilisée de la chaine )
En Pascal, on écrirait
boite :="QUERY_STRING";
Ici, on a créé un "mot forth" annexe qui charge
la chaine et récupère sa longueur : "affecte".
Création du mot :
: affecte ( adr1 u adr2 -- ) swap dup lg ! cmove ;
Affectation :
s" QUERY_STRING" boite affecte
On s'assure que la variable "boite"
contient bien QUERY_STRING
Pour cela, on appelle :
- la variable boite, ce qui a pour conséquence de mettre
l'adresse de la variable sur la pile
- la variable lg dont on empile le contenu par "lg @"
- le mot type qui affiche les lg caractères contenus
à l'adresse débutant à l'adresse
"boite"
boite lg @ type
Elle se fait à l'aide du simple
mot "getenv"
En Forth tout passe par la pile, et donc il est nécessaire
de représenter de façon symbolique les effets sur
la pile.
On utilise la représentation suivante :
( pile_avant -- pile_après )
Pour le mot "getenv" et pour notre exemple, on a
( adresse_de_QUERY_STRING longueur_de_QUERY_STRING --
adresse_contenu_saisie longueur_contenu_saisie )
Ceux qui ont lu jusqu'ici avec attention comprendront donc :
boite lg @ getenv
De l'état de la pile :
.s
liste les valeurs contenues, sans les détruire. Important
pour la mise au point, parce qu'en cas d'échec, la valeur
est zéro.
type
affiche ce que l'on a récupéré,
à partir du contenu de la pile : adresse_contenu_saisie
longueur_contenu_saisie
Voilou :-)
Je suis arrivé au point où :
- je peux récupérer sur le serveur des saisies en
ligne via des formulaires HTML et les enregistrer dans des fichiers
texte (pour le moment j'esquive le stockage dans MySQL)
- je peut générer à la
volée des pages web à partir de ces fichiers
texte.
Il est donc raisonnable d'envisager la réalisation d'un site
web dynamique en utilisant Forth comme langage de script.
Pour mémoire, ce langage peut fonctionner en mode
interprété (comme Perl, Basic ou PhP) mais aussi
en mode compilé (où il devrait aller
fabuleusement vite).
Ce qui devrait vous éclairer sur les raisons de ce travail.
#!/bin/sh
echo "Content-Type: text/plain"
echo
echo "Vous avez cliqué sur le bouton Valider"
echo
./cuicui2.fs
#! /usr/local/bin/gforth
256 Constant max-line
Create boite max-line allot
variable lg 0
: affecte ( adr1 u adr2 -- ) swap dup lg ! cmove ;
s" QUERY_STRING" boite affecte
boite lg @ type
boite lg @ getenv
.s
type
bye
Haut de page