/*
 Exercice de programmation parallele
 Recherche du nombre d'occurences d'un caractere dans un texte
 On passe en parametres le nom du fichier ("fichier.txt"), le caractere a rechercher, le nombre de processus a lancer
*/

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>


#define	TBloc		256
#define	NMaxefils	3

// appel : ./rech-car fichier_a_etudier ("fichier.txt")  caractere_a_chercher  nb_processus_Alancer
int main (int nbarg, char *tbarg[])
{
	int NBFils;
	int idpro, df , cpt ,cptcar=0, np[NMaxefils], NbOccu=0;
	int etat;
	char Bloc[TBloc];


	if (nbarg < 4) {
		printf("utilisation %s fichier caractere nb_fils\n",tbarg[0]);
		exit(-1);
	}
	
	sscanf(tbarg[3],"%d",&NBFils);
	if (NBFils > NMaxefils ) {
		printf("nb fils trop eleve %d\n",NBFils );
		exit(-1);
	}
	
	if ((df=open(tbarg[1], O_RDONLY))< 0 ){
		perror ("erreur d'ouverture du fichier en parametre");
		exit(errno);
	}
	
	for (cpt=1; cpt <= NBFils ; cpt++)
	{
		if ((idpro=fork ()) < 0){
			perror("creation de processus");
			exit(errno);
		}

		if (idpro == 0){ 
			int nbo; // nombre d'octets lus dans le fichier
			int ordre;
			ordre=cpt;
			cpt=NBFils ; // arret de la boucle pour le nouveau processus-fils
		
			while ((nbo=read(df, Bloc, TBloc)) > 0){ 
				int index, IMax;
				IMax = nbo;
				for (index=0; index < IMax  ; index++ )
					if ( Bloc[index] == *tbarg[2] ) cptcar++ ;
				{long cal; for(cal=0;cal<5000000;cal++);}
		
			}
		 
			printf(" fils %d cptcar %d \n",ordre , cptcar );
			exit (cptcar);
		} // fin des fils
	}

     
	// le pere attend la fin des fils
    for (cpt=0; cpt < NBFils ; cpt++){
		np[cpt]= wait(&etat);
		NbOccu= NbOccu + (etat>>8);
        printf(" le processus %d trouve %d %c \n",np[cpt],etat >> 8,*tbarg[2]);
	}
    printf(" le fichier %s contient %d %c \n",tbarg[1],NbOccu,*tbarg[2]);
    exit(0);
}

