示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
    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 );
    }
示例#4
0
    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;
    }