Estrarre Indirizzi e-mail da un file di testo

Autore: Santo Patti

… mettiamo che il tuo capo ha gli indirizzi e-mail dei suoi clienti sparsi per vari file sul pc, e ti chiede di raccoglierli in un elenco da usare per il suo bel programmino per le mailing list, che fai? (succede succede e certo non gli puoi dire: “ti farò sapere….”)

Scrivi un bel programmino in c che da un file di testo dove hai incollato di tutto ti produce un altro file di testo ordinato con un indirizzo e-mail per riga :). L'ho scritto stamattina al lavoro, in poco tempo, certo sarebbe da farsi con un bel parser… o studiandosi prima un automa a stati finiti ma funziona per quasi tutti gli indirizzi e-mail.

#include <stdio.h>
#include <unistd.h>
 
char nuovo[256];
 
int isSimbol(char x);
int isDigit(char x);
int isSpecialSimbol(char x);
 
void estendi(char *p);
 
int main(int args, char *argv[])
{
	FILE *file;
	FILE *outfile;
	char c,z;
	if (args!=2)
	{
		printf("Manca il file sorgente\n");
		return 0;
	}
	file=fopen(argv[1],"r");
	estendi(argv[1]);
	if (!file)
	{
		printf("Non e' stato possibile aprire il file\n");
		return 0;
	}
	printf("%s\n",&nuovo[0]);
	outfile=fopen(&nuovo[0],"w");
	if (!outfile)
	{
		printf("Non e' stato creato il file di output\n");
		return 0;
	}
	int contaeln=0;
	while (1)
	{
		c=(char) getc(file);
		if (c == EOF) break;
		if ((isDigit(c)) || (isSimbol(c)) || (isSpecialSimbol(c)) || ( c == '@'))
		{
			putc(c, outfile);
			contaeln=1;
		}
		else if (contaeln == 1) { putc('\n', outfile); contaeln=0; }
	}
	putc(EOF, outfile);
	fclose(file);
	fclose(outfile);
	return 0;	
}
 
int isSimbol(char x)
{
	int cdec=(int)x;
	if ( ((cdec <91) && (cdec > 64)) || (( cdec<123) && (cdec >96)) ) return 1;
	return 0;
}
int isDigit(char x){
	int cdec=(int)x;
	if ( (  cdec < 58) && ( cdec > 47 ) ) return 1;
	return 0;
}
int isSpecialSimbol(char x)
{
	int cdec=(int)x;
	if ((cdec == 95) || (cdec == 45) || (cdec == 46)) return 1;
	return 0;
}
 
void estendi(char *p)
{
	int cnt,i;
	for (cnt=0; cnt<256; cnt++)
		nuovo[cnt]=0;
	cnt=0;
	while (p[cnt++]!=0);
	for(i=0; i < cnt; i++)
		nuovo[i]=p[i];
	nuovo[cnt-1]='.';
	nuovo[cnt]='o';
}