CToken* theToken2=(CToken*)mSafeNames.Pop();
mSafeNames.Pop();
  void scan(CCPPTokenizer& aTokenizer,ostream& anOutput){    int     theMax=aTokenizer.getCount();    int     theIDCount=mNames.GetSize();    int     theSafeIDCount=mSafeNames.GetSize();    CToken* theMatch=0;    while(mIndex<theMax){      CToken*   theToken=aTokenizer.getTokenAt(mIndex);      int     theType=theToken->getTokenType();      nsCString& theString=theToken->getStringValue();      int     theNLCount=theString.CountChar('\n');      switch(theType){        case eToken_operator:          {            PRUnichar   theChar=theString[0];            switch(theChar){              case '{':                mIndex++;                scan(aTokenizer,anOutput);                break;              case '}':                //before returning, let's remove the new identifiers...                while(mNames.GetSize()>theIDCount){                  CToken* theToken2=(CToken*)mNames.Pop();                }                while(mSafeNames.GetSize()>theSafeIDCount){                  CToken* theToken2=(CToken*)mSafeNames.Pop();                }                return;              default:                break;            }          }          break;        case eToken_comment:        case eToken_newline:        case eToken_whitespace:          mLineNumber+=theString.CountChar('\n');          break;            //If it's an ID, then we're looking for 3 patterns:            //  1. ID* ID...;             //  2. *ID=ID;            //  3. ID->XXX;        case eToken_identifier:          {            PRUnichar theOpChar=0;            if(theToken=findPtrDecl(aTokenizer,mIndex,theOpChar,true)) {              //we found ID* ID; (or) ID* ID=...;              mNames.Push(theToken);              mIndex+=2;              skipSemi(aTokenizer);            }            else if(0==theString.Compare("if",true,2)) {              CToken* theSafeID=findSafeIDInIfStatement(aTokenizer,mNames);              if(theSafeID) {                mSafeNames.Push(theSafeID);                theSafeIDCount++;              }            }            else {              CToken* theMatch=matchID(mNames,theString);              if(theMatch){                if((hasUnconditionedDeref(theString,aTokenizer,mIndex)) ||                    (hasSimpleDeref(theString,aTokenizer,mIndex))){                  CToken* theSafeID=matchID(mSafeNames,theString);                  if(theSafeID) {                    nsCString& s1=theSafeID->getStringValue();                    if(s1.Equals(theString))                      break;                  }                  //dump the name out in LXR format                  OutputMozillaFilename(anOutput);                  nsCAutoString theCStr(theString);                  anOutput << "   Deref-error: \"" << (const char*)theCStr << "\"" << endl;                  mErrCount++;                }              }            }          }          break;        default:          break;      }      mIndex++;    }  }