\begin{verbatim}
#define max 100
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmpps( char* p, char* s, int k)
{ int i, j;
  i = 0;
  j = strlen( s ) - k ;
  while ( ( i < k ) && ( p[i] == s[j] ) ) { i++; j++;}
  return k == i;
}


int lplsp( char *s, char* p)
{ int k;
  k = strlen( s );
  if ( strlen(p) < k ) 
    k = strlen(p);
  while ( ( k > 0 ) && ! cmpps(p,s,k) ) k--;
  return k;
}

void transition(int t[max][256], char *m)
{ char ps[max];
  int a, q;
 
  for( q = 0; q <= strlen(m); q++) {
    for( a = 0; a < 256; a++){
      ps[ q ] = a; 
      ps[q+1] = '\0';
      t[q][a]   = lplsp( ps, m);
   }
   ps[q] = m[q];
  }  
}

int lettre( int car, char *m)
{
  while ( *m != '\0') {
    if( car == *m ) return 1;
    m++;
  }
  return 0;
}

void affiche(int t[max][256], char* m )
{ 
  int a, q; 
  printf("\n//   ");
  for( q = 0; q <= strlen(m); q++)
     printf("%3d", q);
  for( a = 0; a < 256; a++) 
     if ( lettre( a, m) ){
       printf("\n//%3c", a);
      for( q = 0; q <= strlen(m); q++)
	printf("%3d", t[q][a]);
     }  
}

void dot(int t[max][256], char* m )
{ 
  int a, q; 
  printf("\n digraph finite_state_machine {\n rankdir=Q;\nsize=\"8,5\"");
  printf("\n orientation=landscape;");

  for( a = 0; a < 256; a++) 
     if ( lettre( a, m) ){
       for( q = 0; q <= strlen(m); q++)
	printf("\nQ%d -> Q%d [ label =\"%c\" ] ", q, t[q][a], a);
     }  
  printf("\n}");
}

int  main( int argc, char * argv[])
{  FILE *src;
   int car, etat, fin, table[max][256];
   char *motif;
   int cpt = 0; 

   motif = argv[1];
   fin   = strlen( motif );

   if ( argc > 2 ) 
     src = fopen( argv[2], "r" );
   else
     src = stdin;
  
   transition( table, motif );
   affiche( table, motif);
   etat  = 0;

   while ( ! feof( src ) ) {
     car  = fgetc( src );
     etat = table[etat][car];
     if ( etat == fin ) cpt++;
   }
  
   printf("\n//Nombre d'occurences : %d\n//bye...\n", cpt);
 
   dot( table, motif);
   fclose( src );
   return 0;
}
\end{verbatim}
