Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

Preciso implementar um programa em C que leia o código fonte da página “Email address” do Wikipédia colocado em um arquivo “Entrada.txt” no diretório do programa em C, (fopen…, “r”), e imprima como resultado os e-mails válidos que estão no código, a partir de um automato finito deterministico, ou seja, com os estados em forma de função. Esse é código fonte: view-source:https://en.wikipedia.org/wiki/Email_address

Esse é o automato que usei:

Fiz o seguinte código:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 76959 //caracteres aceitos que são do tipo letra, num, ponto, traço, @


int SelecionaSimbolosValidos(char Simbolo);

void qInicial(char Simbolo[NMAX]);
void q0(int contador, char Simbolo[NMAX]);
void q1(int contador, char Simbolo[NMAX]);
void q2(int contador, char Simbolo[NMAX]);
void q3(int contador, char Simbolo[NMAX]);
void q4(int contador, char Simbolo[NMAX]);
void q5(int contador, char Simbolo[NMAX]);
void q6(int contador, char Simbolo[NMAX]);
void q7(int contador, char Simbolo[NMAX]);
void q8(int contador, char Simbolo[NMAX]);
void q9(int contador, char Simbolo[NMAX]);
void q10(int contador, char Simbolo[NMAX]);
void q11(int contador, char Simbolo[NMAX]);
void qErro(int Contador, char Simbolo[NMAX]);


int SelecionaSimbolosValidos(char Simbolo)

{
int aceita = 0, rejeita = 1;

if((Simbolo >= 'a' && Simbolo <= 'z') || (Simbolo >= 'A' && Simbolo <= 'Z')|| Simbolo == '@'
|| Simbolo == '-' ||Simbolo == '.' || ((Simbolo >= '0' && Simbolo <= '9')))
return aceita;

    else
        return rejeita;


}


void qInicial(char Simbolo[NMAX])
{
int contador = 0;
q0(contador, Simbolo);
}


void q0(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){
if ((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z'))
       {

       printf("%c", Simbolo[contador]);
        q1(++contador, Simbolo);
}

/*else
    qErro(contador, Simbolo);*/
}
}


void q1(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
  {
   printf("%c", Simbolo[contador]);
   q2(++contador, Simbolo);
  }
else if (Simbolo[contador] == '@')
    {
   printf("%c", Simbolo[contador]);
   q3(++contador, Simbolo);
  }
else if (Simbolo[contador] == '-')
   {
   printf("%c", Simbolo[contador]);
   q4(++contador, Simbolo);
  }

/*else
    qErro(++contador, Simbolo);*/
}
}



void q2(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q2(++contador, Simbolo);
  }
else if (Simbolo[contador] == '@')
    {
   printf("%c", Simbolo[contador]);
   q3(++contador, Simbolo);
  }
  else {
    q0(contador, Simbolo);
  }
  /*
else
    qErro(contador, Simbolo); */
}
}


void q3(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q10(++contador, Simbolo);
  }
else if ((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z'))
    {
   printf("%c", Simbolo[contador]);
   q11(++contador, Simbolo);
  }/*
else
    qErro(contador, Simbolo);*/
}
}

void q4(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q5(++contador, Simbolo);
  }/*
  else
    qErro(contador, Simbolo);*/
}
}


void q5(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){

if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q5(++contador, Simbolo);
  }
else if (Simbolo[contador] == '@')
    {
   printf("%c", Simbolo[contador]);
   q3(++contador, Simbolo);
  }
else if(Simbolo[contador] == '-')
  {
   printf("%c", Simbolo[contador]);
   q4(++contador, Simbolo);
  }/*
  else
    qErro(contador, Simbolo);*/

 }
}
void q6(int contador, char Simbolo[NMAX])
{   if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q7(++contador, Simbolo);
  }/*
 else
    qErro(contador, Simbolo);*/
}
}

void q7(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q7(++contador, Simbolo);
  }
else if (Simbolo[contador] == '-')
    {
   printf("%c", Simbolo[contador]);
   q8(++contador, Simbolo);
  }
else if (Simbolo[contador] == '@')
{
   printf("%c", Simbolo[contador]);
   q3(++contador, Simbolo);
  }/*
else
       qErro(contador, Simbolo);*/
}
}

void q8(int contador, char Simbolo[NMAX])

{   if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
   printf("%c", Simbolo[contador]);
   q9(++contador, Simbolo);
  }/*
  else
    qErro(contador, Simbolo);*/

}
}

void q9(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q9(++contador, Simbolo);
  }
else if (Simbolo[contador] == '@')
   {
   printf("%c", Simbolo[contador]);
   q3(++contador, Simbolo);
  }
else if (Simbolo[contador] == '-')
{
   printf("%c", Simbolo[contador]);
   q8(++contador, Simbolo);
  }/*
  else
    qErro(contador, Simbolo);*/

}
}

void q10(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9')|| 
Simbolo[contador] == '-')
   {
   printf("%c", Simbolo[contador]);
   q10(++contador, Simbolo);
  }
 else if (Simbolo[contador] == '.')
    {
   printf("%c", Simbolo[contador]);
   q11(++contador, Simbolo);
  }/*
else
qErro(contador, Simbolo);*/

}
}

void q11(int contador, char Simbolo[NMAX])

{   if(contador < NMAX){

if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') || 
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
   || (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
   {
   printf("%c", Simbolo[contador]);
   q11(++contador, Simbolo);
  }

  }}
else
qErro(contador, Simbolo);
}
}

void qErro(int contador, char Simbolo[NMAX])
{
if(contador < NMAX)
q0(++contador, Simbolo);
else
    exit(1);
}



int main()
{
int i = 0;
int teste_validacao;
int tamanho = 0;
char caracteres[NMAX];


char caracter;

FILE *arquivo;
arquivo = fopen("Entrada.txt", "r");

if (arquivo == NULL)
    return EXIT_FAILURE;

while(!feof(arquivo))

{
    caracter = getc(arquivo);
    teste_validacao = SelecionaSimbolosValidos(caracter);
    if(teste_validacao == 0)
    {
    caracteres[i] = caracter;
    i++;
    tamanho++;
    }

}
qInicial(caracteres);


/*int j;

for(j = 0; j < tamanho; j++)
    printf("%c", caracteres[j]);

printf("\nnumCaracteresValidos: %d\n", tamanho);
*/
fclose(arquivo);

return 0;


 }

Porém como saida está reconhecendo apenas uma linha “DOCTYPEhtmlclassclient” e nada mais; Além disso, não consegui chamar recursivamente as funções, pois transformei os símbolos validos em uma string de 76959 caracteres a partir da função SelecionaSimbolosValidos e tentei aplicar o automato nessa string, repetindo o reconhecimento até o fim dela, caracter por caracter. Mas não tenho ideia do que pode estar errado, pois os AFD está certo. Alguma ajuda?