bool CMarkupSTL::OutOfElem() { // Go to parent element if ( m_iPosParent ) { x_SetPos( m_aPos[m_iPosParent].iElemParent, m_iPosParent, m_iPos ); return true; } return false; }
bool CMarkupSTL::RemoveChildElem() { // Remove current child position element if ( m_iPosChild ) { int iPosChild = x_RemoveElem( m_iPosChild ); x_SetPos( m_iPosParent, m_iPos, iPosChild ); return true; } return false; }
bool CMarkupSTL::RemoveElem() { // Remove current main position element if ( m_iPos && m_nNodeType == MNT_ELEMENT ) { int iPos = x_RemoveElem( m_iPos ); x_SetPos( m_iPosParent, iPos, 0 ); return true; } return false; }
void CSeqVector_CI::SetRandomizeAmbiguities(CRef<INcbi2naRandomizer> randomizer) { if ( randomizer != m_Randomizer ) { TSeqPos pos = GetPos(); m_Randomizer = randomizer; x_ResetBackup(); if ( x_CacheSize() ) { x_ResetCache(); if ( m_Seg ) { x_SetPos(pos); } } } }
void CSeqVector_CI::SetCoding(TCoding coding) { if ( m_Coding != coding ) { TSeqPos pos = GetPos(); m_Coding = coding; x_ResetBackup(); if ( x_CacheSize() ) { x_ResetCache(); if ( m_Seg ) { x_SetPos(pos); } } } }
bool CMarkupSTL::RestorePos( const char * szPosName ) { // Restore element position if found in saved position map if (!szPosName) return false; std::map<CStdString, SavedPos>::iterator iter=m_mapSavedPos.find( szPosName ); if ( iter!=m_mapSavedPos.end() ) { x_SetPos( iter->second.iPosParent, iter->second.iPos, iter->second.iPosChild ); return true; } return false; }
bool CMarkupSTL::FindElem( const char * szName ) { // Change current position only if found // if ( m_aPos.size() ) { int iPos = x_FindElem( m_iPosParent, m_iPos, szName ); if ( iPos ) { // Assign new position x_SetPos( m_aPos[iPos].iElemParent, iPos, 0 ); return true; } } return false; }
bool CMarkupSTL::IntoElem() { // If there is no child position and IntoElem is called it will succeed in release 6.3 // (A subsequent call to FindElem will find the first element) // The following short-hand behavior was never part of EDOM and was misleading // It would find a child element if there was no current child element position and go into it // It is removed in release 6.3, this change is NOT backwards compatible! // if ( ! m_iPosChild ) // FindChildElem(); if ( m_iPos && m_nNodeType == MNT_ELEMENT ) { x_SetPos( m_iPos, m_iPosChild, 0 ); return true; } return false; }
void CSeqVector_CI::SetStrand(ENa_strand strand) { if ( IsReverse(m_Strand) == IsReverse(strand) ) { m_Strand = strand; return; } TSeqPos pos = GetPos(); m_Strand = strand; x_ResetBackup(); if ( x_CacheSize() ) { x_ResetCache(); if ( m_Seg ) { m_Seg = CSeqMap_CI(); x_SetPos(pos); } } }
bool CMarkupSTL::FindChildElem( const char * szName ) { // Change current child position only if found // // Shorthand: call this with no current main position // means find child under root element if ( ! m_iPos ) FindElem(); int iPosChild = x_FindElem( m_iPos, m_iPosChild, szName ); if ( iPosChild ) { // Assign new position int iPos = m_aPos[iPosChild].iElemParent; x_SetPos( m_aPos[iPos].iElemParent, iPos, iPosChild ); return true; } return false; }
CSeqVector_CI::CSeqVector_CI(const CSeqVector& seq_vector, TSeqPos pos) : m_Scope(seq_vector.m_Scope), m_SeqMap(seq_vector.m_SeqMap), m_TSE(seq_vector.m_TSE), m_Strand(seq_vector.m_Strand), m_Coding(seq_vector.m_Coding), m_CaseConversion(eCaseConversion_none), m_Cache(0), m_CachePos(0), m_CacheData(), m_CacheEnd(0), m_BackupPos(0), m_BackupData(), m_BackupEnd(0), m_Randomizer(seq_vector.m_Randomizer), m_ScannedStart(0), m_ScannedEnd(0) { x_SetPos(pos); }
bool CMarkupSTL::x_AddSubDoc( const char * szSubDoc, bool bInsert, bool bAddChild ) { // Add subdocument, parse, and modify positions of affected elements // int nOffset = 0, iPosParent, iPosBefore; if ( bAddChild ) { // Add a subdocument under main position, after current child position if ( ! m_iPos ) return false; iPosParent = m_iPos; iPosBefore = m_iPosChild; } else { iPosParent = m_iPosParent; iPosBefore = m_iPos; } int nFlags = bInsert?1:0; x_LocateNew( iPosParent, iPosBefore, nOffset, 0, nFlags ); bool bEmptyParent = m_aPos[iPosParent].IsEmptyElement(); if ( bEmptyParent ) nOffset += 2; // include CRLF // if iPosBefore is NULL, insert as first element under parent int nParentEndLBeforeAdd = m_aPos[iPosParent].nEndL; int iPosFreeBeforeAdd = m_iPosFree; // Skip version tag or DTD at start of subdocument TokenPos token( szSubDoc ); int nNodeType = x_ParseNode( token ); while ( nNodeType && nNodeType != MNT_ELEMENT ) { token.szDoc = &szSubDoc[token.nNext]; token.nNext = 0; nNodeType = x_ParseNode( token ); } CStdString csInsert = token.szDoc; // Insert subdocument m_aPos[iPosParent].nEndL = nOffset; int nReplace = 0, nLeft = nOffset; CStdString csParentTagName; if ( bEmptyParent ) { csParentTagName = x_GetTagName(iPosParent); CStdString csFormat; csFormat = _T(">\r\n"); csFormat += csInsert; csFormat += _T("</"); csFormat += csParentTagName; csInsert = csFormat; m_aPos[iPosParent].nEndL = m_aPos[iPosParent].nStartR + 2; nLeft = m_aPos[iPosParent].nStartR - 1; nReplace = 1; } x_DocChange( nLeft, nReplace, csInsert ); // Parse subdocument int iPos = x_ParseElem(iPosParent); m_aPos[iPosParent].nEndL = nParentEndLBeforeAdd; if ( iPos <= 0 ) { // Abort because not well-formed CStdString csRevert = bEmptyParent?_T("/"):_T(""); x_DocChange( nLeft, csInsert.GetLength(), csRevert ); m_iPosFree = iPosFreeBeforeAdd; return false; } else { // Link in parent and siblings m_aPos[iPos].iElemParent = iPosParent; if ( iPosBefore ) { m_aPos[iPos].iElemNext = m_aPos[iPosBefore].iElemNext; m_aPos[iPosBefore].iElemNext = iPos; } else { m_aPos[iPos].iElemNext = m_aPos[iPosParent].iElemChild; m_aPos[iPosParent].iElemChild = iPos; } // Make empty parent pre-adjustment if ( bEmptyParent ) { m_aPos[iPosParent].nStartR -= 1; m_aPos[iPosParent].nEndL -= (csParentTagName.GetLength() + 1); } // Adjust, but don't adjust children of iPos (bAfterPos=true) x_Adjust( iPos, csInsert.GetLength() - nReplace, true ); } // Set position to top element of subdocument if ( bAddChild ) x_SetPos( m_iPosParent, iPosParent, iPos ); else // Main x_SetPos( m_iPosParent, iPos, 0 ); return true; }
bool CMarkupSTL::x_AddElem( const char * szName, const char * szValue, bool bInsert, bool bAddChild ) { if ( bAddChild ) { // Adding a child element under main position if ( ! m_iPos ) return false; } else if ( m_iPosParent == 0 ) { // Adding root element if ( IsWellFormed() ) return false; // Locate after any version and DTD m_aPos[0].nEndL = m_csDoc.GetLength(); } // Locate where to add element relative to current node int iPosParent, iPosBefore, nOffset = 0, nLength = 0; if ( bAddChild ) { iPosParent = m_iPos; iPosBefore = m_iPosChild; } else { iPosParent = m_iPosParent; iPosBefore = m_iPos; } int nFlags = bInsert?1:0; x_LocateNew( iPosParent, iPosBefore, nOffset, nLength, nFlags ); bool bEmptyParent = m_aPos[iPosParent].IsEmptyElement(); if ( bEmptyParent ) nOffset += 2; // include CRLF // Create element and modify positions of affected elements // If no szValue is specified, an empty element is created // i.e. either <NAME>value</NAME> or <NAME/> // int iPos = x_GetFreePos(); m_aPos[iPos].nStartL = nOffset; // Set links m_aPos[iPos].iElemParent = iPosParent; m_aPos[iPos].iElemChild = 0; m_aPos[iPos].iElemNext = 0; if ( iPosBefore ) { // Link in after iPosBefore m_aPos[iPos].iElemNext = m_aPos[iPosBefore].iElemNext; m_aPos[iPosBefore].iElemNext = iPos; } else { // First child m_aPos[iPos].iElemNext = m_aPos[iPosParent].iElemChild; m_aPos[iPosParent].iElemChild = iPos; } // Create string for insert CStdString csInsert; int nLenName = _tcslen(szName); int nLenValue = szValue? _tcslen(szValue) : 0; if ( ! nLenValue ) { // <NAME/> empty element csInsert = _T("<"); csInsert += szName; csInsert += _T("/>\r\n"); m_aPos[iPos].nStartR = m_aPos[iPos].nStartL + nLenName + 2; m_aPos[iPos].nEndL = m_aPos[iPos].nStartR - 1; m_aPos[iPos].nEndR = m_aPos[iPos].nEndL + 1; } else { // <NAME>value</NAME> CStdString csValue = x_TextToDoc( szValue ); nLenValue = csValue.GetLength(); csInsert = _T("<"); csInsert += szName; csInsert += _T(">"); csInsert += csValue; csInsert += _T("</"); csInsert += szName; csInsert += _T(">\r\n"); m_aPos[iPos].nStartR = m_aPos[iPos].nStartL + nLenName + 1; m_aPos[iPos].nEndL = m_aPos[iPos].nStartR + nLenValue + 1; m_aPos[iPos].nEndR = m_aPos[iPos].nEndL + nLenName + 2; } // Insert int nReplace = 0, nLeft = m_aPos[iPos].nStartL; if ( bEmptyParent ) { CStdString csParentTagName = x_GetTagName(iPosParent); CStdString csFormat; csFormat = _T(">\r\n"); csFormat += csInsert; csFormat += _T("</"); csFormat += csParentTagName; csInsert = csFormat; nLeft -= 3; nReplace = 1; // x_Adjust is going to update all affected indexes by one amount // This will satisfy all except the empty parent // Here we pre-adjust for the empty parent // The empty tag slash is removed m_aPos[iPosParent].nStartR -= 1; // For the newly created end tag, see the following example: // <A/> (len 4) becomes <A><B/></A> (len 11) // In x_Adjust everything will be adjusted 11 - 4 = 7 // But the nEndL of element A should only be adjusted 5 m_aPos[iPosParent].nEndL -= (csParentTagName.GetLength() + 1); } x_DocChange( nLeft, nReplace, csInsert ); x_Adjust( iPos, csInsert.GetLength() - nReplace ); if ( bAddChild ) x_SetPos( m_iPosParent, iPosParent, iPos ); else x_SetPos( iPosParent, iPos, 0 ); return true; }