#!/usr/bin/perl

$fichiercompteur='count.txt';
@referers=('.unice.fr');
$taille_mini=3;


###########################################################################
# Ce compteur ne nécessite pas de SSI (fichiers shtml), c'est son atout ! #
# Dans votre page html, insérez <IMG SRC="/cgi-bin/compteur3.pl>, et le   #
# nombre de visites apparait. Le nombre de visites est par défaut stocké  #
# dans count.txt. Si vous voulez un compteur différent pour plusieurs     #
# pages, précisez dans l'URL le nom du fichier contenant le nombre de     #
# visites à prendre en compte, et créez-le sur le serveur avec chmod 777. #
# Par exemple : <IMG SRC="/cgi-bin/compteur3.pl?compteur-page1.txt>       #
# ou :          <IMG SRC="/cgi-bin/compteur3.pl?compteur-page2.txt>  etc. #
# Créez le fichier compteur-page1.txt avec 0 sur l'unique ligne, chmod 777#
# N'oubliez pas de mettre chmod 755 sur compteur3.pl et compteur3-setup.pl#
# et chmod 777 sur compteur3.cfg                                          #
###########################################################################

if (length($ENV{'QUERY_STRING'}) > 1) {
  $fichiercompteur=$ENV{'QUERY_STRING'} ;
}
## Vérifie que l'appel vient bien de votre site ##
&verifie_referer;
## INITIALISATION ##
&init;
## Augment"e le compteur de 1 ##
&incremente_compteur;
## Construction de l'image à renvoyer, format xbm ##
&creation_bitmap;
## Envoi de l'image ##
&renvoi_bitmap;
1;

#######################################################
sub renvoi_bitmap {
  print ("Content-type: image/x-xbitmap\n\n");  #x-xbitmap
  # déclaration taille du graphisme : hauteur :16 pixels, largeur : 8 foid nb de chiifres à afficher
  printf ("#define count_width %d\n#define count_height 16\n",$nbchiffres*8);
  printf ("static char count_bits[] = {\n");   #ecriture du début du tableau contenant les valeurs des pixels
  for($i = 0; $i < ($#bytes + 1); $i++) {      # de i=0 à nb de pixels
    print("0x$bytes[$i]");                     # ecriture du pixel en hexadécimal
    if ($i != $#bytes) {                       # si on est pas au dernier pixel
      print(",");                              # on met une virgule
      if (($i+1) % 7 == 0) {                   # et si on est en fin de ligne du graphisme
        print("\n");                           # on passe à la ligne suivante du tableau contenant la valeur des pixels
      }
    }
  }
  print("};\n");                               # ecriture fin du tableau contenant les valeurs des pixels
}                                              # et voilà, l'image est créée... fini.
#######################################################
sub creation_bitmap {
   @bytes = ();                          # tableau global non local contenant les pixels

  if (length($nbvisites)>$taille_mini) { #si nb de chiffres du nombre de visites > nb mini de chiffres à afficher
    $nbchiffres=length($nbvisites);      #alors nb de chiffre à afficher = nb de chiffre du nombre de visiteurs
  }else{                                 # sinon...
    $nbchiffres=$taille_mini;            # nb de chiffres à afficher = nb mini de chiffres à afficher
  }
  $formattedcount = sprintf("%0${nbchiffres}d",$nbvisites);
  for ($i = 0; $i < $nbchiffres*3; $i++ ) {  # trois lignes noires en haut du graphisme
      push(@bytes,"ff");
  }
  for ($y=0; $y < 10; $y++) {                # on prend les lignes du graphisme une par une
    for ($x=0; $x < $nbchiffres; $x++) {     # dans chaque ligne, pour chaque chiffre...
      $digit = substr($formattedcount,$x,1);
      $byte = substr(@invdigits[$digit],$y*3,2);
      push(@bytes,$byte);
    }
  }
  for ($i = 0; $i < $nbchiffres*3; $i++ ) {   # trois lignes noires en bas du graphisme
      push(@bytes,"ff");
  }
}
#######################################################
sub incremente_compteur {
  if (-e $fichiercompteur) {                  # si le fichier compteur existe
    open(COMPTEUR,"$fichiercompteur") || die("Impossible d\'ouvrir $fichiercompteur : $!\n");
    $nbvisites = <COMPTEUR>;
    chop $nbvisites;     # enlève le retour à la ligne en fin de ligne
    close(COMPTEUR);     # ferme le fichier
  } else {               # le fichier n'existe pas encore
    $nbvisites = 0;
  }

  $nbvisites++;        # incrémente le nombre de visites
  open(COMPTEUR,">$fichiercompteur") || die ("impossible d\'ouvrir $fichiercompteur: $!\n");
  print (COMPTEUR "$nbvisites     \n"); # ecrit le nouveau nb de visites ou créé le fichier s'il n'existait pas
  close(COMPTEUR);     # ferme le fichier
}
#######################################################
sub init {
  #  Pour chaque chiffre, 8 pixels de large, 10 de haut
  #  @invdigits blanc sur noir.
  #  @digits noir sur blanc.
   @invdigits = ("c3 99 99 99 99 99 99 99 99 c3",  # 0
                 "cf c7 cf cf cf cf cf cf cf c7",  # 1
                 "c3 99 9f 9f cf e7 f3 f9 f9 81",  # 2
                 "c3 99 9f 9f c7 9f 9f 9f 99 c3",  # 3
                 "cf cf c7 c7 cb cb cd 81 cf 87",  # 4
                 "81 f9 f9 f9 c1 9f 9f 9f 99 c3",  # 5
                 "c7 f3 f9 f9 c1 99 99 99 99 c3",  # 6
                 "81 99 9f 9f cf cf e7 e7 f3 f3",  # 7
                 "c3 99 99 99 c3 99 99 99 99 c3",  # 8
                 "c3 99 99 99 99 83 9f 9f cf e3"); # 9
   
      @digits = ("3c 66 66 66 66 66 66 66 66 3c",  # 0
                 "30 38 30 30 30 30 30 30 30 30",  # 1
                 "3c 66 60 60 30 18 0c 06 06 7e",  # 2
                 "3c 66 60 60 38 60 60 60 66 3c",  # 3
                 "30 30 38 38 34 34 32 7e 30 78",  # 4
                 "7e 06 06 06 3e 60 60 60 66 3c",  # 5
                 "38 0c 06 06 3e 66 66 66 66 3c",  # 6
                 "7e 66 60 60 30 30 18 18 0c 0c",  # 7
                 "3c 66 66 66 3c 66 66 66 66 3c",  # 8
                 "3c 66 66 66 66 7c 60 60 30 1c"); # 9
}
###############################################
sub verifie_referer {
  if (@referers && $ENV{'HTTP_REFERER'}) {
    foreach $referer (@referers) {
      if ($ENV{'HTTP_REFERER'} =~ /$referer/) {
        $ref = 1;
        last;
      }
    }
  }
  else {
    $ref = 1;
  }
  if ($ref != 1) {die('bad referer');}
}
###############################################
