void cxxTokenChainCondense(CXXTokenChain * tc,unsigned int uFlags) { if(!tc) return; if(tc->iCount <= 1) return; CXXToken * pCondensed = cxxTokenCreate(); pCondensed->eType = CXXTokenTypeUnknown; pCondensed->iLineNumber = tc->pHead->iLineNumber; pCondensed->oFilePosition = tc->pHead->oFilePosition; while(tc->iCount > 0) { CXXToken * t = cxxTokenChainTakeFirst(tc); cxxTokenAppendToString(pCondensed->pszWord,t); if( (!(uFlags & CXXTokenChainCondenseNoTrailingSpaces)) && t->bFollowedBySpace ) vStringPut (pCondensed->pszWord, ' '); pCondensed->bFollowedBySpace = t->bFollowedBySpace; cxxTokenDestroy(t); } cxxTokenChainAppend(tc,pCondensed); }
void cxxTokenAPIDone(void) { CXXToken * t; while((t = cxxTokenChainTakeFirst(g_pTokenPool))) cxxTokenForceDestroy(t); cxxTokenChainDestroy(g_pTokenPool); }
void cxxTokenChainClear(CXXTokenChain * tc) { CXXToken * t; if(!tc) return; if(tc->iCount < 1) return; while((t = cxxTokenChainTakeFirst(tc))) cxxTokenDestroy(t); Assert(tc->iCount == 0); Assert(tc->pHead == NULL); Assert(tc->pTail == NULL); }
void cxxTokenChainTake(CXXTokenChain * tc,CXXToken * t) { if(!tc) return; if(!tc->pHead) return; /* Debug with this: CXXToken * t2 = tc->pHead; while(t2 && (t2 != t)) t2 = t2->pNext; Assert(t2); */ if(t == tc->pHead) { cxxTokenChainTakeFirst(tc); return; } if(t == tc->pTail) { cxxTokenChainTakeLast(tc); return; } // in the middle CXXToken * n = t->pNext; CXXToken * p = t->pPrev; n->pPrev = p; p->pNext = n; tc->iCount--; Assert(tc->iCount > 1); }
CXXToken * cxxTokenCreate(void) { CXXToken * t; if(g_pTokenPool->iCount > 0) { t = cxxTokenChainTakeFirst(g_pTokenPool); CXX_DEBUG_ASSERT(t->pszWord,"The string shouldn't have been destroyed"); } else { t = xMalloc(sizeof(CXXToken),CXXToken); // we almost always want a string, and since this token // is being reused..well.. we always want it t->pszWord = vStringNew(); } t->bFollowedBySpace = FALSE; t->pChain = NULL; t->pNext = NULL; t->pPrev = NULL; return t; }