/*
          stats_o1.c
  histogramme du premier ordre d'un fichier
  d'octets et calcul de l'entropie

  création : Mon Sep 15 05:23:51 CEST 2003
    par whygee@f-cpu.org
  version : Sat Jun 26 07:02:04 CEST 2004

  compilation :
    gcc -W -Wall -lm -o stats_o1 stats_o1.c
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

unsigned long int histo[256][256];

int main(int argc, char *argv[]) {
  FILE *file_in;
  FILE *file_out;
  unsigned long int i, j, k, max, min,
     last=0, taille=0;
  unsigned long long int lli;
  double h=0.0, entropie, proba;

  file_in=fopen(argv[1], "rb");
  if (file_in!=NULL) {
    file_out=fopen("histo1", "wb");
    if (file_out!=NULL) {
      /* creation de l'histogramme en 2D */
      while ((i=fgetc(file_in))!=EOF) {
        histo[last][i]++;
        last=i;
        taille++;
     }

     min=max=histo[0][0];
     for (i=0; i<256; i++)
       for (j=0; j<256; j++) {
         k=histo[i][j];
         /* recherche du maximum et du minimum */
         if (k>max)
           max=k;
         if (k<min)
           min=k;
         /* calcul de l'entropie */
         if (k>0) {
           proba=k;
           proba/=taille;
           entropie=proba*-log(proba)/M_LN2;
           h+=entropie;
         }
     }

     printf("max = %ld\n",max);
     printf("min = %ld\n",min);
     printf("entropie = %G\n",h);

     /* mise à l'echelle et écriture */
     for (i=0; i<256; i++)
       for (j=0; j<256; j++) {
         lli=histo[i][j];
         lli*=255;
         lli=lli/max;
         fputc(lli, file_out);
      }
    }
  }
  exit(EXIT_SUCCESS);
}
