bool CGenericParser2::Parse(char **dataPtr, bool cleanFirst, bool writeable) { CTextPool *topPool; #ifdef _XBOX // Parsers are temporary structures. They exist mainly at load time. extern void Z_SetNewDeleteTemporary(bool bTemp); Z_SetNewDeleteTemporary(true); #endif if (cleanFirst) { Clean(); } if (!mTextPool) { mTextPool = new CTextPool; } SetWriteable(writeable); mTopLevel.SetWriteable(writeable); topPool = mTextPool; bool ret = mTopLevel.Parse(dataPtr, &topPool); #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif return ret; }
// I only need this because GP2 can't cope with trailing whitespace (for !@#$%^'s sake!!!!)... // // (output buffer will always be just '\n' seperated, regardless of possible "\r\n" pairs) // // (remember to Z_Free() the returned char * when done with it!!!) // static char *StripTrailingWhiteSpaceOnEveryLine(char *pText) { #ifdef _XBOX Z_SetNewDeleteTemporary(true); #endif string strNewText; while (*pText) { char sOneLine[1024]; // BTO: was 16k // find end of line... // char *pThisLineEnd = pText; while (*pThisLineEnd && *pThisLineEnd != '\r' && ((pThisLineEnd-pText) < sizeof(sOneLine)-1)) { pThisLineEnd++; } int iCharsToCopy = pThisLineEnd - pText; strncpy(sOneLine, pText, iCharsToCopy); sOneLine[iCharsToCopy]='\0'; pText += iCharsToCopy; while (*pText == '\n' || *pText == '\r') pText++; // trim trailing... // sboolean bTrimmed = qfalse; do { bTrimmed = qfalse; int iStrLen = strlen(sOneLine); if (iStrLen) { if (sOneLine[iStrLen-1] == '\t' || sOneLine[iStrLen-1] == ' ') { sOneLine[iStrLen-1] = '\0'; bTrimmed = qtrue; } } } while (bTrimmed); strNewText += sOneLine; strNewText += "\n"; } char *pNewText = (char *) Z_Malloc( strlen(strNewText.c_str())+1, TAG_TEMP_WORKSPACE, qfalse); strcpy(pNewText, strNewText.c_str()); #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif return pNewText; }
static void _sendIORequest(const IORequest& req) { // Add request to queue WaitForSingleObject(s_QueueMutex, INFINITE); Z_SetNewDeleteTemporary(true); s_IORequestQueue->push_back(req); Z_SetNewDeleteTemporary(false); ReleaseMutex(s_QueueMutex); // Let IO thread know it has one more pending request ReleaseSemaphore(s_QueueLen, 1, NULL); }
int CBlockStream::ReadBlock( CBlock *get, CIcarus* icarus ) { CBlockMember *bMember; int b_id, numMembers; unsigned char flags; if (!BlockAvailable()) return false; b_id = *(int *) (m_stream + m_streamPos); m_streamPos += sizeof( b_id ); numMembers = *(int *) (m_stream + m_streamPos); m_streamPos += sizeof( numMembers ); flags = *(unsigned char*) (m_stream + m_streamPos); m_streamPos += sizeof( flags ); if (numMembers < 0) return false; get->Create( b_id ); get->SetFlags( flags ); // Stream blocks are generally temporary as they // are just used in an initial parsing phase... #ifdef _XBOX extern void Z_SetNewDeleteTemporary(bool bTemp); Z_SetNewDeleteTemporary(true); #endif while ( numMembers-- > 0) { bMember = new CBlockMember; bMember->ReadMember( &m_stream, &m_streamPos, icarus ); get->AddMember( bMember ); } #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif return true; }
static sboolean Music_ParseMusic(CGenericParser2 &Parser, MusicData_t *MusicData, CGPGroup *pgMusicFiles, LPCSTR psMusicName, LPCSTR psMusicNameKey, MusicState_e eMusicState) { sboolean bReturn = qfalse; #ifdef _XBOX Z_SetNewDeleteTemporary(true); #endif MusicFile_t MusicFile; #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif CGPGroup *pgMusicFile = pgMusicFiles->FindSubGroup(psMusicName); if (pgMusicFile) { // read subgroups... // sboolean bEntryFound = qfalse; sboolean bExitFound = qfalse; // // (read entry points first, so I can check exit points aren't too close in time) // CGPGroup *pEntryGroup = pgMusicFile->FindSubGroup(sKEY_ENTRY); if (pEntryGroup) { // read entry points... // for (CGPValue *pValue = pEntryGroup->GetPairs(); pValue; pValue = pValue->GetNext()) { LPCSTR psKey = pValue->GetName(); LPCSTR psValue = pValue->GetTopValue(); //if (!strncmp(psKey,sKEY_MARKER,strlen(sKEY_MARKER))) // for now, assume anything is a marker { MusicFile.MusicEntryTimes[psKey] = atof(psValue); bEntryFound = qtrue; // harmless to keep setting } } } for (CGPGroup *pGroup = pgMusicFile->GetSubGroups(); pGroup; pGroup = pGroup->GetNext()) { LPCSTR psGroupName = pGroup->GetName(); if (!strcmp(psGroupName,sKEY_ENTRY)) { // skip entry points, I've already read them in above // } else if (!strcmp(psGroupName,sKEY_EXIT)) { int iThisExitPointIndex = MusicFile.MusicExitPoints.size(); // must eval this first, so unaffected by push_back etc // // read this set of exit points... // MusicExitPoint_t MusicExitPoint; for (CGPValue *pValue = pGroup->GetPairs(); pValue; pValue = pValue->GetNext()) { LPCSTR psKey = pValue->GetName(); LPCSTR psValue = pValue->GetTopValue(); if (!strcmp(psKey,sKEY_NEXTFILE)) { MusicExitPoint.sNextFile = psValue; bExitFound = qtrue; // harmless to keep setting } else if (!strcmp(psKey,sKEY_NEXTMARK)) { MusicExitPoint.sNextMark = psValue; } else if (!strncmp(psKey,sKEY_TIME,strlen(sKEY_TIME))) { MusicExitTime_t MusicExitTime; MusicExitTime.fTime = atof(psValue); MusicExitTime.iExitPoint= iThisExitPointIndex; // new check, don't keep this this exit point if it's within 1.5 seconds either way of an entry point... // sboolean bTooCloseToEntryPoint = qfalse; for (MusicEntryTimes_t::iterator itEntryTimes = MusicFile.MusicEntryTimes.begin(); itEntryTimes != MusicFile.MusicEntryTimes.end(); ++itEntryTimes) { float fThisEntryTime = (*itEntryTimes).second; if (Q_fabs(fThisEntryTime - MusicExitTime.fTime) < 1.5f) { // bTooCloseToEntryPoint = qtrue; // not sure about this, ignore for now break; } } if (!bTooCloseToEntryPoint) { #ifdef _XBOX Z_SetNewDeleteTemporary(true); #endif MusicFile.MusicExitTimes.push_back(MusicExitTime); #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif } } } #ifdef _XBOX Z_SetNewDeleteTemporary(true); #endif MusicFile.MusicExitPoints.push_back(MusicExitPoint); #ifdef _XBOX Z_SetNewDeleteTemporary(false); #endif int iNumExitPoints = MusicFile.MusicExitPoints.size(); // error checking... // switch (eMusicState) { case eBGRNDTRACK_EXPLORE: if (iNumExitPoints > iMAX_EXPLORE_TRANSITIONS) { MUSIC_PARSE_ERROR( va("\"%s\" has > %d %s transitions defined!\n",psMusicName,iMAX_EXPLORE_TRANSITIONS,psMusicNameKey) ); return qfalse; } break; case eBGRNDTRACK_ACTION: if (iNumExitPoints > iMAX_ACTION_TRANSITIONS) { MUSIC_PARSE_ERROR( va("\"%s\" has > %d %s transitions defined!\n",psMusicName,iMAX_ACTION_TRANSITIONS,psMusicNameKey) ); return qfalse; } break; case eBGRNDTRACK_BOSS: case eBGRNDTRACK_DEATH: MUSIC_PARSE_ERROR( va("\"%s\" has %s transitions defined, this is not allowed!\n",psMusicName,psMusicNameKey) ); break; } } } // for now, assume everything was ok unless some obvious things are missing... // bReturn = qtrue; if (eMusicState != eBGRNDTRACK_BOSS && eMusicState != eBGRNDTRACK_DEATH) // boss & death pieces can omit entry/exit stuff { if (!bEntryFound) { MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\" in group \"%s\"\n",sKEY_ENTRY,psMusicName)); bReturn = qfalse; } if (!bExitFound) { MUSIC_PARSE_ERROR(va("Unable to find subgroup \"%s\" in group \"%s\"\n",sKEY_EXIT,psMusicName)); bReturn = qfalse; } } } else { MUSIC_PARSE_ERROR(va("Unable to find musicfiles entry \"%s\"\n",psMusicName)); } if (bReturn) { MusicFile.sFileNameBase = psMusicName; (*MusicData)[ psMusicNameKey ] = MusicFile; } return bReturn; }