#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <ctype.h>

// Comando linux per contare il numero di caratteri in un file di testo grep -o ';' nome_file | wc -l
struct statCar{
    int nCaratteri;
    int nVocali;
    int nConsonanti;
    int nSpazi;
    int nParagrafi;
    int nPunteggiatura;
};

int main(){
	FILE *fp;
	pid_t pid, ppid;
	int num,status,numscritti=0;
	if((fp=fopen("dati.dat","w+"))==NULL){
		printf("Errore apertura file");
		return 1;
	}
	printf("Pid del programma/processo padre %d\n",getpid());
	pid=fork();
	if(pid<0)	{
		printf("Errore sulla generazione del processo figlio");
		return 1;
	}
	if(pid==0){
		FILE *fpR;
		struct statCar stats={0,0,0,0,0,0};
		char Suffisso,letto;
		if((fpR=fopen("testoDaAnalizzare.txt","r"))==NULL){
			exit(1);
		}
		while(!feof(fpR)){
			letto=fgetc(fpR);
			letto=tolower(letto);
			if((letto>96 && letto<123) || (letto>47 && letto<58) || 
               (letto==',' || letto=='.' || letto==' ' || letto=='!' || letto=='?' || letto=='\n'))
               stats.nCaratteri++;
				switch(letto){
					case '.':
                    case ',':
                    case '!':
                    case '?':stats.nPunteggiatura++;break;
					case '\n':stats.nParagrafi++;break;
					case ' ':stats.nSpazi++;break;
					case 'a':
					case 'e':
					case 'i':
					case 'o':
					case 'u':stats.nVocali++;break;
					default :stats.nConsonanti++;break;
				}
		}
        if(stats.nCaratteri > 0 && letto != '\n')
            stats.nParagrafi++; // Count last paragraph if file doesn't end with newline
		char appo[50];
        sprintf(appo, "H%dV%dC%dS%dR%dP%d", stats.nCaratteri, stats.nVocali, stats.nConsonanti, stats.nSpazi, stats.nParagrafi, stats.nPunteggiatura);
		fwrite(appo, sizeof(char),strlen(appo), fp );
		exit(0);
	}else{
		ppid=wait(&status);
		if(!WIFEXITED(status)){
			printf("Il figlio ha fallito l'esecuzione\n");
			return 1;
		}
		rewind(fp);
		char bufRead[50],bufNum[10];
        int ris[6],iNum=0,i,j=0;
        fread(bufRead, sizeof(char), 50, fp);

		puts(bufRead);
		for(i=1;i<=strlen(bufRead);i++){
			if(bufRead[i]>=48 && bufRead[i]<=57){
				bufNum[iNum]=bufRead[i];
				iNum++;
			}else{
				bufNum[iNum]='\0';
				ris[j]=atoi(bufNum);
				j++;
				iNum=0;
				bufNum[0]='\0';
			}
		}
		for(i=0;i<6;i++)
			printf("ris[%d]=%d\n",i,ris[i]);
        printf("Caratteri: %d\nVocali: %d\nConsonanti: %d\nSpazi: %d\nParagrafi: %d\nPunteggiatura: %d\n", ris[0], ris[1], ris[2], ris[3], ris[4],ris[5]);
	}
	fclose(fp);
}