Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Namespace Members | Data Fields | Globals
persist

dumpobj.cpp

Go to the documentation of this file.
00001 // See ../license.txt for license information.
00002 //
00003 // dumpobj.cpp
00004 //
00005 // 21-Jul-2003 phamilton Created
00006 //
00007 
00008 #define PERSIST_IN_LIBRARY_SOURCE
00009 
00010 #include "dumpobj.hpp"
00011 
00012 using namespace ph::persist;
00013 
00014 bool dumpobj::start(const std::string &tagname)
00015 /*
00016  The input to start and end is "TAGNAME". The state table for the
00017  tree must start from TAGNAME and work out.
00018 */
00019 {
00020 // Close off the previous tag (if there is one).
00021 if (!_tagname.empty())
00022 {
00023 if (_data.empty())
00024 {
00025 // object ::= 
00026 // object-start
00027 // ...
00028 object_start();
00029 _tabs++;
00030 }
00031 else
00032 data_object();
00033 }
00034 
00035 // and get started for the next tag.
00036 _attrs.clear();
00037 _tagname = tagname;
00038 _data = "";
00039 
00040 return true;
00041 }
00042 
00043 bool dumpobj::end(const std::string &tagname)
00044 {
00045 // close off the current tag (if there is one).
00046 if (_tagname.empty())
00047 {
00048 /*
00049  object ::= 
00050  ...
00051  object-end
00052  */
00053 // there was no accumulated tagname, just unnest,
00054 _tabs--;
00055 object_end();
00056 }
00057 else
00058 {
00059 if (_data.empty())
00060 {
00061 /*
00062  object ::= 
00063  object-start
00064  ...
00065  object-end
00066  */
00067 // the last tag had no data, so the last one was an object.
00068 object_start();
00069 object_end();
00070 }
00071 else
00072 data_object();
00073 }
00074 
00075 _attrs.clear();
00076 _tagname = "";
00077 _data = "";
00078 
00079 return true;
00080 }
00081 
00082 bool dumpobj::attr(const std::string &name, const std::string &value)
00083 {
00084 if (_tagname.empty())
00085 {
00086 *_console << "bad state detected in attr(). _tagname should not be empty." << std::endl;
00087 return false;
00088 }
00089 if (!_data.empty())
00090 {
00091 *_console << "bad state detected in attr(). _data should be empty." << std::endl;
00092 return false;
00093 }
00094 // and save this attribute.
00095 _attrs[name] = value;
00096 return true;
00097 }
00098 
00099 bool dumpobj::data(const std::string &d)
00100 {
00101 if (!_data.empty())
00102 {
00103 *_console << "bad state detected in data(). _data should be empty." << std::endl;
00104 return false;
00105 }
00106 // and save this data.
00107 _data = d;
00108 return true;
00109 }
00110 
00111 void dumpobj::object_start()
00112 /*
00113  object-start ::=
00114  TAGNAME ["(" attr-list ")"] "{" 
00115 
00116  attr-list ::= 
00117  [attr-pair ([", " attr-pair])*]
00118 
00119  attr-pair ::=
00120  name "=" value
00121 */
00122 {
00123 if (_tagname.empty())
00124 {
00125 *_console << "bad state detected in object_decl(). _tagname should not be empty." << std::endl;
00126 return;
00127 }
00128 tabs();
00129 *_stream << _tagname;
00130 if (!_attrs.empty())
00131 {
00132 *_stream << "(";
00133 // should get to use a std::for_each here somehow.
00134 for (std::map<std::string, std::string>::iterator i=_attrs.begin(); i != _attrs.end(); i++)
00135 {
00136 if (i != _attrs.begin())
00137 *_stream << ", ";
00138 *_stream << i->first << "=" << i->second;
00139 }
00140 *_stream << ")";
00141 }
00142 *_stream << " {";
00143 cr();
00144 }
00145 
00146 void dumpobj::object_end()
00147 /*
00148  object-end ::=
00149  "}"
00150 */
00151 {
00152 tabs();
00153 *_stream << "}";
00154 cr();
00155 }
00156 
00157 void dumpobj::data_object()
00158 /*
00159  data-object ::=
00160  TAGNAME "=" data
00161 */
00162 {
00163 tabs(); *_stream << _tagname << "=" << _data; cr();
00164 }
00165 
00166 void dumpobj::tabs()
00167 {
00168 for (int i=0; i<_tabs; i++)
00169 *_stream << " ";
00170 }
00171 
00172 void dumpobj::cr()
00173 {
00174 *_stream << std::endl;
00175 }
00176 

Generated on Wed Apr 5 22:03:23 2006 for cppxmlobj by doxygen 1.4.3

AltStyle によって変換されたページ (->オリジナル) /