TPtrC NextWord(TLex& aLex) { aLex.SkipSpaceAndMark(); aLex.SkipCharacters(); TPtrC word(aLex.MarkedToken()); return word; }
TPtrC NextCommand(TLex& aLex) { TPtrC command; if (SkipToNextCommand(aLex) == KErrNone) { SkipToEnd(aLex, KPartialCommandStart); aLex.Mark(); aLex.SkipCharacters(); command.Set(aLex.MarkedToken()); } else { aLex.Inc(aLex.Remainder().Length()); } return command; }
void CCommandInfoFile::ReadDetailsL(TLex& aLex, RFs& aFs, const TDesC& aFileName) { SkipToNextCommand(aLex); // Ignore everything before the first '==' command. while (!aLex.Eos()) { TLexMark mark; aLex.Mark(mark); TPtrC command(NextCommand(aLex)); if (command == KNullDesC) { // Do nothing - we're at the end of the string. } else if (command == KCmndName) { aLex.SkipSpaceAndMark(); aLex.SkipCharacters(); iName.Set(aLex.MarkedToken()); } else if (command == KCmndShortDescription) { iShortDescription.Set(TextToNextCommand(aLex)); } else if (command == KCmndLongDescription) { iLongDescription.Set(TextToNextCommand(aLex)); } else if (command == KCmndSeeAlso) { iSeeAlso.Set(TextToNextCommand(aLex)); } else if (command == KCmndCopyright) { iCopyright.Set(TextToNextCommand(aLex)); } else if (command == KCmndSmokeTest) { // Hmm no easy way to get the line number we're currently on iSmokeTestLineNumber = 1; TLex lex(aLex); lex.Inc(-aLex.Offset()); // Only way to put a TLex back to the beginning! TPtrC preceding = lex.Remainder().Left(aLex.Offset()); const TUint16* ptr = preceding.Ptr(); const TUint16* end = ptr + preceding.Length(); while (ptr != end) { if (*ptr++ == '\n') iSmokeTestLineNumber++; } // At this point iSmokeTestLineNumber points to the "==smoketest" line - add 2 to skip this line and the blank line below it iSmokeTestLineNumber += 2; iSmokeTest.Set(TextToNextCommand(aLex)); } else if (command == KCmndArgument) { ReadArgumentL(aLex, aFileName); } else if (command == KCmndOption) { ReadOptionL(aLex, aFileName); } else if (command == KCmndInclude) { if (iParent == NULL) { iProcessInclude = EFalse; TLex lineLex(LineRemainder(aLex)); TPtrC fileName(NextWord(lineLex)); TFileName2* fullFileName = new(ELeave) TFileName2(aFileName); CleanupStack::PushL(fullFileName); fullFileName->SetNameAndExtL(fileName); ReadFileL(aFs, *fullFileName); CleanupStack::PopAndDestroy(fullFileName); break; } else { // We're a sub-command. Let control return to the root to handle the include. aLex.UnGetToMark(mark); iParent->ProcessInclude(*this); break; } } else if (command == KCmndSubCommand) { if (iParent == NULL) { TLex lineLex(LineRemainder(aLex)); AddSubCommandL(lineLex, aLex, aFs, aFileName); } else { // We're a sub-command. Let control return to the root to handle the next sub-command. aLex.UnGetToMark(mark); iParent->ProcessNewChild(); break; } } else { StaticLeaveIfErr(KErrArgument, _L("Unknown command \"%S\" in \"%S\""), &command, &aFileName); } } }