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]); } }
FArgs::FArgs(int argc, FString *argv) { AppendArgs(argc, argv); }
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; }