//Készítette:   Gregorics Tibor
//Dátum:        2009.01.23.
//eha kód:      EHACODE.ELTE
//mail:         gt@inf.elte.hu
//csoport:      0.csoport
//Feladat:      3.beadandó/0.feladat
//              Bekezdéseket felsoroló objektum osztálya

#include "enor.h"

#include <iostream>
#include <cstdlib>

using namespace std;

//Feladat: 		Felsoroló létrehozása.
//Bemenő adatok:-
//Kimenő adatok:alapértelmezett felsoroló
//Tevékenység:	Megnyitja a felsoroló hátterében levő szöveges állományt olvasásra
//              inicializálja a bekezdések sorszámozását
Enor::Enor(const string &str)
{
    f.open(str.c_str());
    if(f.fail()){
        cout << "Nem lehet megnyitni az inputfajlt!\n";
        exit(1);
    }
    akt.sorsz = 0;
}

//Feladat: 		A felsoroló Next() művelete.
//Bemenő adatok:alapértelmezett felsoroló
//Kimenő adatok:alapértelmezett felsoroló
//Tevékenység:	Átlépi az üres sorokat, majd ha azok után nincs nem üres sor, akkor jelzi, hogy nincs több bekezdés
//              különben beolvassa a következő bekezdés sorait, amelyekben
//              egyrészt kiszámítja  a bekezdés sorszámát
//              másrészt számolja a szavak illetve a 'w' betűs szavak számát,
//              harmadrészt eldönti, hogy minden sorban van-e legalább két 'w' betűs szó
//              Egy soron belül felsoroltatja a szavakat, amelyekben 'w' betűt a find() függvénnyel keres.
void Enor::Next()
{
    for(;st==norm && sor.str().size()==0; Read());
    vege = st == abnorm;
    if(!vege){
        ++akt.sorsz;
        akt.jo = true;
        akt.db = 0;
        akt.ossz = 0;
        for(;st==norm && sor.str().size()!=0; Read()){
            string szo;
            int db = 0;
            for(sor>>szo; !sor.fail(); sor>>szo){
                if(szo.find('w')!=string::npos) ++db;
                ++akt.ossz;
            }
            akt.jo = akt.jo && db>=2;
            akt.db += db;
        }
    }
}

//Feladat: 		Szöveg következő sorának olvasása.
//Bemenő adatok:alapértelmezett felsoroló
//Kimenő adatok:alapértelmezett felsoroló
//Tevékenység:	Olvas egy újabb sort a szöveges állományból,
//              ha nem sikerül az olvasás státuszát abnorm-ra állítja, különben norm-ra
//              a beolvasott sort istringstream objektumba helyezi.
void Enor::Read()
{
    string str;
    getline(f,str);
    if(!f.fail()){
        st = norm;
        sor.clear();
        sor.str(str);
    }
    else st = abnorm;
}
