/* test_tGFSR32x4.c
   créé par Yann GUIDON (whygee@f-cpu.org) le 25 août 2007

   Ce fichier teste l'algorithme de signature tGFSR32x4,
   à compiler de préférence avec
     gcc -Os -fomit-frame-pointer -momit-leaf-frame-pointer \
            -march=pentium3 -W -Wall -o test test_tGFSR32x4.c
*/

#include <stdio.h>

#define DEBUG

#include "tGFSR32x4.c"
#include "lfsr4.c"

#define MAXLENGTH 42

/*  U8 désaligne les blocs, donc U32 */
U32 p[(MAXLENGTH/4)+2], q[(MAXLENGTH/4)+2],
    r[(MAXLENGTH/4)+2], s[(MAXLENGTH/4)+2];

#define P ((U8*)(PTR_CAST p))
#define Q ((U8*)(PTR_CAST q))
#define R ((U8*)(PTR_CAST r))
#define S ((U8*)(PTR_CAST s))

int main() {
  int a=0, i;

  /* fabrique une chaine pseudo-aléatoire */
  for (i=0; i<MAXLENGTH; i++)
    P[i] = Q[i+1] = R[i+2] = S[i+3] =
               (lfsr4() << 4) | lfsr4();

  /* vérifie le fonctionnement */
  for (i=0; i<MAXLENGTH; i++) {
    printf(" --- size=%d :\n",i);
    a ^= tGFSR32x4_signature(P  , i);
    a ^= tGFSR32x4_signature(Q+1, i);
    a ^= tGFSR32x4_signature(R+2, i);
    a ^= tGFSR32x4_signature(S+3, i);
  }

  return a; /* a sert juste à éviter la sur-optimisation criminelle de GCC dans certains cas */
}
