#include <iostream>
using namespace std;

#include <stringtagparser.h>

stringtagparser::stringtagparser(stringc & arg_)
  : arg(arg_)
{
}

stringc stringtagparser::data( stringc & tag1 )
{
  tagfound=false;

  string tagbeg="<"+tag1+">";
  string tagend="</"+tag1+">";
  string::size_type i0 = arg.find(tagbeg);

  if (i0==string::npos)
    return "";

  //assertreturnT(!(i0==string::npos),"");

//cout << "i0=" << i0 << endl;
  string::size_type i1 = arg.find(tagend);
  if (i1==string::npos)
    return "";
  //assertreturnT(i1==string::npos,"");
  tagfound=true; 
//cout << "i1=" << i1 << endl;

//cout << i1-i0 - tagbeg.length() << endl;
  

//cout << arg.substr(i0) << endl;
  string::size_type i2=i0+tagbeg.length();
//cout << arg.substr(i2,i1-i2) << endl;

  return arg.substr(i2,i1-i2);
}

stringc stringtagparser::data_with_tags( stringc & tag1 ) const
{
  string tagbeg="<"+tag1+">";
  string tagend="</"+tag1+">";
  string::size_type i0 = arg.find(tagbeg);

  //assertreturnT(!(i0==string::npos),"");
  if (i0==string::npos)
    return "";

//cout << "i0=" << i0 << endl;
  string::size_type i1 = arg.find(tagend);
  if (i1==string::npos)
    return "";
  //assertreturnT(!(i1==string::npos),"");
//cout << "i1=" << i1 << endl;

//cout << i1-i0 - tagbeg.length() << endl;
  

//cout << arg.substr(i0) << endl;
//  string::size_type i2=i0+tagbeg.length();
//cout << arg.substr(i2,i1-i2) << endl;

  return arg.substr(i0,i1-i0+tagend.length());
}

stringc stringtagparser::data
( 
  stringc & tag1, 
  stringc & tag2 
)
{
  stringtagparser sp( data(tag1) );
  return sp.data(tag2);
}

stringc stringtagparser::data
( 
  stringc & tag1, 
  stringc & tag2, 
  stringc & tag3 
)
{
  stringtagparser sp( data(tag1) );
  return sp.data(tag2,tag3);
}

stringc stringtagparser::data
( 
  stringc & tag1, 
  stringc & tag2, 
  stringc & tag3, 
  stringc & tag4 
)
{
  stringtagparser sp( data(tag1) );
  return sp.data(tag2,tag3,tag4);
}

stringc stringtagparser::data
( 
  stringc & tag1, 
  stringc & tag2, 
  stringc & tag3, 
  stringc & tag4, 
  stringc & tag5 
)
{
  stringtagparser sp( data(tag1) );
  return sp.data(tag2,tag3,tag4,tag5);
}


stringc stringtagparser::data
( 
  stringc & tag1, 
  stringc & tag2, 
  stringc & tag3, 
  stringc & tag4, 
  stringc & tag5, 
  stringc & tag6 
)
{
  stringtagparser sp( data(tag1) );
  return sp.data(tag2,tag3,tag4,tag5,tag6);
}

void stringtagiter::reset()
{
  data = "";
  res=false;
  tagbeg = "<" + tag + ">";
  tagend = "</" + tag + ">";

  extractbetweentag(arg);
}

void stringtagiter::extractbetweentag( stringc str)
{
  res=false;

  string::size_type i1 = str.find(tagbeg);
  if (i1==string::npos)
    return;

  string s1 = str.substr(i1+tagbeg.length());
  string::size_type i2 = s1.find(tagend);
  if (i2==string::npos)
    return;

  res=true;  // tags exist

  data = s1.substr(0,i2);
  dataunprocessed = s1.substr(i2+tagend.length());
}

stringtagiter::stringtagiter(stringc & arg_, stringc & tag_)
  : stringtagparser(arg_), tag(tag_) {}

void stringtagiter::operator ++()
{ 
  extractbetweentag(dataunprocessed);
}





