- 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) || {
if (input.find ('@') <= n.cursor () ||
input.find ('/') <= n.cursor ())
return false;
if (n.getQuoted ('"', ignored) ||
n.getUntil (' ', ignored) || n.getUntil (' ', ignored) ||
n.getUntilEOS (ignored) || n.getUntilEOS (ignored) ||
n.depleted ())) n.depleted ())
return true; return true;
}
return false;
} }
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,12 +34,16 @@ 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");