#include <stdio.h>
#include <string.h>

#ifdef __unix__
    #include <unistd.h>
    #include <stdlib.h>

#elif defined(_WIN32) || defined(WIN32)

   #define OS_Windows

   #include <windows.h>

#endif

void gets(char *str, int t, int *tamW){
     fgets(str,t,stdin)-1;  //coloca \n e \0 no fim
     *tamW=strlen(str)-1;
     str[*tamW]='\0';   //'\0' no lugar de '\n'
}



void clrscr()
{
#ifdef OS_Windows
 /* Codigo Windows */
    system("cls");
#else
 /* Codigo GNU/Linux */
    system("clear");
#endif
//ou
//printf("\e[H\e[2J");
//ou
//printf("\33[H\33[2J");
}

int main()
{
    char w[30], c;//palavra, caractere corrente
    int q,i,falha,tamW=0;//estado corrente, indice de w, tamanho da palavra
    falha = 0;
    clrscr(); //Limpa a tela
    printf("Entre com a palavra a ser lida: ");
    gets(w,30,&tamW);

    /*scanf("%30[^\n]",w); //%[] é mais flexivel que %s
    printf("%d",i);
    scanf("%*[^\n]"); scanf("%*c"); //limpa o buffer*/

    printf("\nTamanho da palavra: %d, palavra: %s\n",tamW, w);
    q=1; //controle mostra o estado inicial
    printf("Sequencia de estados percorrido: ");
    printf("%d, ", q);  //começa em 1, PARA ESTE CASO PARTICULAR

    //percorrer w
    for(i=0; i< tamW; i++)
    {
        c=w[i];  //
        switch (q)
        {
            case 1:
                switch (c)
                {
                    case '0':
                        q=2;
                        //action(q)
                        break;
                    case '1':
                        q=3;
                        break;
                    default:
			falha=1;
                }//case1
                break;

            case 2:
                switch (c)
                {
                    case '0':
                        q=3;
                        break;
                    case '1':
                        q=3;
                        break;
                    default:
                        falha=1;
                }//case 2
                break;

           case 3:
                switch (c)
                {
                    case '0':
                        q=2;
                        break;
                    case '1':
                        q=2;
                        break;
                    default:
                        falha=1;
                }//case 3
                break;
        }//
        if(falha) break;
        else printf("%d, ", q);

    }//for
    if (falha || q!=2) printf("\n Palavra não aceita\n");
    else{
        printf("\nSUCESSO!! Palavra aceita\n");
    }
}//main
