int kGUIText::GetLineNum(unsigned int charindex) { int startindex,endindex,midindex; unsigned int endchar; kGUIInputLineInfo *lbptr; if(m_llnum<2) return(0); else if(charindex>=GetLen()) return(m_llnum-1); /* binary search */ startindex=0; endindex=m_llnum-1; /* make sure split list is accurate! */ lbptr=GetLineInfo(endindex); assert(lbptr->endindex==(GetLen()-1) || lbptr->endindex==(GetLen()),"Split list is NOT up to date!"); do { midindex=(startindex+endindex)>>1; lbptr=GetLineInfo(midindex); endchar=lbptr->endindex; if(lbptr->hardbreak==false) --endchar; if(charindex<lbptr->startindex) { if(endindex==midindex) --endindex; else endindex=midindex; } else if(charindex>endchar) { if(startindex==midindex) ++startindex; else startindex=midindex; } else return(midindex); }while(1); }
int kGUIText::GetLineNumPix(int ypos) { int startindex,endindex,midindex; kGUIInputLineInfo *li; if(m_llnum<2) return(0); if(ypos<0) return(0); if(ypos>=(int)m_lltotalheight) return(m_llnum-1); /* binary search */ startindex=0; endindex=m_llnum-1; do { midindex=(startindex+endindex)>>1; li=GetLineInfo(midindex); if(ypos<li->ty) { if(endindex==midindex) --endindex; else endindex=midindex; } else if(ypos>li->by) { if(startindex==midindex) ++startindex; else startindex=midindex; } else return(midindex); }while(1); }
HRESULT StackFrame::GetDocumentContext( IDebugDocumentContext2** ppCxt ) { if ( ppCxt == NULL ) return E_INVALIDARG; HRESULT hr = S_OK; RefPtr<SingleDocumentContext> docContext; LineInfo line; hr = MakeCComObject( docContext ); if ( FAILED( hr ) ) return hr; hr = GetLineInfo( line ); if ( FAILED( hr ) ) return hr; hr = docContext->Init( line.Filename, line.LineBegin, line.LineEnd, line.LangName, line.LangGuid ); if ( FAILED( hr ) ) return hr; return docContext->QueryInterface( __uuidof( IDebugDocumentContext2 ), (void**) ppCxt ); }
HRESULT StackFrame::AppendFunctionNameWithSymbols( FRAMEINFO_FLAGS flags, UINT radix, MagoST::ISession* session, MagoST::ISymbolInfo* symInfo, CString& fullName ) { _ASSERT( session != NULL ); _ASSERT( symInfo != NULL ); HRESULT hr = S_OK; CComBSTR funcNameBstr; SymString pstrName; if ( !symInfo->GetName( pstrName ) ) return E_NOT_FOUND; hr = Utf8To16( pstrName.GetName(), pstrName.GetLength(), funcNameBstr.m_str ); if ( FAILED( hr ) ) return hr; fullName.Append( funcNameBstr ); fullName.AppendChar( L'(' ); if ( (flags & FIF_FUNCNAME_ARGS_ALL) != 0 ) { AppendArgs( flags, radix, session, symInfo, fullName ); } fullName.AppendChar( L')' ); bool hasLineInfo = false; Address64 baseAddr = 0; if ( (flags & FIF_FUNCNAME_LINES) != 0 ) { LineInfo line; if ( SUCCEEDED( GetLineInfo( line ) ) ) { hasLineInfo = true; baseAddr = line.Address; // lines are 1-based to user, but 0-based from symbol store DWORD lineNumber = line.LineBegin.dwLine + 1; const wchar_t* lineStr = GetString( IDS_LINE ); fullName.AppendFormat( L" %s %u", lineStr, lineNumber ); } } if ( !hasLineInfo ) { uint16_t sec = 0; uint32_t offset = 0; symInfo->GetAddressSegment( sec ); symInfo->GetAddressOffset( offset ); baseAddr = (Address64) session->GetVAFromSecOffset( sec, offset ); } if ( ((flags & FIF_FUNCNAME_OFFSET) != 0) && (mPC != baseAddr) ) { const wchar_t* bytesStr = GetString( IDS_BYTES ); fullName.AppendFormat( L" + 0x%x %s", (uint32_t) (mPC - baseAddr), bytesStr ); } return S_OK; }