00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_TOOLS_DUMPER_HXX
00018 # define VCSN_TOOLS_DUMPER_HXX
00019
00020 # include <vaucanson/tools/usual_io.hh>
00021 # include <vaucanson/tools/xml_dump.hh>
00022 # include <vaucanson/tools/dot_dump.hh>
00023 # include <vaucanson/tools/fsm_dump.hh>
00024 # include <vaucanson/tools/simple_dump.hh>
00025 # include <cstring>
00026 # include <cstdlib>
00027 # include <cerrno>
00028 # include <string>
00029
00030 namespace vcsn
00031 {
00032 namespace tools
00033 {
00034 int
00035 string_to_int (const std::string& s)
00036 {
00037
00038 errno = 0;
00039 const char *ccp = s.c_str ();
00040 char *cp;
00041 long res = std::strtol (ccp, &cp, 10);
00042 if (*cp || INT_MAX < res || errno)
00043 {
00044 std::cerr << "integer out of bounds: " << s;
00045 if (errno)
00046 std::cerr << " (" << std::strerror (errno) << ")";
00047 std::cerr << std::endl;
00048 exit (1);
00049 }
00050 return res;
00051 }
00052
00053 dumper::dumper (int argc, char **argv, int pos)
00054 : fmt_ (fmt_xml), argc_ (argc), argv_ (argv)
00055 {
00056 if (pos < argc_)
00057 fmt_ = dump_format (argv_[pos]);
00058
00059 if (fmt_ == fmt_error)
00060 {
00061 std::cerr << "Invalid input: " << pos << " " << argv_[pos] << std::endl;
00062 usage (1);
00063 }
00064 }
00065
00066 void
00067 dumper::usage (int estatus)
00068 {
00069 std::cerr << "Usage: " << argv_[0] << " ... <fmt>" << std::endl
00070 << "where fmt is one of:" << std::endl
00071 << " dot graphviz format" << std::endl
00072 << " fsm FSM toolbox format" << std::endl
00073 << " simple internal Vaucanson format" << std::endl
00074 << " xml Vaucanson XML I/O format" << std::endl;
00075 exit (estatus);
00076 }
00077
00078 enum dumper::dump_format
00079 dumper::dump_format (std::string fmt)
00080 {
00081 if (fmt == "dot")
00082 return fmt_dot;
00083 else if (fmt == "simple")
00084 return fmt_simple;
00085 else if (fmt == "xml")
00086 return fmt_xml;
00087 else if (fmt == "fsm")
00088 return fmt_fsm;
00089 else
00090 return fmt_error;
00091 }
00092
00093
00094 const char*
00095 dumper::get_fmt() const
00096 {
00097 switch(fmt_)
00098 {
00099 case fmt_dot: return "dot";
00100 case fmt_xml: return "xml";
00101 case fmt_simple: return "simple";
00102 case fmt_fsm: return "fsm";
00103 case fmt_error: abort ();
00104 }
00105 return "unknown";
00106 }
00107
00108 void
00109 dumper::operator() (std::ostream& o,
00110 const automaton_t& automaton,
00111 const std::string& name)
00112 {
00113 switch(fmt_)
00114 {
00115 case fmt_dot:
00116 vcsn::tools::dot_dump (o, automaton, name);
00117 break;
00118 case fmt_xml:
00119 vcsn::tools::xml_dump (o, automaton, name);
00120 break;
00121 case fmt_simple:
00122 vcsn::tools::simple_dump (o, automaton,
00123 vcsn::tools::usual_converter_poly<rat_exp_t>());
00124 break;
00125 case fmt_fsm:
00126 vcsn::tools::fsm_dump (o, automaton);
00127 break;
00128 case fmt_error:
00129 abort ();
00130 break;
00131 }
00132 }
00133
00134 }
00135 }
00136
00137 #endif // !VCSN_TOOLS_DUMPER_HXX