
#include <iostream>
#include <list.h>
#include <string>

    
ostream &struc2gnuplot_txt(const string sys = "sim", istream &in = cin, ostream &out = cout)
{
  typedef struct record_ record_t;
  struct record_
  {
    string       	vec;
    unsigned int	num;
    string     		cmp;
    string     	 	mod;
    unsigned int       	rpt;
  };

  list<record_t>	Lx;
  list<record_t>	Ly;

  record_t		r;


  // read data from struc.txt

  while (in >> r.vec >> r.num >> r.cmp >> r.mod >> r.rpt)
    {
      if ("state" == r.vec)
	{
	  Lx.push_back(r);
	}
      else if ("output" == r.vec)
	{
	  Ly.push_back(r);
	}
    }

  // write header

  out << "set data style lines" << endl
      << "set xlabel \"time\"" << endl
      << "set grid" << endl
      << endl;

  // write states (X11)

  out << "set term X11" << endl
      << "plot\\" << endl;
  for (list<record_t>::iterator i = Lx.begin(); i != Lx.end() ; i++)
    {
      if (Lx.begin() != i)
	{
	  out << ",\\" << endl;
	}
      out << "\t\"MTT_work/" << sys << "_odes.dat2\" using 1:" << 2 + Ly.size() + i->num
	  << " axes x1y1"
	  << " title \"" << i->mod << "_" << i->cmp << "\"";
    }
  out << endl << endl << "pause(-1)" << endl << endl;

  // write states (postscript)
  
  out << "set term postscript eps color" << endl
      << "set output \"" << sys << "_states.eps\"" << endl
      << "replot" << endl << endl;  

  // write outputs (X11)

  out << "set term X11" << endl
      << "plot\\" << endl;
  for (list<record_t>::iterator i = Ly.begin(); i != Ly.end() ; i++)
    {
      if (Ly.begin() != i)
	{
	  out << ",\\" << endl;
	}
      out << "\t\"MTT_work/" << sys << "_odes.dat2\" using 1:" << 1 + i->num
	  << " axes x1y1"
	  << " title \"" << i->mod << "_" << i->cmp << "\"";
    }
  out << endl << endl << "pause(-1)" << endl << endl;

  // write outputs (postscript)
  
  out << "set term postscript eps color" << endl
      << "set output \"" << sys << "_outputs.eps\"" << endl
      << "replot" << endl << endl;  

  return out;
}

#ifdef MAIN
int main(int argc, char *argv[])
{
  if (--argc)
    {
      struc2gnuplot_txt(argv[1]);
    }
  else
    {
      struc2gnuplot_txt();
    }
  return 0;
}
#endif // MAIN
