From 456b982ced0d724569672e8ef7d8ebafbe935c8c Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 11 Jun 2014 21:53:00 -0400 Subject: [PATCH] DOM - Updated DOM to use Variant ovjects, which carry a type which improves expression evaluation. --- src/DOM.cpp | 112 ++++++++++++++++++++-------------------- src/DOM.h | 7 +-- src/Filter.cpp | 4 +- src/commands/CmdGet.cpp | 5 +- test/dom.t.cpp | 21 ++++---- 5 files changed, 76 insertions(+), 73 deletions(-) diff --git a/src/DOM.cpp b/src/DOM.cpp index b6f2a4f36..cb0a5dcef 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -76,7 +77,7 @@ const std::vector DOM::get_references () const // system.version // system.os // -bool DOM::get (const std::string& name, std::string& value) +bool DOM::get (const std::string& name, Variant& value) { int len = name.length (); Nibbler n (name); @@ -89,7 +90,7 @@ bool DOM::get (const std::string& name, std::string& value) std::map ::iterator c = context.config.find (key); if (c != context.config.end ()) { - value = c->second; + value = Variant (c->second); return true; } @@ -102,35 +103,36 @@ bool DOM::get (const std::string& name, std::string& value) { if (name == "context.program") { - value = context.program; + value = Variant (context.program); return true; } else if (name == "context.args") { - value = ""; + std::string commandLine = ""; std::vector ::iterator i; for (i = context.parser.tree ()->_branches.begin (); i != context.parser.tree ()->_branches.end (); ++i) { - if (value != "") - value += " "; + if (commandLine != "") + commandLine += " "; - value += (*i)->attribute ("raw"); + commandLine += (*i)->attribute ("raw"); } + value = Variant (commandLine); return true; } else if (name == "context.width") { - value = format (context.terminal_width - ? context.terminal_width - : context.getWidth ()); + value = Variant (context.terminal_width + ? context.terminal_width + : context.getWidth ()); return true; } else if (name == "context.height") { - value = format (context.terminal_height - ? context.terminal_height - : context.getHeight ()); + value = Variant (context.terminal_height + ? context.terminal_height + : context.getHeight ()); return true; } else @@ -146,7 +148,7 @@ bool DOM::get (const std::string& name, std::string& value) // Taskwarrior version number. if (name == "system.version") { - value = VERSION; + value = Variant (VERSION); return true; } @@ -154,27 +156,27 @@ bool DOM::get (const std::string& name, std::string& value) else if (name == "system.os") { #if defined (DARWIN) - value = "Darwin"; + value = Variant ("Darwin"); #elif defined (SOLARIS) - value = "Solaris"; + value = Variant ("Solaris"); #elif defined (CYGWIN) - value = "Cygwin"; + value = Variant ("Cygwin"); #elif defined (HAIKU) - value = "Haiku"; + value = Variant ("Haiku"); #elif defined (OPENBSD) - value = "OpenBSD"; + value = Variant ("OpenBSD"); #elif defined (FREEBSD) - value = "FreeBSD"; + value = Variant ("FreeBSD"); #elif defined (NETBSD) - value = "NetBSD"; + value = Variant ("NetBSD"); #elif defined (LINUX) - value = "Linux"; + value = Variant ("Linux"); #elif defined (KFREEBSD) - value = "GNU/kFreeBSD"; + value = Variant ("GNU/kFreeBSD"); #elif defined (GNUHURD) - value = "GNU/Hurd"; + value = Variant ("GNU/Hurd"); #else - value = STRING_DOM_UNKNOWN; + value = Variant (STRING_DOM_UNKNOWN); #endif return true; } @@ -218,18 +220,18 @@ bool DOM::get (const std::string& name, std::string& value) // annotations..entry.second // annotations..description // -bool DOM::get (const std::string& name, const Task& task, std::string& value) +bool DOM::get (const std::string& name, const Task& task, Variant& value) { // if (task.size () && name == "id") { - value = format (task.id); + value = Variant (task.id); return true; } if (task.size () && name == "urgency") { - value = format (task.urgency_c ()); + value = Variant (task.urgency_c ()); return true; } @@ -242,7 +244,7 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) std::string canonical; if (task.size () && context.parser.canonicalize (canonical, "attribute", name)) { - value = task.get (canonical); + value = Variant (task.get (canonical)); return true; } } @@ -283,12 +285,12 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) { if (elements[1] == "id") { - value = format (ref.id); + value = Variant (ref.id); return true; } else if (elements[1] == "urgency") { - value = format (ref.urgency_c ()); + value = Variant (ref.urgency_c ()); return true; } @@ -297,7 +299,7 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) { if (elements.size () == 2) { - value = ref.get (canonical); + value = Variant (ref.get (canonical)); return true; } else if (elements.size () == 3) @@ -305,7 +307,7 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) // tags. if (canonical == "tags") { - value = ref.hasTag (elements[2]) ? elements[2] : ""; + value = Variant (ref.hasTag (elements[2]) ? elements[2] : ""); return true; } @@ -322,15 +324,15 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) // .minute // .second Date date (ref.get_date (canonical)); - if (elements[2] == "year") { value = format (date.year ()); return true; } - else if (elements[2] == "month") { value = format (date.month ()); return true; } - else if (elements[2] == "day") { value = format (date.day ()); return true; } - else if (elements[2] == "week") { value = format (date.week ()); return true; } - else if (elements[2] == "weekday") { value = format (date.dayOfWeek ()); return true; } - else if (elements[2] == "julian") { value = format (date.dayOfYear ()); return true; } - else if (elements[2] == "hour") { value = format (date.hour ()); return true; } - else if (elements[2] == "minute") { value = format (date.minute ()); return true; } - else if (elements[2] == "second") { value = format (date.second ()); return true; } + if (elements[2] == "year") { value = Variant (date.year ()); return true; } + else if (elements[2] == "month") { value = Variant (date.month ()); return true; } + else if (elements[2] == "day") { value = Variant (date.day ()); return true; } + else if (elements[2] == "week") { value = Variant (date.week ()); return true; } + else if (elements[2] == "weekday") { value = Variant (date.dayOfWeek ()); return true; } + else if (elements[2] == "julian") { value = Variant (date.dayOfYear ()); return true; } + else if (elements[2] == "hour") { value = Variant (date.hour ()); return true; } + else if (elements[2] == "minute") { value = Variant (date.minute ()); return true; } + else if (elements[2] == "second") { value = Variant (date.second ()); return true; } } } } @@ -354,12 +356,12 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) { // annotation_1234567890 // 0 ^11 - value = i->first.substr (11); + value = Variant ((time_t) strtol (i->first.substr (11).c_str (), NULL, 10), Variant::type_date); return true; } else if (elements[3] == "description") { - value = i->second; + value = Variant (i->second); return true; } } @@ -389,15 +391,15 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) // ..entry.minute // ..entry.second Date date (i->first.substr (11)); - if (elements[4] == "year") { value = format (date.year ()); return true; } - else if (elements[4] == "month") { value = format (date.month ()); return true; } - else if (elements[4] == "day") { value = format (date.day ()); return true; } - else if (elements[4] == "week") { value = format (date.week ()); return true; } - else if (elements[4] == "weekday") { value = format (date.dayOfWeek ()); return true; } - else if (elements[4] == "julian") { value = format (date.dayOfYear ()); return true; } - else if (elements[4] == "hour") { value = format (date.hour ()); return true; } - else if (elements[4] == "minute") { value = format (date.minute ()); return true; } - else if (elements[4] == "second") { value = format (date.second ()); return true; } + if (elements[4] == "year") { value = Variant (date.year ()); return true; } + else if (elements[4] == "month") { value = Variant (date.month ()); return true; } + else if (elements[4] == "day") { value = Variant (date.day ()); return true; } + else if (elements[4] == "week") { value = Variant (date.week ()); return true; } + else if (elements[4] == "weekday") { value = Variant (date.dayOfWeek ()); return true; } + else if (elements[4] == "julian") { value = Variant (date.dayOfYear ()); return true; } + else if (elements[4] == "hour") { value = Variant (date.hour ()); return true; } + else if (elements[4] == "minute") { value = Variant (date.minute ()); return true; } + else if (elements[4] == "second") { value = Variant (date.second ()); return true; } } } } @@ -410,7 +412,7 @@ bool DOM::get (const std::string& name, const Task& task, std::string& value) } //////////////////////////////////////////////////////////////////////////////// -void DOM::set (const std::string& name, const std::string& value) +void DOM::set (const std::string& name, const Variant& value) { int len = name.length (); @@ -418,7 +420,7 @@ void DOM::set (const std::string& name, const std::string& value) if (len > 3 && name.substr (0, 3) == "rc.") { - context.config.set (name.substr (3), value); + context.config.set (name.substr (3), (std::string) value); } // Unrecognized --> error. diff --git a/src/DOM.h b/src/DOM.h index bbad94189..ab5f57d06 100644 --- a/src/DOM.h +++ b/src/DOM.h @@ -28,6 +28,7 @@ #define INCLUDED_DOM #include +#include #include #include @@ -38,9 +39,9 @@ public: ~DOM (); const std::vector get_references () const; - bool get (const std::string&, std::string&); - bool get (const std::string&, const Task&, std::string&); - void set (const std::string&, const std::string&); + bool get (const std::string&, Variant&); + bool get (const std::string&, const Task&, Variant&); + void set (const std::string&, const Variant&); private: }; diff --git a/src/Filter.cpp b/src/Filter.cpp index 87236a612..1ecce6124 100644 --- a/src/Filter.cpp +++ b/src/Filter.cpp @@ -44,10 +44,8 @@ Task& contextTask = dummy; //////////////////////////////////////////////////////////////////////////////// bool domSource (const std::string& identifier, Variant& value) { - std::string result; - if (context.dom.get (identifier, contextTask, result)) + if (context.dom.get (identifier, contextTask, value)) { - value = Variant (result); value.source (identifier); return true; } diff --git a/src/commands/CmdGet.cpp b/src/commands/CmdGet.cpp index 645468565..b1c1cf0dc 100644 --- a/src/commands/CmdGet.cpp +++ b/src/commands/CmdGet.cpp @@ -25,6 +25,7 @@ //////////////////////////////////////////////////////////////////////////////// #include +#include #include #include #include @@ -58,10 +59,10 @@ int CmdGet::execute (std::string& output) for (word = words.begin (); word != words.end (); ++word) { Task t; - std::string result; + Variant result; if (context.dom.get (*word, t, result)) { - results.push_back (result); + results.push_back ((std::string) result); found = true; } } diff --git a/test/dom.t.cpp b/test/dom.t.cpp index 2e4e06dbf..fe5a85ee8 100644 --- a/test/dom.t.cpp +++ b/test/dom.t.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -51,36 +52,36 @@ int main (int argc, char** argv) context.config.set ("name", "value"); DOM dom; - std::string result; + Variant result; t.ok (dom.get ("system.version", result), "DOM system.version -> true"); - t.is (result, VERSION, "DOM system.version -> VERSION"); + t.is ((std::string) result, VERSION, "DOM system.version -> VERSION"); t.ok (dom.get ("system.os", result), "DOM system.os -> true"); - t.ok (result != "", "DOM system.os -> != Unknown"); + t.ok ((std::string) result != "", "DOM system.os -> != Unknown"); t.ok (dom.get ("context.program", result), "DOM context.program -> true"); - t.is (result, "task", "DOM context.program -> 'task'"); + t.is ((std::string) result, "task", "DOM context.program -> 'task'"); t.ok (dom.get ("context.args", result), "DOM context.args -> true"); - t.is (result, "task", "DOM context.args -> 'task'"); + t.is ((std::string) result, "task", "DOM context.args -> 'task'"); t.ok (dom.get ("context.width", result), "DOM context.width -> true"); - t.ok (result != "0", "DOM context.width -> '0'"); + t.ok (result.get_integer () != 0, "DOM context.width -> '0'"); t.ok (dom.get ("context.height", result), "DOM context.height -> true"); - t.ok (result != "0", "DOM context.height -> '0'"); + t.ok (result.get_integer () != 0, "DOM context.height -> '0'"); // dom.get rc.name t.ok (dom.get ("rc.name", result), "DOM rc.name -> true"); - t.is (result, "value", "DOM rc.name -> value"); + t.is ((std::string) result, "value", "DOM rc.name -> value"); // dom.get rc.missing t.notok (dom.get ("rc.missing", result), "DOM rc.missing -> false"); // dom.set rc.name - dom.set ("rc.new", "value"); + dom.set ("rc.new", Variant ("value")); t.ok (dom.get ("rc.new", result), "DOM rc.new -> true"); - t.is (result, "value", "DOM rc.new -> value"); + t.is ((std::string) result, "value", "DOM rc.new -> value"); } catch (const std::string& error)