00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Xmlcode_h
00025 #define Xmlcode_h
00026
00027 #include "ycp/YCPValue.h"
00028 #include "ycp/YCode.h"
00029 #include "ycp/YStatement.h"
00030 #include "ycp/YBlock.h"
00031 #include "ycp/Type.h"
00032
00033 class Y2Namespace;
00034
00035 #include <iosfwd>
00036 #include <string>
00037 #include <map>
00038
00039 #include <fstream>
00040
00042 class xmlcodeistream : public std::ifstream
00043 {
00044 int m_major, m_minor, m_release;
00045 public:
00046 xmlcodeistream (string filename);
00047 bool isVersion (int major, int minor, int revision);
00048 bool isVersionAtMost (int major, int minor, int revision);
00049
00050 int major () const { return m_major; }
00051 int minor () const { return m_minor; }
00052 int release () const { return m_release; }
00053 };
00054
00056 class Xmlcode {
00057 static int m_namespace_nesting_level;
00058 static int m_namespace_nesting_array_size;
00059 static int m_namespace_tare_level;
00060
00062 struct namespaceentry_t {
00063 const Y2Namespace *name_space;
00064 bool with_xrefs;
00065 };
00066 static namespaceentry_t *m_namespace_nesting_array;
00067 static map<string, YBlockPtr>* m_xmlcodeCache;
00068
00069 public:
00071 class Invalid {};
00072
00073 static string spaces( int count );
00074
00075 static string xmlify( const string & s );
00076
00077
00078 static std::ostream & writeBytep (std::ostream & streamref, const unsigned char * bytep, unsigned int len);
00079 static unsigned char * readBytep (xmlcodeistream & streamref);
00080
00081
00082 static std::ostream & writeType (std::ostream & str, constTypePtr type);
00083 static TypePtr readType (xmlcodeistream & str);
00084
00085
00086 static std::ostream & writeYCodelist (std::ostream & str, const ycodelist_t *codelist);
00087 static bool readYCodelist (xmlcodeistream & str, ycodelist_t **anchor);
00088
00089
00090
00091
00092 static void namespaceInit ();
00093
00094 static int namespaceId (const Y2Namespace *name_space);
00095
00096 static const Y2Namespace *namespacePtr (int namespace_id);
00097
00098
00099 static int pushNamespace (const Y2Namespace *name_space, bool with_xrefs = false);
00100
00101
00102 static int popNamespace (const Y2Namespace *name_space);
00103
00104
00105 static void popUptoNamespace (const Y2Namespace *name_space);
00106
00107
00108
00109 static int tareStack ();
00110 static void untareStack (int tare_id);
00111
00112
00113
00114
00115
00116 static std::ostream &writeEntry (std::ostream & str, const SymbolEntryPtr entry);
00117 static SymbolEntryPtr readEntry (xmlcodeistream & str);
00118
00119
00120
00121
00122
00123 static YCodePtr readCode (xmlcodeistream & str);
00124
00125
00126
00127
00128
00129
00130 static YBlockPtr readModule (const string & mname);
00131
00132
00133 static YCodePtr readFile (const string & filename);
00134
00135
00136 static bool writeFile (const YCodePtr code, const string & filename);
00137 };
00138
00139 #endif // Xmlcode_h