void nobMilitary::Capture(const unsigned char new_owner) { RTTR_Assert(IsCaptured()); captured_not_built = true; mAutoTrain = false; mAutoTrainVirtual = false; // Goldmünzen in der Inventur vom alten Spieler abziehen und dem neuen hinzufügen gwg->GetPlayer(player).DecreaseInventoryWare(GD_COINS, coins); gwg->GetPlayer(new_owner).IncreaseInventoryWare(GD_COINS, coins); // Soldaten, die auf Mission sind, Bescheid sagen for(std::list<nofActiveSoldier*>::iterator it = troops_on_mission.begin(); it != troops_on_mission.end(); ++it) (*it)->HomeDestroyed(); // Bestellungen die hierher unterwegs sind canceln CancelOrders(); // Aggressiv-Verteidigenden Soldaten Bescheid sagen, dass sie nach Hause gehen können for(std::list<nofAggressiveDefender*>::iterator it = aggressive_defenders.begin(); it != aggressive_defenders.end(); ++it) (*it)->AttackedGoalDestroyed(); troops_on_mission.clear(); aggressive_defenders.clear(); // In der Wirtschaftsverwaltung dieses Gebäude jetzt zum neuen Spieler zählen und beim alten raushauen gwg->GetPlayer(player).RemoveMilitaryBuilding(this); gwg->GetPlayer(new_owner).AddMilitaryBuilding(this); // Alten Besitzer merken unsigned char old_player = player; // neuer Spieler player = new_owner; // Flagge davor auch übernehmen GetFlag()->Capture(new_owner); // Territorium neu berechnen gwg->RecalcTerritory(*this, false, false); // Sichtbarkeiten berechnen für alten Spieler gwg->RecalcVisibilitiesAroundPoint(pos, GetMilitaryRadius() + VISUALRANGE_MILITARY + 1, old_player, NULL); // Grenzflagge entsprechend neu setzen von den Feinden LookForEnemyBuildings(); // und von den Verbündeten (da ja ein Feindgebäude weg ist)! sortedMilitaryBlds buildings = gwg->LookForMilitaryBuildings(pos, 4); for(sortedMilitaryBlds::iterator it = buildings.begin(); it != buildings.end(); ++it) { // verbündetes Gebäude? if(gwg->GetPlayer((*it)->GetPlayer()).IsPlayerAttackable(old_player) && (*it)->GetBuildingType() >= BLD_BARRACKS && (*it)->GetBuildingType() <= BLD_FORTRESS) // Grenzflaggen von dem neu berechnen static_cast<nobMilitary*>(*it)->LookForEnemyBuildings(); } // ehemalige Leute dieses Gebäudes nach Hause schicken, die ggf. grad auf dem Weg rein/raus waren MapPoint coords[2] = {pos, MapPoint(gwg->GetNeighbour(pos, 4))}; for(unsigned short i = 0; i < 2; ++i) { const std::list<noBase*>& figures = gwg->GetFigures(coords[i]); for(std::list<noBase*>::const_iterator it = figures.begin(); it != figures.end(); ++it) { if((*it)->GetType() == NOP_FIGURE) { if(static_cast<noFigure*>(*it)->GetCurrentRoad() == routes[4] && static_cast<noFigure*>(*it)->GetPlayer() != new_owner) { static_cast<noFigure*>(*it)->Abrogate(); static_cast<noFigure*>(*it)->StartWandering(); } } } } // Send all allied aggressors home (we own the building now!) for(std::list<nofAttacker*>::iterator it = aggressors.begin(); it != aggressors.end();) { nofAttacker* attacker = *it; // dont remove attackers owned by players not allied with the new owner! unsigned char attPlayer = attacker->GetPlayer(); if(attPlayer != player && !gwg->GetPlayer(attPlayer).IsPlayerAttackable(player)) { it = aggressors.erase(it); attacker->CapturedBuildingFull(); }else ++it; } // Fanfarensound abspieln, falls das Militärgebäude im Sichtbereich ist und unseres ist gwg->MilitaryBuildingCaptured(pos, player); // Post verschicken, an den alten Besitzer und an den neuen Besitzer SendPostMessage(old_player, new PostMsgWithBuilding(GetEvMgr().GetCurrentGF(), _("Military building lost"), PMC_MILITARY, *this)); SendPostMessage(player, new PostMsgWithBuilding(GetEvMgr().GetCurrentGF(), _("Military building captured"), PMC_MILITARY, *this)); // ggf. Fenster schließen vom alten Spieler gwg->ImportantObjectDestroyed(pos); gwg->GetNotifications().publish(BuildingNote(BuildingNote::Captured, player, pos, type_)); gwg->GetNotifications().publish(BuildingNote(BuildingNote::Lost, old_player, pos, type_)); }
String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname) { String *nname = 0; String *result = 0; String *name = NewString(cname); Hash *wrn = 0; String *rdecl = 0; String *rname = 0; /* very specific hack for template constructors/destructors */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: looking for %s %s %s %s\n", prefix, name, decl, oldname); #endif if (name && n && SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = NewStringEmpty(); String *nlast = NewStringEmpty(); String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); #ifdef SWIG_DEBUG Printf(stdout, "SWIG_name_make: use new name %s %s : %s %s\n", name, decl, rname, rdecl); #endif decl = rdecl; Delete(name); name = rname; } } if (rename_hash || rename_list || namewarn_hash || namewarn_list) { Hash *rn = Swig_name_object_get(Swig_name_rename_hash(), prefix, name, decl); if (!rn || !Swig_name_match_nameobj(rn, n)) { rn = Swig_name_nameobj_lget(Swig_name_rename_list(), n, prefix, name, decl); if (rn) { String *sfmt = Getattr(rn, "sourcefmt"); int fullname = GetFlag(rn, "fullname"); if (fullname && prefix) { String *sname = NewStringf("%s::%s", prefix, name); Delete(name); name = sname; prefix = 0; } if (sfmt) { String *sname = NewStringf(sfmt, name); Delete(name); name = sname; } } } if (rn) { String *newname = Getattr(rn, "name"); int fullname = GetFlag(rn, "fullname"); result = apply_rename(newname, fullname, prefix, name); } if (result && !Equal(result, name)) { /* operators in C++ allow aliases, we look for them */ char *cresult = Char(result); if (cresult && (strncmp(cresult, "operator ", 9) == 0)) { String *nresult = Swig_name_make(n, prefix, result, decl, oldname); if (!Equal(nresult, result)) { Delete(result); result = nresult; } else { Delete(nresult); } } } nname = result ? result : name; wrn = Swig_name_namewarn_get(n, prefix, nname, decl); if (wrn) { String *rename = Getattr(wrn, "rename"); if (rename) { String *msg = Getattr(wrn, "name"); int fullname = GetFlag(wrn, "fullname"); if (result) Delete(result); result = apply_rename(rename, fullname, prefix, name); if ((msg) && (Len(msg))) { if (!Getmeta(nname, "already_warned")) { if (n) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", msg); SWIG_WARN_NODE_END(n); } else { Swig_warning(0, Getfile(name), Getline(name), "%s\n", msg); } Setmeta(nname, "already_warned", "1"); } } } } } if (!result || !Len(result)) { if (result) Delete(result); if (oldname) { result = NewString(oldname); } else { result = NewString(cname); } } Delete(name); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: result '%s' '%s'\n", cname, result); #endif return result; }
UINT COXFileChanger::Run() // --- In : // --- Out : // --- Returns : occurences of found match or replacement // --- Effect : perform search/replace { int M = PtrToInt(m_pSearch->GetSize()); // ... search text/binary length int M_1 = M - 1; // ... array max subscript int MM_1 = M + M_1; // ... i shift value when found int n = 0; // ... actual bytes read from the file at one time int i = 0; // ... scanning position pointer of file buffer int j = 0; // ... scanning position pointer of search text/binary int w = 0; // ... write position pointer in the loaded file buffer int t = 0; // ... temp value int skip[255]; // ... skip array for each byte value LONG lPos0 = 0; // ... file position of the current buffer[0] LONG nCurInPos = 0; // ... loading position of the input file LONG nInPos = 0; // ... match found position of the input file LONG nCurOutPos = 0; // ... writing position of the output file LONG nOutPos = 0; // ... replace text/binary position of the output file LONG nChPos = 0; // ... position of prev/next char for whole word match LONG nChPosMax = 0; // ... maximum file position of prev/next char for whole word match UINT nResult = 0; // ... match occurence BYTE* pBuffer = NULL; // ... file buffer BOOL bEOF = FALSE; // ... end of file BOOL bContinue = TRUE; // ... default bContinue value BOOL bReplace = GetFlag(m_nFlagReplace); // ... Replace() (TRUE) or Search() (FALSE) BOOL bText = GetFlag(m_nFlagText); // ... whether text search BOOL bMatchCase = (!bText || GetFlag(m_nFlagMatchCase)); // ... whether case-insensitive BOOL bWholeWord = (bText && GetFlag(m_nFlagWholeWord)); // ... whether whole word char ch = '\0'; // ... prev/next char for whole word match CString sSafeStack; // Increases the stack size if (M == 0) { TRACE0("COXFileChanger::Run(): aborted: zero length search text/binary encountered.\r\n"); return 0; } if (m_nBufferSize < M) { TRACE0("COXFileChanger::Run(): aborted: length of search text/binary exceeds upper limit.\r\n"); return 0; } // Initialize skip array for (j = 0; j < 256; j++) skip[j] = M; for (j = 0, t = M; j < M; j++) skip[m_pSearch->GetAt(j)] = --t; if (!bMatchCase) for (j = 0, t = M; j < M; j++) skip[m_pSearchOppositeCase->GetAt(j)] = --t; try { // Alllocate the buffer pBuffer = new BYTE[m_nBufferSize]; OpenFiles(); nChPosMax = (LONG) m_pFileIn->GetLength() - 1; while (!bEOF && (n = m_pFileIn->Read(pBuffer, m_nBufferSize)) > 0) { bEOF = (n < m_nBufferSize); if (!bContinue && bReplace) { // Cycle until all remaining contents are copied m_pFileOut->Write(pBuffer, n); continue; } if (!bContinue || n < M) break; i = - M; w = 0; while (bContinue) { // search one occurence for (i += MM_1, j = M_1; 0 <= j && i < n; i--, j--) { while (pBuffer[i] != m_pSearch->GetAt(j) && (bMatchCase || pBuffer[i] != m_pSearchOppositeCase->GetAt(j))) { t = skip[pBuffer[i]]; i += __max(M - j, t); if (n <= i) { i++; break; } j = M_1; } } // out of buffer boundary if (n <= i) { if (bReplace) m_pFileOut->Write(pBuffer + w, (bEOF ? n : i - M_1) - w); if (!bEOF) lPos0 = (LONG) m_pFileIn->Seek(i - M_1 - n, CFile::current); break; } i++; nCurInPos = (LONG) m_pFileIn->GetPosition(); nInPos = lPos0 + i; // test wholeword match if (bWholeWord) { nChPos = i - 1; for (t = 0; t < 2; t++) { // look in buffer first if (0 <= nChPos && nChPos < n) ch = *(pBuffer + nChPos); else { // look in the file nChPos += lPos0; if (0 <= nChPos && nChPos <= nChPosMax) { m_pFileIn->Seek(nChPos, CFile::begin); m_pFileIn->Read(&ch, 1); } else // beginning or the end of the file ch = ' '; } if (isalnum(ch)) break; nChPos = i + M; } if (t < 2) { m_pFileIn->Seek(nCurInPos, CFile::begin); i -= M_1; continue; } } // found one match bContinue = GetFlag(m_nFlagAll); m_pFileIn->Seek(nInPos, CFile::begin); if (bReplace) { if (OnPreReplace(m_pFileIn, nInPos, bContinue)) { nResult++; m_pFileOut->Write(pBuffer + w, i - w); nOutPos = (LONG) m_pFileOut->GetPosition(); m_pFileOut->Write(m_pReplace->GetData(), PtrToUint(m_pReplace->GetSize())); w = i + M; nCurOutPos = (LONG) m_pFileOut->GetPosition(); m_pFileOut->Seek(nOutPos, CFile::begin); OnPostReplace(m_pFileOut, nOutPos); m_pFileOut->Seek(nCurOutPos, CFile::begin); } if (!bContinue) m_pFileOut->Write(pBuffer + w, n - w); } else { if (OnFound(m_pFileIn, nInPos, bContinue)) nResult++; } m_pFileIn->Seek(nCurInPos, CFile::begin); } } CloseFiles(); } catch (...) { if (!GetFlag(m_nFlagUseCFile)) { CString sTempFileName = m_pFileOut->GetFilePath(); m_pFileIn->Abort(); m_pFileOut->Abort(); if (bReplace && GetFlag(m_nFlagOverwrite) && !sTempFileName.IsEmpty()) ::DeleteFile(sTempFileName); } m_pFileIn = NULL; m_pFileOut = NULL; delete[] pBuffer; pBuffer = NULL; throw; } // Clean up delete[] pBuffer; pBuffer = NULL; m_pFileIn = NULL; m_pFileOut = NULL; return nResult; }
// BuildArgs //------------------------------------------------------------------------------ bool LinkerNode::BuildArgs( Args & fullArgs ) const { PROFILE_FUNCTION // split into tokens Array< AString > tokens( 1024, true ); m_LinkerOptions.Tokenize( tokens ); const AString * const end = tokens.End(); for ( const AString * it = tokens.Begin(); it!=end; ++it ) { const AString & token = *it; // %1 -> InputFiles const char * found = token.Find( "%1" ); if ( found ) { AStackString<> pre( token.Get(), found ); AStackString<> post( found + 2, token.GetEnd() ); GetInputFiles( fullArgs, pre, post ); fullArgs.AddDelimiter(); continue; } // %2 -> OutputFile found = token.Find( "%2" ); if ( found ) { fullArgs += AStackString<>( token.Get(), found ); fullArgs += m_Name; fullArgs += AStackString<>( found + 2, token.GetEnd() ); fullArgs.AddDelimiter(); continue; } // %3 -> AssemblyResources if ( GetFlag( LINK_FLAG_MSVC ) ) { found = token.Find( "%3" ); if ( found ) { AStackString<> pre( token.Get(), found ); AStackString<> post( found + 2, token.GetEnd() ); GetAssemblyResourceFiles( fullArgs, pre, post ); fullArgs.AddDelimiter(); continue; } } // untouched token fullArgs += token; fullArgs.AddDelimiter(); } // orbis-ld.exe requires escaped slashes inside response file if ( GetFlag( LINK_FLAG_ORBIS_LD ) ) { fullArgs.SetEscapeSlashesInResponseFile(); } // Handle all the special needs of args if ( fullArgs.Finalize( m_Linker, GetName(), CanUseResponseFile() ) == false ) { return false; // Finalize will have emitted an error } return true; }
void LinearPass::AnalysisOverlapWorker(duint Start, duint End, BBlockArray* Insertions) { // Comparison function to see if two blocks overlap auto BlockOverlapsRemove = [](BasicBlock * A, BasicBlock * B) -> BasicBlock* { // Do the blocks overlap? if(max(A->VirtualStart, B->VirtualStart) <= min((A->VirtualEnd - 1), (B->VirtualEnd - 1))) { // Return the block that should be removed if(A->Size() > B->Size()) return B; return A; } return nullptr; }; // Get a pointer to pure data const auto blocks = m_MainBlocks.data(); for(duint i = Start; i < End; i++) { const auto curr = &blocks[i]; const auto next = &blocks[i + 1]; // Current versus next (overlap -> delete) BasicBlock* removal = BlockOverlapsRemove(curr, next); if(removal) removal->SetFlag(BASIC_BLOCK_FLAG_DELETE); // Find blocks that need to be split in two because // of CALL/JMP targets // // Find targets in the virtual range if(ValidateAddress(curr->Target)) { removal = FindBBlockInRange(curr->Target); if(removal) { if(curr->GetFlag(BASIC_BLOCK_FLAG_CALL)) removal->SetFlag(BASIC_BLOCK_FLAG_CALL_TARGET); // If the target does not equal the block start... if(curr->Target != removal->VirtualStart) { // Mark for deletion removal->SetFlag(BASIC_BLOCK_FLAG_DELETE); // Block part 1 BasicBlock block1; block1.VirtualStart = removal->VirtualStart; block1.VirtualEnd = curr->Target; block1.Target = 0; block1.Flags = BASIC_BLOCK_FLAG_CUTOFF; // Attributes of the top half block1.InstrCount = removal->InstrCount; // Block part 2 BasicBlock block2; block2.VirtualStart = curr->Target; block2.VirtualEnd = removal->VirtualEnd; block2.Target = removal->Target; block2.Flags = removal->Flags; // Attributes of the bottom half (taken from original block) block2.InstrCount = removal->InstrCount; Insertions->push_back(block1); Insertions->push_back(block2); } } } } }
// DoBuild //------------------------------------------------------------------------------ /*virtual*/ Node::BuildResult LinkerNode::DoBuild( Job * job ) { DoPreLinkCleanup(); // Make sure the implib output directory exists if (m_ImportLibName.IsEmpty() == false) { AStackString<> cleanPath; NodeGraph::CleanPath(m_ImportLibName, cleanPath); if (EnsurePathExistsForFile(cleanPath) == false) { // EnsurePathExistsForFile will have emitted error return NODE_RESULT_FAILED; } } // Format compiler args string Args fullArgs; if ( !BuildArgs( fullArgs ) ) { return NODE_RESULT_FAILED; // BuildArgs will have emitted an error } // use the exe launch dir as the working dir const char * workingDir = nullptr; const char * environment = FBuild::Get().GetEnvironmentString(); EmitCompilationMessage( fullArgs ); // we retry if linker crashes uint32_t attempt( 0 ); for (;;) { ++attempt; // spawn the process Process p( FBuild::Get().GetAbortBuildPointer() ); bool spawnOK = p.Spawn( m_Linker.Get(), fullArgs.GetFinalArgs().Get(), workingDir, environment ); if ( !spawnOK ) { if ( p.HasAborted() ) { return NODE_RESULT_FAILED; } FLOG_ERROR( "Failed to spawn process '%s' for %s creation for '%s'", m_Linker.Get(), GetDLLOrExe(), GetName().Get() ); return NODE_RESULT_FAILED; } // capture all of the stdout and stderr AutoPtr< char > memOut; AutoPtr< char > memErr; uint32_t memOutSize = 0; uint32_t memErrSize = 0; p.ReadAllData( memOut, &memOutSize, memErr, &memErrSize ); ASSERT( !p.IsRunning() ); // Get result int result = p.WaitForExit(); if ( p.HasAborted() ) { return NODE_RESULT_FAILED; } // did the executable fail? if ( result != 0 ) { // Handle bugs in the MSVC linker if ( GetFlag( LINK_FLAG_MSVC ) && ( attempt == 1 ) ) { // Did the linker have an ICE (crash) (LNK1000)? if ( result == 1000 ) { FLOG_WARN( "FBuild: Warning: Linker crashed (LNK1000), retrying '%s'", GetName().Get() ); continue; // try again } // Did the linker have an "unexpected PDB error" (LNK1318)? // Example: "fatal error LNK1318: Unexpected PDB error; CORRUPT (13)" // (The linker or mspdbsrv.exe (as of VS2017) seems to have bugs which cause the PDB // to sometimes be corrupted when doing very large links, possibly because the linker // is running out of memory) if ( result == 1318 ) { FLOG_WARN( "FBuild: Warning: Linker corrupted the PDB (LNK1318), retrying '%s'", GetName().Get() ); continue; // try again } } if ( memOut.Get() ) { job->ErrorPreformatted( memOut.Get() ); } if ( memErr.Get() ) { job->ErrorPreformatted( memErr.Get() ); } // some other (genuine) linker failure FLOG_ERROR( "Failed to build %s (error %i) '%s'", GetDLLOrExe(), result, GetName().Get() ); return NODE_RESULT_FAILED; } else { // If "warnings as errors" is enabled (/WX) we don't need to check // (since compilation will fail anyway, and the output will be shown) if ( GetFlag( LINK_FLAG_MSVC ) && !GetFlag( LINK_FLAG_WARNINGS_AS_ERRORS_MSVC ) ) { HandleWarningsMSVC( job, GetName(), memOut.Get(), memOutSize ); } break; // success! } } // post-link stamp step if ( m_LinkerStampExe.IsEmpty() == false ) { const Node * linkerStampExe = m_StaticDependencies.End()[ -1 ].GetNode(); EmitStampMessage(); Process stampProcess( FBuild::Get().GetAbortBuildPointer() ); bool spawnOk = stampProcess.Spawn( linkerStampExe->GetName().Get(), m_LinkerStampExeArgs.Get(), nullptr, // working dir nullptr ); // env if ( spawnOk == false ) { if ( stampProcess.HasAborted() ) { return NODE_RESULT_FAILED; } FLOG_ERROR( "Failed to spawn process '%s' for '%s' stamping of '%s'", linkerStampExe->GetName().Get(), GetDLLOrExe(), GetName().Get() ); return NODE_RESULT_FAILED; } // capture all of the stdout and stderr AutoPtr< char > memOut; AutoPtr< char > memErr; uint32_t memOutSize = 0; uint32_t memErrSize = 0; stampProcess.ReadAllData( memOut, &memOutSize, memErr, &memErrSize ); ASSERT( !stampProcess.IsRunning() ); // Get result int result = stampProcess.WaitForExit(); if ( stampProcess.HasAborted() ) { return NODE_RESULT_FAILED; } // did the executable fail? if ( result != 0 ) { if ( memOut.Get() ) { FLOG_ERROR_DIRECT( memOut.Get() ); } if ( memErr.Get() ) { FLOG_ERROR_DIRECT( memErr.Get() ); } FLOG_ERROR( "Failed to stamp %s '%s' (error %i - '%s')", GetDLLOrExe(), GetName().Get(), result, m_LinkerStampExe.Get() ); return NODE_RESULT_FAILED; } // success! } // record time stamp for next time m_Stamp = FileIO::GetFileLastWriteTime( m_Name ); ASSERT( m_Stamp ); return NODE_RESULT_OK; }
short Read::ReadActor() { ReadingPos=17;// Inicia en posicion 16 de hecho; while((GetFlag(ReadingPos)!=0x02)||(GetFlag(ReadingPos)==0x02 && GetFlag(ReadingPos+1)!=0x01)) { switch(GetFlag(ReadingPos)) { case name: cout << "Pos: " << ReadingPos << " : "<< hex <<(int)GetFlag(ReadingPos) << " : " << (int)GetFlag(ReadingPos+1 )<< endl; Actors[0].Name+=ReadString(ReadingPos+2,(int)GetFlag(ReadingPos+1)); Output("-Nombre",Actors[0].Name); ReadingPos+=2+(int)GetFlag(ReadingPos+1); //cout<< hex << (int)GetFlag(ReadingPos) << " "<<(int)GetFlag(ReadingPos+1); break; case title: cout << "Pos: " << dec <<ReadingPos << " : "<< hex <<(int)GetFlag(ReadingPos) << " : " << (int)GetFlag(ReadingPos+1 )<< endl; Actors[0].Title+=ReadString(ReadingPos+2,(int)GetFlag(ReadingPos+1)); Output("-Titulo",Actors[0].Title); ReadingPos+=2+(int)GetFlag(ReadingPos+1); break; case character_name: cout << "Pos: " << dec <<ReadingPos << " : "<< hex <<(int)GetFlag(ReadingPos) << " : " << (int)GetFlag(ReadingPos+1 )<< endl; Actors[0].Character_Name+=ReadString(ReadingPos+2,(int)GetFlag(ReadingPos+1)); Output("-Char Nombre",Actors[0].Character_Name); ReadingPos+=2+(int)GetFlag(ReadingPos+1); break; case character_index: break; case transparent: break; case initial_level: break; case final_level: break; case critical_hit: break; case critical_hit_chance: break; case face_name: cout << "Pos: " << dec <<ReadingPos << " : "<< hex <<(int)GetFlag(ReadingPos) << " : " << (int)GetFlag(ReadingPos+1 )<< endl; Actors[0].Face_Name+=ReadString(ReadingPos+2,(int)GetFlag(ReadingPos+1)); Output("-Face Nombre",Actors[0].Face_Name); ReadingPos+=2+(int)GetFlag(ReadingPos+1); break; case face_index: break; case two_swords_style: break; case fix_equipment: break; case auto_battle: break; case super_guard: break; case parameters: //Output("-Parametros","Encontrados"); break; case exp_base: break; case exp_inflation: break; case exp_correction: break; case initial_equipment: break; case unarmed_animation: break; case class_id: break; case battle_x: break; case battle_y: break; case battler_animation: break; case skills: break; case rename_skill: break; case skill_name: break; case state_ranks_size: break; case state_ranks: break; case attribute_ranks_size: break; case attribute_ranks: break; case battle_commands: break; } } }
nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState, nsPresContext* aPresContext, nsBlockFrame* aFrame, const nsHTMLReflowMetrics& aMetrics, PRBool aTopMarginRoot, PRBool aBottomMarginRoot, PRBool aBlockNeedsFloatManager) : mBlock(aFrame), mPresContext(aPresContext), mReflowState(aReflowState), mOverflowTracker(nsnull), mPrevBottomMargin(), mLineNumber(0), mFlags(0), mFloatBreakType(NS_STYLE_CLEAR_NONE) { SetFlag(BRS_ISFIRSTINFLOW, aFrame->GetPrevInFlow() == nsnull); SetFlag(BRS_ISOVERFLOWCONTAINER, IS_TRUE_OVERFLOW_CONTAINER(aFrame)); const nsMargin& borderPadding = BorderPadding(); if (aTopMarginRoot || 0 != aReflowState.mComputedBorderPadding.top) { SetFlag(BRS_ISTOPMARGINROOT, PR_TRUE); } if (aBottomMarginRoot || 0 != aReflowState.mComputedBorderPadding.bottom) { SetFlag(BRS_ISBOTTOMMARGINROOT, PR_TRUE); } if (GetFlag(BRS_ISTOPMARGINROOT)) { SetFlag(BRS_APPLYTOPMARGIN, PR_TRUE); } if (aBlockNeedsFloatManager) { SetFlag(BRS_FLOAT_MGR, PR_TRUE); } mFloatManager = aReflowState.mFloatManager; NS_ASSERTION(mFloatManager, "FloatManager should be set in nsBlockReflowState" ); if (mFloatManager) { // Translate into our content area and then save the // coordinate system origin for later. mFloatManager->Translate(borderPadding.left, borderPadding.top); mFloatManager->GetTranslation(mFloatManagerX, mFloatManagerY); mFloatManager->PushState(&mFloatManagerStateBefore); // never popped } mReflowStatus = NS_FRAME_COMPLETE; mPresContext = aPresContext; mNextInFlow = static_cast<nsBlockFrame*>(mBlock->GetNextInFlow()); NS_WARN_IF_FALSE(NS_UNCONSTRAINEDSIZE != aReflowState.ComputedWidth(), "have unconstrained width; this should only result from " "very large sizes, not attempts at intrinsic width " "calculation"); mContentArea.width = aReflowState.ComputedWidth(); // Compute content area height. Unlike the width, if we have a // specified style height we ignore it since extra content is // managed by the "overflow" property. When we don't have a // specified style height then we may end up limiting our height if // the availableHeight is constrained (this situation occurs when we // are paginated). if (NS_UNCONSTRAINEDSIZE != aReflowState.availableHeight) { // We are in a paginated situation. The bottom edge is just inside // the bottom border and padding. The content area height doesn't // include either border or padding edge. mBottomEdge = aReflowState.availableHeight - borderPadding.bottom; mContentArea.height = NS_MAX(0, mBottomEdge - borderPadding.top); } else { // When we are not in a paginated situation then we always use // an constrained height. SetFlag(BRS_UNCONSTRAINEDHEIGHT, PR_TRUE); mContentArea.height = mBottomEdge = NS_UNCONSTRAINEDSIZE; } mY = borderPadding.top; mPrevChild = nsnull; mCurrentLine = aFrame->end_lines(); mMinLineHeight = aReflowState.CalcLineHeight(); }
// Compute the amount of available space for reflowing a block frame // at the current Y coordinate. This method assumes that // GetAvailableSpace has already been called. void nsBlockReflowState::ComputeBlockAvailSpace(nsIFrame* aFrame, const nsStyleDisplay* aDisplay, const nsFlowAreaRect& aFloatAvailableSpace, PRBool aBlockAvoidsFloats, nsRect& aResult) { #ifdef REALLY_NOISY_REFLOW printf("CBAS frame=%p has floats %d\n", aFrame, aFloatAvailableSpace.mHasFloats); #endif aResult.y = mY; aResult.height = GetFlag(BRS_UNCONSTRAINEDHEIGHT) ? NS_UNCONSTRAINEDSIZE : NS_MAX(0, mReflowState.availableHeight - mY); // mY might be greater than mBottomEdge if the block's top margin pushes // it off the page/column. Negative available height can confuse other code // and is nonsense in principle. const nsMargin& borderPadding = BorderPadding(); // XXX Do we really want this condition to be this restrictive (i.e., // more restrictive than it used to be)? The |else| here is allowed // by the CSS spec, but only out of desperation given implementations, // and the behavior it leads to is quite undesirable (it can cause // things to become extremely narrow when they'd fit quite well a // little bit lower). Should the else be a quirk or something that // applies to a specific set of frame classes and no new ones? // If we did that, then for those frames where the condition below is // true but nsBlockFrame::BlockCanIntersectFloats is false, // nsBlockFrame::WidthToClearPastFloats would need to use the // shrink-wrap formula, max(MIN_WIDTH, min(avail width, PREF_WIDTH)) // rather than just using MIN_WIDTH. NS_ASSERTION(nsBlockFrame::BlockCanIntersectFloats(aFrame) == !aBlockAvoidsFloats, "unexpected replaced width"); if (!aBlockAvoidsFloats) { if (aFloatAvailableSpace.mHasFloats) { // Use the float-edge property to determine how the child block // will interact with the float. const nsStyleBorder* borderStyle = aFrame->GetStyleBorder(); switch (borderStyle->mFloatEdge) { default: case NS_STYLE_FLOAT_EDGE_CONTENT: // content and only content does runaround of floats // The child block will flow around the float. Therefore // give it all of the available space. aResult.x = borderPadding.left; aResult.width = mContentArea.width; break; case NS_STYLE_FLOAT_EDGE_MARGIN: { // The child block's margins should be placed adjacent to, // but not overlap the float. aResult.x = aFloatAvailableSpace.mRect.x + borderPadding.left; aResult.width = aFloatAvailableSpace.mRect.width; } break; } } else { // Since there are no floats present the float-edge property // doesn't matter therefore give the block element all of the // available space since it will flow around the float itself. aResult.x = borderPadding.left; aResult.width = mContentArea.width; } } else { nsBlockFrame::ReplacedElementWidthToClear replacedWidthStruct; nsBlockFrame::ReplacedElementWidthToClear *replacedWidth = nsnull; if (aFrame->GetType() == nsGkAtoms::tableOuterFrame) { replacedWidth = &replacedWidthStruct; replacedWidthStruct = nsBlockFrame::WidthToClearPastFloats(*this, aFloatAvailableSpace.mRect, aFrame); } nscoord leftOffset, rightOffset; ComputeReplacedBlockOffsetsForFloats(aFrame, aFloatAvailableSpace.mRect, leftOffset, rightOffset, replacedWidth); aResult.x = borderPadding.left + leftOffset; aResult.width = mContentArea.width - leftOffset - rightOffset; } #ifdef REALLY_NOISY_REFLOW printf(" CBAS: result %d %d %d %d\n", aResult.x, aResult.y, aResult.width, aResult.height); #endif }
// DoBuild //------------------------------------------------------------------------------ /*virtual*/ Node::BuildResult LinkerNode::DoBuild( Job * UNUSED( job ) ) { DoPreLinkCleanup(); // Make sure the implib output directory exists if (m_ImportLibName.IsEmpty() == false) { AStackString<> cleanPath; NodeGraph::CleanPath(m_ImportLibName, cleanPath); if (EnsurePathExistsForFile(cleanPath) == false) { // EnsurePathExistsForFile will have emitted error return NODE_RESULT_FAILED; } } // Format compiler args string Args fullArgs; if ( !BuildArgs( fullArgs ) ) { return NODE_RESULT_FAILED; // BuildArgs will have emitted an error } // use the exe launch dir as the working dir const char * workingDir = nullptr; const char * environment = FBuild::Get().GetEnvironmentString(); EmitCompilationMessage( fullArgs ); // we retry if linker crashes uint32_t attempt( 0 ); for (;;) { ++attempt; // spawn the process Process p; bool spawnOK = p.Spawn( m_Linker.Get(), fullArgs.GetFinalArgs().Get(), workingDir, environment ); if ( !spawnOK ) { FLOG_ERROR( "Failed to spawn process '%s' for %s creation for '%s'", m_Linker.Get(), GetDLLOrExe(), GetName().Get() ); return NODE_RESULT_FAILED; } // capture all of the stdout and stderr AutoPtr< char > memOut; AutoPtr< char > memErr; uint32_t memOutSize = 0; uint32_t memErrSize = 0; p.ReadAllData( memOut, &memOutSize, memErr, &memErrSize ); ASSERT( !p.IsRunning() ); // Get result int result = p.WaitForExit(); // did the executable fail? if ( result != 0 ) { // did the linker have an ICE (LNK1000)? if ( GetFlag( LINK_FLAG_MSVC ) && ( result == 1000 ) && ( attempt == 1 ) ) { FLOG_WARN( "FBuild: Warning: Linker crashed (LNK1000), retrying '%s'", GetName().Get() ); continue; // try again } if ( memOut.Get() ) { m_BuildOutputMessages.Append( memOut.Get(), memOutSize ); FLOG_ERROR_DIRECT( memOut.Get() ); } if ( memErr.Get() ) { m_BuildOutputMessages.Append( memErr.Get(), memErrSize ); FLOG_ERROR_DIRECT( memErr.Get() ); } // some other (genuine) linker failure FLOG_ERROR( "Failed to build %s (error %i) '%s'", GetDLLOrExe(), result, GetName().Get() ); return NODE_RESULT_FAILED; } else { break; // success! } } // post-link stamp step if ( m_LinkerStampExe ) { EmitStampMessage(); Process stampProcess; bool spawnOk = stampProcess.Spawn( m_LinkerStampExe->GetName().Get(), m_LinkerStampExeArgs.Get(), nullptr, // working dir nullptr ); // env if ( spawnOk == false ) { FLOG_ERROR( "Failed to spawn process '%s' for '%s' stamping of '%s'", m_LinkerStampExe->GetName().Get(), GetDLLOrExe(), GetName().Get() ); return NODE_RESULT_FAILED; } // capture all of the stdout and stderr AutoPtr< char > memOut; AutoPtr< char > memErr; uint32_t memOutSize = 0; uint32_t memErrSize = 0; stampProcess.ReadAllData( memOut, &memOutSize, memErr, &memErrSize ); ASSERT( !stampProcess.IsRunning() ); // Get result int result = stampProcess.WaitForExit(); // did the executable fail? if ( result != 0 ) { if ( memOut.Get() ) { FLOG_ERROR_DIRECT( memOut.Get() ); } if ( memErr.Get() ) { FLOG_ERROR_DIRECT( memErr.Get() ); } FLOG_ERROR( "Failed to stamp %s '%s' (error %i - '%s')", GetDLLOrExe(), GetName().Get(), result, m_LinkerStampExe->GetName().Get() ); return NODE_RESULT_FAILED; } // success! } // record time stamp for next time m_Stamp = FileIO::GetFileLastWriteTime( m_Name ); ASSERT( m_Stamp ); return NODE_RESULT_OK; }