00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef YCode_h
00022 #define YCode_h
00023
00024 #include <string>
00025 using std::string;
00026
00027
00028 #include <y2util/MemUsage.h>
00029 #include "ycp/YCodePtr.h"
00030
00031 #include "ycp/YCPValue.h"
00032 #include "ycp/YCPString.h"
00033 #include "ycp/Type.h"
00034 #include "ycp/YSymbolEntry.h"
00035
00043 struct ycodelist {
00044 struct ycodelist *next;
00045 YCodePtr code;
00046 constTypePtr type;
00047 };
00048 typedef struct ycodelist ycodelist_t;
00049
00053 class YCode : public Rep
00054 #ifdef D_MEMUSAGE
00055 , public MemUsage
00056 #endif
00057 {
00058 REP_BODY(YCode);
00059 public:
00060 enum ykind {
00061 yxError = 0,
00062
00063 ycVoid, ycBoolean, ycInteger, ycFloat,
00064 ycString, ycByteblock, ycPath, ycSymbol,
00065 ycList,
00066 ycMap,
00067 ycTerm,
00068
00069 ycEntry,
00070
00071 ycConstant,
00072 ycLocale,
00073 ycFunction,
00074
00075
00076 yePropagate,
00077 yeUnary,
00078 yeBinary,
00079 yeTriple,
00080 yeCompare,
00081
00082
00083 yeLocale,
00084 yeList,
00085 yeMap,
00086 yeTerm,
00087 yeIs,
00088 yeBracket,
00089
00090
00091 yeBlock,
00092 yeReturn,
00093
00094
00095 yeVariable,
00096 yeBuiltin,
00097 yeFunction,
00098 yeReference,
00099
00100 yeFunctionPointer,
00101
00102 yeExpression,
00103
00104
00105 ysTypedef,
00106 ysVariable,
00107 ysFunction,
00108 ysAssign,
00109 ysBracket,
00110 ysIf,
00111 ysWhile,
00112 ysDo,
00113 ysRepeat,
00114 ysExpression,
00115 ysReturn,
00116 ysBreak,
00117 ysContinue,
00118 ysTextdomain,
00119 ysInclude,
00120 ysFilename,
00121 ysImport,
00122 ysBlock,
00123 ysSwitch,
00124 ysStatement
00125 };
00126
00127 public:
00128
00132 YCode ();
00133
00137 virtual ~YCode();
00138
00142 virtual ykind kind() const = 0;
00143
00147 virtual string toString() const;
00148 static string toString(ykind kind);
00149
00154 virtual std::ostream & toStream (std::ostream & str) const = 0;
00155 virtual std::ostream & toXml (std::ostream & str, int indent ) const = 0;
00156
00160 virtual bool isConstant () const;
00161
00165 bool isError () const;
00166
00170 virtual bool isStatement () const;
00171
00175 virtual bool isBlock () const;
00176
00180 virtual bool isReferenceable () const;
00181
00189 virtual YCPValue evaluate (bool cse = false);
00190
00194 virtual constTypePtr type() const;
00195 };
00196
00197
00202 class YConst : public YCode
00203 {
00204 REP_BODY(YConst);
00205 ykind m_kind;
00206 YCPValue m_value;
00207 public:
00208 YConst (ykind kind, YCPValue value);
00209 YConst (ykind kind, bytecodeistream & str);
00210 ~YConst () {};
00211 YCPValue value() const;
00212 virtual ykind kind() const;
00213 string toString() const;
00214 std::ostream & toStream (std::ostream & str) const;
00215 std::ostream & toXml (std::ostream & str, int indent ) const;
00217 virtual bool isConstant () const { return true; }
00218 YCPValue evaluate (bool cse = false);
00219 constTypePtr type() const;
00220 };
00221
00222 #include <ext/hash_map>
00223 #include <string>
00224 #include <cstddef>
00225
00232 class YELocale;
00233
00234 class YLocale : public YCode
00235 {
00236 REP_BODY(YLocale);
00237 const char *m_locale;
00238
00239 struct eqstr
00240 {
00241 bool operator()(const char* s1, const char* s2) const
00242 {
00243 return strcmp(s1, s2) == 0;
00244 }
00245 };
00246
00247 public:
00248 typedef __gnu_cxx::hash_map<const char*, bool, __gnu_cxx::hash<const char*>, eqstr> t_uniquedomains;
00249
00250 static t_uniquedomains domains;
00251 static t_uniquedomains::const_iterator setDomainStatus (const string& domain, bool status);
00252 static void ensureBindDomain (const string& domain);
00253
00254 YLocale (const char *locale, const char *textdomain);
00255 YLocale (bytecodeistream & str);
00256 ~YLocale ();
00257 virtual ykind kind () const { return ycLocale; }
00258 const char *value () const;
00259 const char *domain () const;
00260 string toString() const;
00261 std::ostream & toStream (std::ostream & str) const;
00262 std::ostream & toXml (std::ostream & str, int indent ) const;
00263 YCPValue evaluate (bool cse = false);
00264 constTypePtr type() const { return Type::Locale; }
00265
00266 private:
00267
00268 t_uniquedomains::const_iterator m_domain;
00269
00270 };
00271
00278 class YFunction : public YCode
00279 {
00280 REP_BODY(YFunction);
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 YBlockPtr m_declaration;
00293
00294
00295 YBlockPtr m_definition;
00296
00297 bool m_is_global;
00298
00299 public:
00300 YFunction (YBlockPtr parameterblock, const SymbolEntryPtr entry = 0);
00301 YFunction (bytecodeistream & str);
00302 ~YFunction ();
00303 virtual ykind kind () const { return ycFunction; }
00304
00305
00306 unsigned int parameterCount () const;
00307 YBlockPtr declaration () const;
00308 SymbolEntryPtr parameter (unsigned int position) const;
00309
00310
00311 YBlockPtr definition () const;
00312 void setDefinition (YBlockPtr body);
00313
00314 void setDefinition (bytecodeistream & str);
00315
00316 string toStringDeclaration () const;
00317 string toString () const;
00318 std::ostream & toStreamDefinition (std::ostream & str ) const;
00319 std::ostream & toXmlDefinition (std::ostream & str, int indent ) const;
00320 std::ostream & toStream (std::ostream & str ) const;
00321 std::ostream & toXml (std::ostream & str, int indent ) const;
00322 virtual YCPValue evaluate (bool cse = false);
00323 constTypePtr type() const;
00324 };
00325
00326
00327 #endif // YCode_h