Example #1
0
void DArgs::CollectFiles(const char *param, const char *extension)
{
	TArray<FString> work;
	DArgs *out = new DArgs;
	unsigned int i;
	size_t extlen = extension == NULL ? 0 : strlen(extension);

	// Step 1: Find suitable arguments before the first switch.
	i = 1;
	while (i < Argv.Size() && Argv[i][0] != '-' && Argv[i][0] != '+')
	{
		bool useit;

		if (extlen > 0)
		{ // Argument's extension must match.
			size_t len = Argv[i].Len();
			useit = (len >= extlen && stricmp(&Argv[i][len - extlen], extension) == 0);
		}
		else
		{ // Anything will do so long as it's before the first switch.
			useit = true;
		}
		if (useit)
		{
			work.Push(Argv[i]);
			Argv.Delete(i);
		}
		else
		{
			i++;
		}
	}

	// Step 2: Find each occurence of -param and add its arguments to work.
	while ((i = CheckParm(param, i)) > 0)
	{
		Argv.Delete(i);
		while (i < Argv.Size() && Argv[i][0] != '-' && Argv[i][0] != '+')
		{
			work.Push(Argv[i]);
			Argv.Delete(i);
		}
	}

	// Optional: Replace short path names with long path names
#ifdef _WIN32
	for (i = 0; i < work.Size(); ++i)
	{
		work[i] = I_GetLongPathName(work[i]);
	}
#endif

	// Step 3: Add work back to Argv, as long as it's non-empty.
	if (work.Size() > 0)
	{
		Argv.Push(param);
		AppendArgs(work.Size(), &work[0]);
	}
}
Example #2
0
FArgs::FArgs(int argc, FString *argv)
{
	AppendArgs(argc, argv);
}
Example #3
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;
    }