ArgSet::eInitArgsStat ArgSet::InitArgs (TextStream & text, int numExpected) { // we'll re-init even if we've been init'd already _args.Clear (); if (! numExpected) { // If no args expected, don't try to consume "()" return kInitNoError; } if (! text.Expect ("(")) return kInitNoStartParen; while (numExpected--) { ArgDef thisArg; ArgDef::eInitStat stat; if (! text.GetLength()) return kInitArgsTooFew; // // why did this line cause Purify to // think there was a memory leak? // // if (text.Expect(")")) TextStream closeParen (")"); if (text.Expect(closeParen)) { return kInitArgsTooFew; } stat = thisArg.Init (text); switch (stat) { case ArgDef::kInitBadEscape: return kInitNoEndParen; case ArgDef::kInitNotTerminated: return kInitNoEndParen; default: // unknown error assert (0); break; case ArgDef::kInitNoError: _args.Append (thisArg); break; } } if (! text.Expect(")")) { return kInitArgsTooMany; } return kInitNoError; }
void ArgDef::Test () { // // Init(), GetText() // ArgDef ad; TextStream ts; TextStream input; eInitStat stat; assert (0 == ad._rep.GetLength()); input = "something"; stat = ad.Init (input); assert (kInitNotTerminated == stat); input = "proper)"; stat = ad.Init (input); assert (kInitNoError == stat); ts = ad.GetText (); assert (0 != ts.GetLength()); assert (ts.Expect ("proper")); assert (0 == ts.GetLength()); assert (input.Expect (")")); assert (0 == input.GetLength()); input = "(paren in arg)"; stat = ad.Init (input); assert (kInitNoError == stat); ts = ad.GetText (); assert (0 != ts.GetLength()); assert (ts.Expect ("(paren in arg")); assert (0 == ts.GetLength()); assert (input.Expect (")")); assert (0 == input.GetLength()); input = "middle arg,yup)"; stat = ad.Init (input); assert (kInitNoError == stat); ts = ad.GetText (); assert (0 != ts.GetLength()); assert (ts.Expect ("middle arg")); assert (0 == ts.GetLength()); assert (input.Expect ("yup)")); assert (0 == input.GetLength()); input = "comma in\\, arg, here"; stat = ad.Init (input); assert (kInitNoError == stat); ts = ad.GetText (); assert (0 != ts.GetLength()); assert (ts.Expect ("comma in, arg")); assert (0 == ts.GetLength()); assert (input.Expect (" here")); assert (0 == input.GetLength()); input = " \t\t\n\t White\tspace in here.,"; stat = ad.Init (input); assert (kInitNoError == stat); ts = ad.GetText (); assert (0 != ts.GetLength()); assert (ts.Expect ("White\tspace in here.")); assert (0 == ts.GetLength()); assert (0 == input.GetLength()); input = "bad escape\\"; stat = ad.Init (input); assert (kInitBadEscape == stat); }