[Cmap-cvs] mp2mp mp2mp.cpp,1.6,1.7 mp_parser.cpp,1.7,1.8 mp_parser.h,1.6,1.7 object.cpp,1.5,1.6 pars
Status: Beta
Brought to you by:
dyp
From: Denis P. <dy...@us...> - 2005-08-28 22:24:10
|
Update of /cvsroot/cmap/mp2mp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27212 Modified Files: mp2mp.cpp mp_parser.cpp mp_parser.h object.cpp parserImpl.cpp parserImpl.h Log Message: Support search attrs Index: mp2mp.cpp =================================================================== RCS file: /cvsroot/cmap/mp2mp/mp2mp.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mp2mp.cpp 30 Jun 2005 04:00:17 -0000 1.6 +++ mp2mp.cpp 28 Aug 2005 22:23:58 -0000 1.7 @@ -60,7 +60,7 @@ Tokenizer t(f); - MPParser p(t, filename); + mp::MPParser p(t, filename); try { while (p.parseObject()) @@ -74,8 +74,8 @@ // p.map.printHeader(stdout); ObjectProp op; - for (std::list<Rgn>::iterator it = p.map.rgns.begin(); it != p.map.rgns.end(); it++) { - Rgn &rgn = *it; + for (mp::Rgns::iterator it = p.map.rgns.begin(); it != p.map.rgns.end(); it++) { + mp::Rgn &rgn = *it; if (handle(&rgn, op, 0)) rgn.print(fo, op, true); } Index: mp_parser.h =================================================================== RCS file: /cvsroot/cmap/mp2mp/mp_parser.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mp_parser.h 30 Jun 2005 04:00:17 -0000 1.6 +++ mp_parser.h 28 Aug 2005 22:23:58 -0000 1.7 @@ -7,6 +7,8 @@ #include "pexcept.h" #include "object.h" +namespace mp { + class point_t { public: double x; @@ -25,6 +27,8 @@ void print(FILE *f, const ObjectProp &op, bool is6Digit); }; +typedef std::list<Element> Elements; + class Attr { public: std::string name; @@ -33,6 +37,8 @@ void print(FILE *f); }; +typedef std::list<Attr> Attrs; + enum BoolType { Unknown, False, @@ -55,11 +61,17 @@ int type; int endLevel; std::string label; - std::list<Attr> attrs; - std::list<Element> elements; + Attrs attrs; + Elements elements; BoolType direction; BoolType city; + std::string countryName; + std::string regionName; + std::string cityName; + std::string streetName; + std::string houseName; + std::string filename; unsigned int line; @@ -67,12 +79,16 @@ void print(FILE *f, const ObjectProp &op, bool is6Digit); }; +typedef std::list<Rgn> Rgns; + class Level { public: int number; int zoom; }; +typedef std::vector<Level> Levels; + class Map { public: Map(); @@ -103,8 +119,8 @@ return false; } - std::list<Rgn> rgns; - std::vector<Level> levels; + Rgns rgns; + Levels levels; }; class MPParser { @@ -127,4 +143,6 @@ Tokenizer &t; }; +}; + #endif Index: parserImpl.cpp =================================================================== RCS file: /cvsroot/cmap/mp2mp/parserImpl.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- parserImpl.cpp 24 Apr 2005 19:59:43 -0000 1.4 +++ parserImpl.cpp 28 Aug 2005 22:23:58 -0000 1.5 @@ -3,42 +3,9 @@ #include "pexcept.h" #include "mp_parser.h" -class AttrVar : public StringRVar { -public: - AttrVar(const std::string &_name) : name(_name) { - } - - virtual ~AttrVar() { - } - - virtual std::string getValue(const void *obj, const ObjectProp &) { - const Rgn *rgn = (const Rgn *)obj; - for (std::list<Attr>::const_iterator it = rgn->attrs.begin(); it != rgn->attrs.end(); it++) - if ((*it).name == name) - return (*it).value; - - std::string value; - return value; - } -protected: - std::string name; -}; - ConfigParserImpl::ConfigParserImpl(Tokenizer &_t) : ConfigParser(_t) { } -StringRVar *ConfigParserImpl::parseStringRVar(const std::string &varName) { - StringRVar *var = ConfigParser::parseStringRVar(varName); - if (var != NULL) - return var; - if (varName == "attr") { - if (t.nextToken() != TT_STRING) - throw ParserException("Attribute name expected", t.lineno()); - return new AttrVar(t.sval); - } - return NULL; -} - bool ConfigParserImpl::parseObject() { switch (t.nextToken()) { case TT_EOF: Index: parserImpl.h =================================================================== RCS file: /cvsroot/cmap/mp2mp/parserImpl.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- parserImpl.h 7 Nov 2004 13:58:57 -0000 1.1.1.1 +++ parserImpl.h 28 Aug 2005 22:23:58 -0000 1.2 @@ -7,7 +7,6 @@ public: ConfigParserImpl(Tokenizer &_t); - virtual StringRVar *parseStringRVar(const std::string &varName); virtual bool parseObject(); }; Index: object.cpp =================================================================== RCS file: /cvsroot/cmap/mp2mp/object.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- object.cpp 12 Jun 2005 08:22:11 -0000 1.5 +++ object.cpp 28 Aug 2005 22:23:58 -0000 1.6 @@ -4,11 +4,10 @@ ObjectConfImpl *firstObj = NULL; void ObjectConfImpl::init(const void *obj, ObjectProp &o) { - const Rgn *rgn = (const Rgn *)obj; + const mp::Rgn *rgn = (const mp::Rgn *)obj; - o.index = false; - o.city = (rgn->city == True); - o.direction = (rgn->direction == True); + o.city = (rgn->city == mp::True); + o.direction = (rgn->direction == mp::True); o.garminType = rgn->type; o.layerMin = 0; @@ -16,6 +15,20 @@ o.label = rgn->label; o.kind = rgn->kind; + + o.countryName = rgn->countryName; + o.regionName = rgn->regionName; + o.cityName = rgn->cityName; + o.streetName = rgn->streetName; + o.house = rgn->houseName; + + for (mp::Attrs::const_iterator iAttr = rgn->attrs.begin (); iAttr != rgn->attrs.end (); ++iAttr) { + const mp::Attr &attr = *iAttr; + Attr a; + a.name = attr.name; + a.value = attr.value; + o.attrs.push_back(a); + } } void add(ObjectConfImpl *obj) { Index: mp_parser.cpp =================================================================== RCS file: /cvsroot/cmap/mp2mp/mp_parser.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mp_parser.cpp 30 Jun 2005 04:00:17 -0000 1.7 +++ mp_parser.cpp 28 Aug 2005 22:23:58 -0000 1.8 @@ -1,6 +1,8 @@ #include "mp_parser.h" #include "pexcept.h" +namespace mp { + Map::Map() : preprocess(Unknown), POIIndex(Unknown) { } @@ -58,7 +60,7 @@ void Rgn::print(FILE *f, const ObjectProp &op, bool is6Digit) { fprintf(f, "; LOC=%s:%u\n", filename.c_str(), line); - for (std::list<Attr>::iterator it = attrs.begin(); it != attrs.end(); it++) + for (::Attrs::const_iterator it = op.attrs.begin(); it != op.attrs.end(); it++) (*it).print(f); switch (op.kind) { @@ -75,18 +77,26 @@ fprintf(f, "Type=0x%x\n", op.garminType); - if (op.layerMax != 0) - fprintf(f, "EndLevel=%d\n", op.layerMax); +// if (op.layerMax != 0) +// fprintf(f, "EndLevel=%d\n", op.layerMax); if (op.label.length() > 0) fprintf(f, "Label=%s\n", op.label.c_str()); + if (op.countryName.length() > 0) + fprintf(f, "CountryName=%s\n", op.countryName.c_str()); + if (op.regionName.length() > 0) + fprintf(f, "RegionName=%s\n", op.regionName.c_str()); + if (op.cityName.length() > 0) + fprintf(f, "CityName=%s\n", op.cityName.c_str()); + if (op.streetName.length() > 0) + fprintf(f, "StreetDesc=%s\n", op.streetName.c_str()); + if (op.house.length() > 0) + fprintf(f, "HouseName=%s\n", op.house.c_str()); if (op.direction) fprintf(f, "DirIndicator=1\n"); if (op.city) fprintf(f, "City=Y\n"); - if (kind != op.kind) { - if (kind == kind::Point || op.kind != kind::Point) - throw ParserException("Only polyline and Polygon to Point conversion is supported", 0); + if (kind != op.kind && op.kind == kind::Point) { for (std::list<Element>::iterator it2 = elements.begin(); it2 != elements.end(); it2++) { point_t pt; pt.x = 0.0; @@ -102,9 +112,12 @@ pt.x /= count; pt.y /= count; - fprintf(f, "Data%d=", op.layerMin); - pt.print(f, is6Digit); - fprintf(f, "\n"); + unsigned int layerMax = op.layerMax > 0 ? op.layerMax : op.layerMin; + for (unsigned int i = op.layerMin; i <= layerMax; i++) { + fprintf(f, "Data%d=", i); + pt.print(f, is6Digit); + fprintf(f, "\n"); + } } } else { for (std::list<Element>::iterator it2 = elements.begin(); it2 != elements.end(); it2++) @@ -157,13 +170,16 @@ } void Element::print(FILE *f, const ObjectProp &op, bool is6Digit) { - fprintf(f, "Data%d=", op.layerMin); - for (std::list<point_t>::iterator it = points.begin(); it != points.end(); it++) { - if (it != points.begin()) - fprintf(f, ","); - (*it).print(f, is6Digit); + unsigned int layerMax = op.layerMax > 0 ? op.layerMax : op.layerMin; + for (unsigned int i = op.layerMin; i <= layerMax; i++) { + fprintf(f, "Data%d=", i); + for (std::list<point_t>::iterator it = points.begin(); it != points.end(); it++) { + if (it != points.begin()) + fprintf(f, ","); + (*it).print(f, is6Digit); + } + fprintf(f, "\n"); } - fprintf(f, "\n"); } void point_t::print(FILE *f, bool is6Digits) { @@ -417,6 +433,21 @@ if (varName == "label") { t.nextToEOL(true); rgn.label = t.sval; + } else if (varName == "countryname") { + t.nextToEOL(true); + rgn.countryName = t.sval; + } else if (varName == "regionname") { + t.nextToEOL(true); + rgn.regionName = t.sval; + } else if (varName == "cityname") { + t.nextToEOL(true); + rgn.cityName = t.sval; + } else if (varName == "streetdesc") { + t.nextToEOL(true); + rgn.streetName = t.sval; + } else if (varName == "housename") { + t.nextToEOL(true); + rgn.houseName = t.sval; } else if (varName == "endlevel") rgn.endLevel = parseInt(); else if (varName == "type") @@ -449,3 +480,5 @@ // t.printToken(); return false; } + +}; |