source C de test-cgi.c
Patrick TRAU
vous trouverez ci-dessous le code source (en C) du programme
test-cgi.c qui est appelé automatiquement par le formulaire
tst-form.htm
#include <stdio.h>
/* les 3 bibliothèques ci-dessous sont récupérées sous "http://www.boutell.com" */
/* que Mr Boutell en soit chaleureusement remercié */
#include "cgic.h" /* pour faire du cgi en C */
#include "gd.h" /* pour créer un GIF en C */
#include "gdfontl.h" /* pour écrire en "large" */
typedef char txt[80];
void bas_de_page(void) /*affiche la fin de la page, similaire dans les 2 cas */
{
fprintf(cgiOut,"Du moins je pense les connaitre, si les champs sont vides c'est que vous m'avez bien eu. Dans ce cas veuillez m'<A Href=\"mailto:Patrick.Trau%cipst-ulp.u-strasbg.fr\">envoyer un mail</A><P>\n",'@');
fprintf(cgiOut,"Si cette page ne contient pas vos dernières données, c'est que vous avez repris celle sur votre cache, choisissez le bouton 'reload' de votre naviigateur<HR>\n");
}
void CreeSansGif(txt nom,int *nb) /* nb=tableau de 3 entiers */
{
int somme;
fprintf(cgiOut,"<HTML>\n");
fprintf(cgiOut,"<HEAD><TITLE>R&eacutat;sultat du calcul (sans image)</TITLE></HEAD>\n");
fprintf(cgiOut,"<BODY bgcolor=#bb8800>\n");
fprintf(cgiOut,"<H1><center>Bonjour %s</center></H1>Cette page résulte d'un calcul (simple il est vrai mais c'est pour tester les possibilités) \n",nom);
somme=nb[0]+nb[1]+nb[2];
fprintf(cgiOut,"<HR>la somme des nombres que vous avez entrés vaut <B>%d</B>, sa moyenne <B>%2.2f</B>\n<P>\n",somme, somme/3.0);
fprintf(cgiOut,"<HR>D'ailleurs, je sais que vous travaillez sur <B>%s</B> (IP %s).<br>\n",
cgiRemoteHost,cgiRemoteAddr/*,cgiRemoteUser ne rend rien!!!*/);
bas_de_page();
fprintf(cgiOut,"</BODY></HTML>\n");
}
#define y(i) (215-(((i)*180)/max)) /* mise à l'échelle, les Y étaient de haut en bas */
void CreeImage(int *nb)
{
int pas,max,i;
/* Declare l'image */
gdImagePtr im;
/* Declare an output file */
FILE *out;
/* Declare color indexes */
char texte[40];
int c_fond;
int c_text;
int c_barr;
/* recherche du plus grand des 3 */
for(i=1,max=nb[0];i<3;i++)if(nb[i]>max)max=nb[i];
if(max<10) {pas=1;max=10;}
else if(max<100) {pas=10;max=100;}
else {pas=100;}
/* Allocate the image: 320 pixels across by 220 pixels tall */
im = gdImageCreate(320,220);
/* Allocate the color black (red, green and blue all minimum).
Since this is the first color in a new image, it will
be the background color. */
c_fond = gdImageColorAllocate(im, 0, 0, 0);
/* Allocate the color white (red, green and blue all maximum). */
c_text = gdImageColorAllocate(im, 255, 255, 255);
/* barres presque rouges */
c_barr = gdImageColorAllocate(im, 255, 25, 25);
/* dessin d'un cadre. j'utilise gdImageSX qui me donne la taille en X de l'image (ici 320), idem en Y */
gdImageRectangle(im, 2, 2, gdImageSX(im)-3, gdImageSY(im)-3, c_barr);
/* tracé des axes */
gdImageLine(im,10,5,10,205,c_text); /*vertical*/
for(i=0;i<=max;i+=pas)gdImageLine(im,10,y(i),310,y(i),c_text);
gdImageFilledRectangle(im,20, y(nb[0]), 90, y(0), c_barr); /* les x et y DOIVENT être croissants */
gdImageFilledRectangle(im,120, y(nb[1]), 190, y(0), c_barr);
gdImageFilledRectangle(im,220, y(nb[2]), 290, y(0), c_barr);
sprintf(texte,"vos nb (une horizontale=%d)",pas);
gdImageString(im, gdFontLarge,
gdImageSX(im) / 2 - (strlen(texte) * gdFontLarge->w / 2), /* débuter au milieu de l'image moins la taille de la moitié des caractères à afficher */
10,
texte, c_text); /* écrire le texte EN HAUT AU MILIEU !!!! */
/* ouvrir le fic résultat. Si le répertoire n'est pas en accès écriture le fichier doit déjà exister avec accès écriture */
out = fopen("/export/logiciels/apache_1.1.1/htdocs/tmp/resultat-test-cgi.gif", "w+");
/* Output the image to the disk file. */
gdImageGif(im, out);
/* Close the file. */
fclose(out);
/* Destroy the image in memory. */
gdImageDestroy(im);
}
void CreeAvecGif(txt nom,int *nb)
{
CreeImage(nb);
fprintf(cgiOut,"<HTML>\n");
fprintf(cgiOut,"<HEAD><TITLE>R&eacutat;sulte du calcul (avec image)</TITLE></HEAD>\n");
fprintf(cgiOut,"<BODY bgcolor=#d0d0a0>\n");
fprintf(cgiOut,"<H1><center>Bonjour %s</center></H1>Cette page résulte d'un calcul\n",nom);
fprintf(cgiOut,"<HR><img src=\"//www-ipst.u-strasbg.fr/tmp/resultat-test-cgi.gif\" align=\"center\">");
fprintf(cgiOut,"<HR>D'ailleurs, je sais que vous travaillez sur <B>%s</B> (IP %s).<p>\n",
cgiRemoteHost,cgiRemoteAddr/*,cgiRemoteUser ne rend rien!!!*/);
bas_de_page();
fprintf(cgiOut,"</BODY></HTML>\n");
}
typedef char *pchar;
int cgiMain()
/* le main pour Cgic, le "vrai" main étant dans cgic.h */
{
txt nom;
int nb[3];
pchar ilpeutdire[2]; /* les réponses possibles pour les boutons radio */
char non[4]="non";
char oui[4]="oui";
/* txt ilpeutdire[2]={"non","oui"}; ceci ne marche pas sous gcc*/
int avecgif;
ilpeutdire[0]=non; ilpeutdire[1]=oui;
/* Important: we must indicate the type of document */
cgiHeaderContentType("text/html");
/* récupérer la valeur de la variable "nom" envoyée par le demandeur et les 3 nb*/
cgiFormStringNoNewlines("nom",nom,sizeof(txt));
cgiFormInteger("nb1",nb,0); /* en dernier val par déf, inutile car mon javascript le teste*/
cgiFormInteger("nb2",nb+1,0);
cgiFormInteger("nb3",nb+2,0);
/* tester les boutons radio */
cgiFormRadio("avecgif",ilpeutdire,2,&avecgif,0);
if(avecgif) CreeAvecGif(nom,nb); else CreeSansGif(nom,nb);
}
page écrite parP. Trau le 6/2/97