/*---------------------------------------------------------
palindrome
par Martin Robinson
-----------------------------------------------------------
preprocesseur
---------------------------------------------------------*/

#include "palindrome.hpp"

/*---------------------------------------------------------
methode privée
---------------------------------------------------------*/

//initialise l'objet
void palindrome::init(const char * str)
{
    _fstr = new nuFstr(str);
}

//vide tout lobjet
void palindrome::clear()
{
    while(_fstr)
    {
        fstring * tmp = _fstr->undo();
        delete _fstr;
        _fstr = tmp;
    }
    _fstr = 0;
    
    _stk.clear();
}

/*---------------------------------------------------------
constructeur destructeur
---------------------------------------------------------*/

palindrome::palindrome(const char * str)
{
    init(str);
}

palindrome::~palindrome()
{
    clear();
}

/*---------------------------------------------------------
methode
---------------------------------------------------------*/

//seule et unique fonction qui retourne la un booleen si
//la phrase est un palindrome
bool palindrome::operator() ()
{
    char lower[2] = {0};

    for(int i=0;i<_fstr->size();i++)
    {
        //remove upper case
        if (_fstr->at(i) >64 && _fstr->at(i) < 91)
        {
            lower[0] = _fstr->at(i)+32;
            _fstr = new insertNuFstr(_fstr, lower, i, i+1);
        }
        //remove space
        if (_fstr->at(i) == ' ' ||
            _fstr->at(i) == 39 ||
            _fstr->at(i) == ':' ||
            _fstr->at(i) == ',' ||
            _fstr->at(i) == '.' ||
            _fstr->at(i) == '!' ||
            _fstr->at(i) == '?')
        {
            _fstr = new trimFstr(_fstr,i,i+1);
            i--;
        }
    }
    
    //stocker la moitier de la string dans une stack
    for (int i=0;i<_fstr->size()/2;i++)
        _stk.push(_fstr->at(i));
    //vérifier avec l'autre moitié
    for (int i=_fstr->size()- _fstr->size()/2; i<_fstr->size(); i++ )
        if (_fstr->at(i)!=_stk.top())
            return false;
        else
            _stk.pop();
    
    return true;
}
