- 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.
This commit is contained in:
Paul Beckingham 2011-02-04 12:14:52 -05:00
parent 783a326b11
commit 036d77e08f
4 changed files with 39 additions and 23 deletions

View file

@ -205,14 +205,18 @@ bool Att::valid (const std::string& input) const
if (!n.getUntilOneOf (".:", ignored)) if (!n.getUntilOneOf (".:", ignored))
return false; return false;
if (n.skip (':') && if (n.skip (':'))
(n.getQuoted ('"', ignored) || {
n.getUntil (' ', ignored) || if (input.find ('@') <= n.cursor () ||
n.getUntilEOS (ignored) || input.find ('/') <= n.cursor ())
n.depleted ())) return false;
return true;
return false; if (n.getQuoted ('"', ignored) ||
n.getUntil (' ', ignored) ||
n.getUntilEOS (ignored) ||
n.depleted ())
return true;
}
} }
return false; return false;

View file

@ -552,6 +552,12 @@ char Nibbler::next ()
return '\0'; return '\0';
} }
////////////////////////////////////////////////////////////////////////////////
std::string::size_type Nibbler::cursor ()
{
return mCursor;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Peeks ahead - does not move cursor. // Peeks ahead - does not move cursor.
std::string Nibbler::next (const int quantity) std::string Nibbler::next (const int quantity)

View file

@ -69,6 +69,8 @@ public:
char next (); char next ();
std::string next (const int quantity); std::string next (const int quantity);
std::string::size_type cursor ();
void save (); void save ();
void restore (); void restore ();

View file

@ -34,25 +34,29 @@ Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv) int main (int argc, char** argv)
{ {
UnitTest t (117); UnitTest t (121);
Att a; Att a;
t.notok (a.valid ("name"), "Att::valid name -> fail"); t.notok (a.valid ("name"), "Att::valid name -> fail");
t.notok (a.valid (":"), "Att::valid : -> fail"); t.notok (a.valid (":"), "Att::valid : -> fail");
t.notok (a.valid (":value"), "Att::valid :value -> 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");
t.ok (a.valid ("name:value "), "Att::valid name:value\\s"); 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:'value'"), "Att::valid name:'value'");
t.ok (a.valid ("name:'one two'"), "Att::valid name:'one two'"); 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:\"value\""), "Att::valid name:\"value\"");
t.ok (a.valid ("name:\"one two\""), "Att::valid name:\"one two\""); 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 name:");
t.ok (a.valid ("name:&quot;"), "Att::valid &quot;"); t.ok (a.valid ("name:&quot;"), "Att::valid &quot;");
t.ok (a.valid ("name.one:value"), "Att::valid name.one.value"); 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.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");
Att a1 ("name", "value"); Att a1 ("name", "value");
t.is (a1.name (), "name", "Att::Att (name, value), Att.name"); t.is (a1.name (), "name", "Att::Att (name, value), Att.name");