diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2014-10-19 22:22:08 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2014-10-26 14:21:48 -0700 |
commit | 6800761863dd45b6055768febc6ace6a20120dc7 (patch) | |
tree | 73b416ca6507d9bb4f950252d55ead8e8cda34b5 /src/mmo/extract.cpp | |
parent | 0edf563dfc14a2b9db33a92f0eced28950bdf1aa (diff) | |
download | tmwa-6800761863dd45b6055768febc6ace6a20120dc7.tar.gz tmwa-6800761863dd45b6055768febc6ace6a20120dc7.tar.bz2 tmwa-6800761863dd45b6055768febc6ace6a20120dc7.tar.xz tmwa-6800761863dd45b6055768febc6ace6a20120dc7.zip |
New ast module for for npc parsing
Will eventually put most/all parsers there.
Diffstat (limited to 'src/mmo/extract.cpp')
-rw-r--r-- | src/mmo/extract.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/mmo/extract.cpp b/src/mmo/extract.cpp index a480984..9123237 100644 --- a/src/mmo/extract.cpp +++ b/src/mmo/extract.cpp @@ -30,6 +30,9 @@ #include "../poison.hpp" +// TODO move this whole file to io/ or something. +// It needs to be lower in the include hierarchy so it can be implemented +// for library types. Also it should pass an io::LineSpan around. namespace tmwa { bool extract(XString str, XString *rv) @@ -38,6 +41,12 @@ bool extract(XString str, XString *rv) return true; } +bool extract(XString str, RString *rv) +{ + *rv = str; + return true; +} + bool extract(XString str, AString *rv) { *rv = str; @@ -98,4 +107,174 @@ bool extract(XString str, CharName *out) } return false; } + +bool extract(XString str, std::chrono::nanoseconds *ns) +{ + std::chrono::nanoseconds::rep rep; + if (extract(str, &rep)) + { + *ns = std::chrono::nanoseconds(rep); + return true; + } + if (str.endswith("ns"_s)) + { + if (extract(str.xrslice_h("ns"_s.size()), &rep)) + { + *ns = std::chrono::nanoseconds(rep); + return true; + } + return false; + } + std::chrono::microseconds bigger; + if (extract(str, &bigger)) + { + *ns = bigger; + return *ns == bigger; + } + return false; +} +bool extract(XString str, std::chrono::microseconds *us) +{ + std::chrono::microseconds::rep rep; + if (extract(str, &rep)) + { + *us = std::chrono::microseconds(rep); + return true; + } + if (str.endswith("us"_s)) + { + if (extract(str.xrslice_h("us"_s.size()), &rep)) + { + *us = std::chrono::microseconds(rep); + return true; + } + return false; + } + std::chrono::milliseconds bigger; + if (extract(str, &bigger)) + { + *us = bigger; + return *us == bigger; + } + return false; +} +bool extract(XString str, std::chrono::milliseconds *ms) +{ + std::chrono::milliseconds::rep rep; + if (extract(str, &rep)) + { + *ms = std::chrono::milliseconds(rep); + return true; + } + if (str.endswith("ms"_s)) + { + if (extract(str.xrslice_h("ms"_s.size()), &rep)) + { + *ms = std::chrono::milliseconds(rep); + return true; + } + return false; + } + std::chrono::seconds bigger; + if (extract(str, &bigger)) + { + *ms = bigger; + return *ms == bigger; + } + return false; +} +bool extract(XString str, std::chrono::seconds *s) +{ + std::chrono::seconds::rep rep; + if (extract(str, &rep)) + { + *s = std::chrono::seconds(rep); + return true; + } + if (str.endswith("s"_s)) + { + if (extract(str.xrslice_h("s"_s.size()), &rep)) + { + *s = std::chrono::seconds(rep); + return true; + } + return false; + } + std::chrono::minutes bigger; + if (extract(str, &bigger)) + { + *s = bigger; + return *s == bigger; + } + return false; +} +bool extract(XString str, std::chrono::minutes *min) +{ + std::chrono::minutes::rep rep; + if (extract(str, &rep)) + { + *min = std::chrono::minutes(rep); + return true; + } + if (str.endswith("min"_s)) + { + if (extract(str.xrslice_h("min"_s.size()), &rep)) + { + *min = std::chrono::minutes(rep); + return true; + } + return false; + } + std::chrono::hours bigger; + if (extract(str, &bigger)) + { + *min = bigger; + return *min == bigger; + } + return false; +} +bool extract(XString str, std::chrono::hours *h) +{ + std::chrono::hours::rep rep; + if (extract(str, &rep)) + { + *h = std::chrono::hours(rep); + return true; + } + if (str.endswith("h"_s)) + { + if (extract(str.xrslice_h("h"_s.size()), &rep)) + { + *h = std::chrono::hours(rep); + return true; + } + return false; + } + std::chrono::duration<int, std::ratio<60*60*24>> bigger; + if (extract(str, &bigger)) + { + *h = bigger; + return *h == bigger; + } + return false; +} +bool extract(XString str, std::chrono::duration<int, std::ratio<60*60*24>> *d) +{ + std::chrono::duration<int, std::ratio<60*60*24>>::rep rep; + if (extract(str, &rep)) + { + *d = std::chrono::duration<int, std::ratio<60*60*24>>(rep); + return true; + } + if (str.endswith("d"_s)) + { + if (extract(str.xrslice_h("d"_s.size()), &rep)) + { + *d = std::chrono::duration<int, std::ratio<60*60*24>>(rep); + return true; + } + return false; + } + return false; +} } // namespace tmwa |