From 036d77e08faaa8aa0c42aa01ce2f5e8cbcbee4af Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 4 Feb 2011 12:14:52 -0500 Subject: [PATCH] Bug - Disallowed @ and / from an attribute name or modifier. This causes input like 'user@host:path' to now be parsed as description, and not as an unrecognized attribute. --- src/Att.cpp | 18 +++++++++++------- src/Nibbler.cpp | 6 ++++++ src/Nibbler.h | 2 ++ test/att.t.cpp | 36 ++++++++++++++++++++---------------- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/Att.cpp b/src/Att.cpp index 2ea97309a..1dfde4101 100644 --- a/src/Att.cpp +++ b/src/Att.cpp @@ -205,14 +205,18 @@ bool Att::valid (const std::string& input) const if (!n.getUntilOneOf (".:", ignored)) return false; - if (n.skip (':') && - (n.getQuoted ('"', ignored) || - n.getUntil (' ', ignored) || - n.getUntilEOS (ignored) || - n.depleted ())) - return true; + if (n.skip (':')) + { + if (input.find ('@') <= n.cursor () || + input.find ('/') <= n.cursor ()) + return false; - return false; + if (n.getQuoted ('"', ignored) || + n.getUntil (' ', ignored) || + n.getUntilEOS (ignored) || + n.depleted ()) + return true; + } } return false; diff --git a/src/Nibbler.cpp b/src/Nibbler.cpp index 541d8871d..162c23fb7 100644 --- a/src/Nibbler.cpp +++ b/src/Nibbler.cpp @@ -552,6 +552,12 @@ char Nibbler::next () return '\0'; } +//////////////////////////////////////////////////////////////////////////////// +std::string::size_type Nibbler::cursor () +{ + return mCursor; +} + //////////////////////////////////////////////////////////////////////////////// // Peeks ahead - does not move cursor. std::string Nibbler::next (const int quantity) diff --git a/src/Nibbler.h b/src/Nibbler.h index 604ae177d..e7d379238 100644 --- a/src/Nibbler.h +++ b/src/Nibbler.h @@ -69,6 +69,8 @@ public: char next (); std::string next (const int quantity); + std::string::size_type cursor (); + void save (); void restore (); diff --git a/test/att.t.cpp b/test/att.t.cpp index 10f662fe8..593626f41 100644 --- a/test/att.t.cpp +++ b/test/att.t.cpp @@ -34,25 +34,29 @@ Context context; //////////////////////////////////////////////////////////////////////////////// int main (int argc, char** argv) { - UnitTest t (117); + UnitTest t (121); Att a; - t.notok (a.valid ("name"), "Att::valid name -> fail"); - t.notok (a.valid (":"), "Att::valid : -> fail"); - t.notok (a.valid (":value"), "Att::valid :value -> fail"); + t.notok (a.valid ("name"), "Att::valid name -> fail"); + t.notok (a.valid (":"), "Att::valid : -> fail"); + t.notok (a.valid (":value"), "Att::valid :value -> fail"); + t.notok (a.valid ("n@me.mod:value"), "Att::valie n@me.mod:value -> fail"); + t.notok (a.valid ("n/me.mod:value"), "Att::valie n/me.mod:value -> fail"); + t.notok (a.valid ("name.m@d:value"), "Att::valie name.m@d:value -> fail"); + t.notok (a.valid ("name.m/d:value"), "Att::valie name.m/d:value -> fail"); - t.ok (a.valid ("name:value"), "Att::valid name:value"); - t.ok (a.valid ("name:value "), "Att::valid name:value\\s"); - t.ok (a.valid ("name:'value'"), "Att::valid name:'value'"); - t.ok (a.valid ("name:'one two'"), "Att::valid name:'one two'"); - t.ok (a.valid ("name:\"value\""), "Att::valid name:\"value\""); - t.ok (a.valid ("name:\"one two\""), "Att::valid name:\"one two\""); - t.ok (a.valid ("name:"), "Att::valid name:"); - t.ok (a.valid ("name:""), "Att::valid ""); - t.ok (a.valid ("name.one:value"), "Att::valid name.one.value"); - t.ok (a.valid ("name.one.two:value"), "Att::valid name.one.two:value"); - t.ok (a.valid ("name.:value"), "Att::valid name.:value"); - t.ok (a.valid ("name..:value"), "Att::valid name..:value"); + t.ok (a.valid ("name:value"), "Att::valid name:value"); + t.ok (a.valid ("name:value "), "Att::valid name:value\\s"); + t.ok (a.valid ("name:'value'"), "Att::valid name:'value'"); + t.ok (a.valid ("name:'one two'"), "Att::valid name:'one two'"); + t.ok (a.valid ("name:\"value\""), "Att::valid name:\"value\""); + t.ok (a.valid ("name:\"one two\""), "Att::valid name:\"one two\""); + t.ok (a.valid ("name:"), "Att::valid name:"); + t.ok (a.valid ("name:""), "Att::valid ""); + t.ok (a.valid ("name.one:value"), "Att::valid name.one.value"); + t.ok (a.valid ("name.one.two:value"), "Att::valid name.one.two:value"); + t.ok (a.valid ("name.:value"), "Att::valid name.:value"); + t.ok (a.valid ("name..:value"), "Att::valid name..:value"); Att a1 ("name", "value"); t.is (a1.name (), "name", "Att::Att (name, value), Att.name");