[Cmap-cvs] libs/eval eval.h,1.3,1.4 evalImpl.h,1.5,1.6 parser.cpp,1.6,1.7
Status: Beta
Brought to you by:
dyp
From: Denis P. <dy...@us...> - 2005-08-19 18:42:32
|
Update of /cvsroot/cmap/libs/eval In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1047 Modified Files: eval.h evalImpl.h parser.cpp Log Message: Add attributes to main ObjectProp Index: parser.cpp =================================================================== RCS file: /cvsroot/cmap/libs/eval/parser.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- parser.cpp 12 Jun 2005 08:27:13 -0000 1.6 +++ parser.cpp 19 Aug 2005 18:42:23 -0000 1.7 @@ -39,6 +39,11 @@ return new LayerMinVar(); if (varName == "layer_max") return new LayerMaxVar(); + if (varName == "intattr") { + if (t.nextToken() != TT_STRING) + throw ParserException("Attr name expected", t.lineno()); + return new IntAttrVar(t.sval); + } return NULL; } @@ -49,6 +54,11 @@ StringLVar *ConfigParser::parseStringLVar(const std::string &varName) { if (varName == "label") return new LabelLVar(); + if (varName == "attr") { + if (t.nextToken() != TT_STRING) + throw ParserException("Attr name expected", t.lineno()); + return new StringAttrVar(t.sval); + } return NULL; } Index: evalImpl.h =================================================================== RCS file: /cvsroot/cmap/libs/eval/evalImpl.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- evalImpl.h 12 Jun 2005 08:27:13 -0000 1.5 +++ evalImpl.h 19 Aug 2005 18:42:23 -0000 1.6 @@ -38,6 +38,42 @@ } }; +class StringAttrVar : public StringLVar { +public: + StringAttrVar(const std::string &_attrName) : attrName(_attrName) { + } + + virtual ~StringAttrVar() { + } + + virtual std::string getValue(const void *, const ObjectProp &o) { + for (Attrs::const_iterator iAttr = o.attrs.begin (); iAttr != o.attrs.end (); ++iAttr) { + const Attr &attr = *iAttr; + if (attr.name == attrName) + return attr.value; + } + fprintf(stderr, "Unknown attribute: %s\n", attrName.c_str()); + std::string value; + return value; + } + + virtual void setValue(ObjectProp &o, const std::string &value) { + for (Attrs::iterator iAttr = o.attrs.begin (); iAttr != o.attrs.end (); ++iAttr) { + Attr &attr = *iAttr; + if (attr.name == attrName) { + attr.value = value; + return; + } + } + Attr attr; + attr.name = attrName; + attr.value = value; + o.attrs.push_back(attr); + } +protected: + std::string attrName; +}; + class StringConst : public StringExpr { public: StringConst(const std::string &_value) : value(_value) { @@ -130,6 +166,44 @@ } }; + +class IntAttrVar : public IntLVar { +public: + IntAttrVar(const std::string &_attrName) : attrName(_attrName) { + } + + virtual ~IntAttrVar() { + } + + virtual int getValue(const void *obj, const ObjectProp &o, int) { + for (Attrs::const_iterator iAttr = o.attrs.begin (); iAttr != o.attrs.end (); ++iAttr) { + const Attr &attr = *iAttr; + if (attr.name == attrName) + return strtol(attr.value.c_str(), NULL, 10); + } + fprintf(stderr, "Unknown attribute: %s\n", attrName.c_str()); + return 0; + } + + virtual void setValue(ObjectProp &o, int value) { + char s[20]; + ::sprintf(s, "%d", value); + for (Attrs::iterator iAttr = o.attrs.begin (); iAttr != o.attrs.end (); ++iAttr) { + Attr &attr = *iAttr; + if (attr.name == attrName) { + attr.value = s; + return; + } + } + Attr attr; + attr.name = attrName; + attr.value = s; + o.attrs.push_back(attr); + } +protected: + std::string attrName; +}; + class IntRVar : public IntExpr { }; Index: eval.h =================================================================== RCS file: /cvsroot/cmap/libs/eval/eval.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- eval.h 12 Jun 2005 08:21:44 -0000 1.3 +++ eval.h 19 Aug 2005 18:42:23 -0000 1.4 @@ -4,6 +4,7 @@ #define __EVAL_EVAL_H__ #include <string> +#include <list> namespace kind { @@ -17,6 +18,19 @@ typedef kind::Kind Kind; +class Attr { +public: + std::string name; + std::string value; + + void print(FILE *f) const { + if (!value.empty()) + fprintf(f, "; %s=%s\n", name.c_str(), value.c_str()); + } +}; + +typedef std::list<Attr> Attrs; + typedef struct { bool index; bool doExport; @@ -36,6 +50,15 @@ int typePoint; int typeLine; int typePoly; + + Attrs attrs; + + void print(FILE *f) const { + for (Attrs::const_iterator iAttr = attrs.begin (); iAttr != attrs.end (); ++iAttr) { + const Attr &attr = *iAttr; + attr.print(f); + } + } } ObjectProp; #endif |