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