/* CXml2Txt header Last modified: 12.12.03 */ #ifndef __CXML2TXT_ #define __CXML2TXT_ #define _LARGEFILE64_SOURCE #include #include #include #include #include using std::ostringstream; using std::string; using std::list; #define STREAM_BUF_SIZE 32768 #define MAX_TAG_NAME 1024 #define MAX_TAG_ATTRIB_NAME 1024 #define MAX_TAG_ATTRIB_VAL 1024 #define ERROR_BUF_SIZE 1024 // For error-throwing: class Error { public: string m_str; Error(string sX) : m_str(sX) { } }; // Useful string convertion routine: template inline string to_string(const T &value) { ostringstream streamOut; streamOut << value; return streamOut.str(); } // XML to TXT convertor: class CXml2Txt { public: /* --- Ctor/Dtor --- */ CXml2Txt(); virtual ~CXml2Txt(); typedef enum tag_f_close { ALL = 0, SRC = 1, DST = 2 } f_close; /* --- Methods --- */ void Open(string, string) /* throw(Error) */; unsigned long Convert(const char = '\t') /* throw(Error) */; void Close(f_close = ALL); void SetPause(bool = true); void SplitOutput(unsigned long = 0); void BeVerbose(bool = true); protected: FILE *m_fin, // Input file *m_fout; // Output file string m_sSrc, // File m_sDst; // names char m_sep; // Output separator unsigned long m_tags_per_part; // Tags per part bool m_pause; // Pause between parts bool m_verbose; // Verbosity char m_szError[ERROR_BUF_SIZE]; // Current error typedef struct tag_attrib { string sName; string sValue; } attrib; // Tag attribute typedef struct tag_tag { string sName; list lAttribList; } tag; virtual void AnalyzeTag(tag &); // Tag analyzer private: /* --- Disabled Ctors --- */ CXml2Txt(const CXml2Txt &); /* --- Internal data --- */ char m_ch, // Current stream char m_last_ch; // Last stream char unsigned long m_line_cnt; // Line counter char m_buf[STREAM_BUF_SIZE]; // Stream buffer size_t m_idx, m_max; // Used in GetNext(); typedef enum tag_state { eText, eTag, eError, eEOF } state; // Machine's state state m_state, m_prev_state; /* --- Internal methods --- */ void ParseText(); void ParseTag(); void ParseTagName(string &); void ParseTagAttribName(string &); void ParseTagAttribVal(string &); void ParseTagEnd(); void ChangeState(state); char GetNext(); void On_EndOfFile(); }; #endif //