#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h>
#include <errno.h>
#include <time.h>

FILE * abrirFich(char* nombreFich){
	FILE *fich;
    if((fich=fopen(nombreFich, "r"))==NULL){
		printf("Error opening the file. Errno value= %d", errno);
	}

	return fich;
}

void *contarLineas(void *arg){
	char * nameFile = (char *) arg;
	
	FILE *f=abrirFich(nameFile);
	char aux[1000];
	long * i = malloc(sizeof(long));
	*i = 0;

	while(fgets(aux, 1000, f)){
		*i = *i+1;
	}
	
	printf("    |HEBRA HIJA| : En el fichero ''%s'', hay %ld lineas \n", nameFile, *i);

	fclose(f);
	pthread_exit((void*) i);
}

int main(int argc, char **argv){
	if (argc < 2) {
        fprintf(stderr, "Uso: %s <fichero1> <fichero2> ...\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pthread_t threads[argc-1];
    int error, valor_join;
    long valor=0;
    long *ret;

    for(int t=0;t<argc-1;t++) 
	{
		
		printf("|HEBRA PADRE| : Creando hebra %d...\n", t);
		error = pthread_create(&threads[t], NULL, (void *) contarLineas, (void *) argv[t+1]);

       	if (error) 
		{
		    perror("Error joining thread\n");
            printf("errno value= %d\n", errno); 
            exit(EXIT_FAILURE);
		}
	}

    for(int i=0;i<argc-1;i++) 
	{
	    valor_join = pthread_join(threads[i], (void**)&ret);

	    if(valor_join!=0)
	    {
	      perror("Fallo en pthread_join()...\n");		
	      exit(EXIT_FAILURE);
	    }

        valor+=*ret;
	}
    
    printf("|HEBRA PADRE| : Suma total de lineas=%ld...\n", valor);

}
