/*
 * info-528,
 * entêtes pour le tp1
 */

#ifndef _TP1_H
#define _TP1_H

/* bibliothèques qui peuvent servir... */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

#include <stdint.h>  /* types d'entier avec garantie sur le nombre de bits */
#include <getopt.h>  /* gestion des arguments optionels de la ligne de commandes */
#include <time.h>    /* pour initialiser la graine pour générer des nombres aléatoires */

/*
 * le type des mots
 */
typedef uint32_t mot;


/*
 * affiche les 'n' bits de poids faible d'un mot
 */
void print_bin(mot m,int n) ;


/*
 * renvoie le nombre de '1' dans un mot
 */
int poids(mot m) ;


/*
 * renvoie le décalage circulaire (à droite) des n bit de poids faible d'un mot
 */
unsigned decalage_circulaire(mot m, int n) ;


/*
 * code une suite de 12 bits (bits de poids faible d'un mot) en ajoutant la
 * redondance donnée par la matrice A
 * Le résultat (23 bits ou 24 bits pour la version étendue) est stocké dans
 * les 23 bits de poid faible du mot renvoyé.
 */
mot code_golay(mot entree) ;

/*
 * même chose, mais avec un bit de parité en plus
 */
mot code_golay_etendu(mot entree) ;


/*
 * ajoute un bit de parité (en bit de poids faible)
 */
mot bit_parite(mot entree) ;


/*
 * syndrome d'un mot du code de Golay (sans bit de parité)
 */
mot syndrome_golay(mot m) ;


/*
 * correction d'erreur pour le code de Golay en utilisant la méthode "error
 * trapping" + cyclicité
 */
mot correction_golay(mot m) ;


/*
 * décode un mot du code de golay un supprimant les bits de redondance
 */
mot decode_golay(mot m) ;


/*
 * fonction de test exécutée avec l'argument "-T" depuis la ligne de commande
 */
void test_cmd(void) ;


/*
 * ajoute des erreurs sur un mot
 * chaque bit à une probabilité p d'être modifié
 */
mot bruite_mot(mot m, double p) ;

#endif  /* _TP1_H */