/**
*
* @File : Balises.cxx
*
* @Authors : D. Mathieu
*
* @Date : 06/03/2001
*
* @Version : V1.0
*
* @Synopsis :  Test
*
*/
#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

namespace
{
    /* */

    void AfficherBalises (istream & is)
    {
        bool inBalise;
        for (char Car; is.get (Car); )
        {
            // Ligne ajoutée pour afficher sur une seule ligne des balises
            //   à cheval sur plusieurs lignes

            if ('\n' == Car || '\r' == Car) continue;
            if ('<' == Car) inBalise = true;
            if (inBalise) cout << Car;
            if ('>' == Car)
            {
                inBalise = false;
                cout << endl;
            }
        }
    } // AfficherBalises()
    /* */

    // Autre solution :
    /** /

    void AfficherBalises (istream & is)
    {
        for (char Car; is.get (Car); )
        {
            if ('<' == Car)
                for ( ; Car != '>'; is.get (Car))
                    // Test ajouté pour afficher sur une seule ligne des balises
                    //   à cheval sur plusieurs lignes
                    if ('\n' != Car && '\r' != Car) cout << Car;

            cout << '>' << endl;
        }

    } // AfficherBalises()
    /* */

    void Essai_01 (void)
    {
        string Str;
        ifstream is ("TpTriVect.html");
        AfficherBalises (is);
   
    } // Essai_01()

    typedef vector <string> CVString;

    void StockerBalises (istream & is, CVString & Vect)
    {
        string Str;
        const string CstStrVide;

        for (; getline (is, Str, '\n'); )
        {
            // Suppression du caractère '\r' précédant (éventuellement) '\n'

            if ('\r' == Str [Str.size() - 1]) Str.erase (Str.size() - 1);

            // Extraction de toutes les balises de la ligne

            string::size_type PosDebut = 0;
            string::size_type PosFin;

            // Boucler sur la ligne lue tant qu'il y a un début de balise
            //     à partir de la position PosDebut

            for ( ; string::npos != (PosDebut = Str.find ('<', PosDebut)); )
            {
                // Recherche de la fin de la balise, éventuellement sur
                //   une autre ligne en concaténant cette ligne à la précédente

                for (string StrNew;
                     string::npos == (PosFin = Str.find ('>', PosDebut));
                     Str += StrNew)
                {
                     getline (is, StrNew, '\n');
           
                     // Suppression du caractère '\r' précédant
                     //     (éventuellement) '\n'

                    if ('\r' == Str [Str.size() - 1])
                        Str.erase (Str.size() - 1);
                }
                // Extraction de la balise

                // L'extraction de la balise, ci-dessous, nécessite la
                //     construction d'une chaîne intermédiaire qui est ensuite
                //     passée en paramètre de la fonction push_back(), qui la
                //     recopie dans le vecteur.

                /** /
                Vect.push_back (string (Str, PosDebut, PosFin - PosDebut + 1));
                /**/

                // L'extraction de la balise, ci-dessous, commence par
                //     ajouter une chaîne vide, préconstruite, dans le
                //     vecteur, puis la modifie directement.

                /**/
                Vect.push_back (CstStrVide);
                Vect.back().assign (Str, PosDebut, PosFin - PosDebut + 1);
                /**/

                PosDebut = PosFin + 1;
            }
        }

    } // StockerBalises()

    void Essai_02 (void)
    {
        string Str;
        ifstream is ("TpTriVect.html");
        CVString V;
        StockerBalises (is, V);

        for (CVString::iterator i (V.begin()); i != V.end(); ++i)
            cout << *i << endl;

    } // Essai_02()


} // namespace anonyme

int main (void)
{
    /* * / Essai_01 (); /* */
    /*  */ Essai_02 (); /* */

    return 0;

} // main()