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&egrave;res donn&eacute;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&eacute;sulte d'un calcul (simple il est vrai mais c'est pour tester les possibilit&eacute;s) \n",nom);
 somme=nb[0]+nb[1]+nb[2];
 fprintf(cgiOut,"<HR>la somme des nombres que vous avez entr&eacute;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&eacute;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