#include <cstdlib>
#include <iostream>
#define NULL             	0
#define TRUE			1
#define FALSE			0
#define TAMANHO_LINHA           80

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>


#include "classStack.h"
#include "DataArea.h"

using namespace std;
// 
// pilha 

#include "classSatckAsArray.h"

void imprimir_pilha(const StackAsArray *);
void imprimir_dado(Object * );

/*****************************************************************/

int main(int argc, char *argv[])
{
	StackAsArray		pilha(100);
	DataArea		*	pDataArea;
	CString				strLinha;

	int underflow, overflow;
	char transacao;
	char linha[TAMANHO_LINHA];
	FILE *pf;
	pf=fopen("..\\DADOS\\arq9502.dat","r");
	
	overflow = FALSE;
	underflow = FALSE;

	while (fgets(linha,TAMANHO_LINHA,pf) != NULL)
	{       
		/*  extracao dos dados da linha lida   */
		transacao = linha[0];

		strLinha.Format( "%s", linha );

		pDataArea = new DataArea( strLinha );

		switch (transacao)
 		{
 		   	case 'i':
			{	pilha.Push( *pDataArea );
				printf("Registro incluido-> ");
				imprimir_dado( pDataArea );
 		   		break;
			}
 		   	case 'e':
			{
				try
				{
 		   			DataArea & dataArea = (DataArea&) pilha.Pop();
					printf("Registro excluido-> ");
					imprimir_dado(&dataArea);
				}
				catch (const exception& e)
				{
					printf("Erro: %s\n", e.what() );
				}
 		   		break;		   				
			}
			default:
				printf("%s","transacao diferente de 'i', 'e' ou 'f'\n");
 		}
	}

	getch();

	fclose(pf);
	imprimir_pilha(&pilha);
	getch();

	return 0;
}

/*****************************************************************/

void imprimir_pilha(const StackAsArray * pPilha )
{
	StackAsArray::Iter iter( *pPilha );
	
 if (pPilha->IsEmpty()) {
    printf("pilha vazia\n");
    }
   else {
    printf("\n\n\t\tpilha Final\n\n");
    while ( !iter.IsDone() ) {
      imprimir_dado( &(*iter) );
	  ++iter;
     }
    }
}

/*****************************************************************/

void imprimir_dado(Object * pDataArea)
{
	( (DataArea*) pDataArea )->imprime();
}

