bool MfStatusCache::DoLoad(const wxTextFile& file, int version) { bool isFmtOk = true; CacheFileFormat fmt; if ( version == BuildVersion(1, 1) ) { fmt = CacheFile_1_1; } else if ( version == BuildVersion(1, 0) ) { fmt = CacheFile_1_0; } else { fmt = CacheFile_Max; } // read the data wxString str, name; str.Alloc(1024); // avoid extra memory allocations name.Alloc(1024); MailFolderStatus status; size_t count = file.GetLineCount(); for ( size_t n = 1; n < count; n++ ) { str = file[n]; // first get the end of the full folder name knowing that we should // skip all "::" as they could have only resulted from quoting a ':' // in the folder name and so the loop below looks for the first ':' // not followed by another ':' const wxChar *p = wxStrchr(str, CACHE_DELIMITER_CH); while ( p && p[1] == CACHE_DELIMITER_CH ) { p = wxStrchr(p + 2, CACHE_DELIMITER_CH); } if ( !p ) { wxLogError(_("Missing '%c' at line %d."), CACHE_DELIMITER_CH, n + 1); isFmtOk = false; break; } name = wxString(str.c_str(), p); // now unquote ':' which were doubled by Save() name.Replace(CACHE_DELIMITER CACHE_DELIMITER, CACHE_DELIMITER); // get the rest status.Init(); switch ( fmt ) { case CacheFile_1_0: isFmtOk = wxSscanf(p + 1, _T("%lu") CACHE_DELIMITER _T("%lu") CACHE_DELIMITER _T("%lu"), &status.total, &status.unread, &status.flagged) == 3; break; default: FAIL_MSG( _T("unknown cache file format") ); // fall through nevertheless case CacheFile_1_1: isFmtOk = wxSscanf(p + 1, _T("%lu") CACHE_DELIMITER _T("%lu") CACHE_DELIMITER _T("%lu") CACHE_DELIMITER _T("%lu"), &status.total, &status.newmsgs, &status.unread, &status.flagged) == 4; } if ( !isFmtOk ) { wxLogError(_("Missing field(s) at line %d."), n + 1); break; } // ignore the folders which were deleted during the last program run MFolder *folder = MFolder::Get(name); if ( folder ) { folder->DecRef(); // do add the entry to the cache size_t entry = m_folderNames.Add(name); m_folderData.Insert(new MailFolderStatus(status), entry); } else { wxLogDebug(_T("Removing deleted folder '%s' from status cache."), name.c_str()); } } if ( !isFmtOk ) { wxLogWarning(_("Your mail folder status cache file (%s) was corrupted."), file.GetName()); return false; } return true; }
void wxFileConfig::Parse(wxTextFile& file, bool bLocal) { const wxChar *pStart; const wxChar *pEnd; wxString strLine; size_t nLineCount = file.GetLineCount(); for ( size_t n = 0; n < nLineCount; n++ ) { strLine = file[n]; // add the line to linked list if ( bLocal ) LineListAppend(strLine); // skip leading spaces for ( pStart = strLine; wxIsspace(*pStart); pStart++ ) ; // skip blank/comment lines if ( *pStart == wxT('\0')|| *pStart == wxT(';') || *pStart == wxT('#') ) continue; if ( *pStart == wxT('[') ) { // a new group pEnd = pStart; while ( *++pEnd != wxT(']') ) { if ( *pEnd == wxT('\\') ) { // the next char is escaped, so skip it even if it is ']' pEnd++; } if ( *pEnd == wxT('\n') || *pEnd == wxT('\0') ) { // we reached the end of line, break out of the loop break; } } if ( *pEnd != wxT(']') ) { wxLogError(_("file '%s': unexpected character %c at line %d."), file.GetName(), *pEnd, n + 1); continue; // skip this line } // group name here is always considered as abs path wxString strGroup; pStart++; strGroup << wxCONFIG_PATH_SEPARATOR << FilterInEntryName(wxString(pStart, pEnd - pStart)); // will create it if doesn't yet exist SetPath(strGroup); if ( bLocal ) m_pCurrentGroup->SetLine(m_linesTail); // check that there is nothing except comments left on this line bool bCont = TRUE; while ( *++pEnd != wxT('\0') && bCont ) { switch ( *pEnd ) { case wxT('#'): case wxT(';'): bCont = FALSE; break; case wxT(' '): case wxT('\t'): // ignore whitespace ('\n' impossible here) break; default: wxLogWarning(_("file '%s', line %d: '%s' ignored after group header."), file.GetName(), n + 1, pEnd); bCont = FALSE; } } } else { // a key const wxChar *pEnd = pStart; while ( *pEnd && *pEnd != wxT('=') && !wxIsspace(*pEnd) ) { if ( *pEnd == wxT('\\') ) { // next character may be space or not - still take it because it's // quoted (unless there is nothing) pEnd++; if ( !*pEnd ) { // the error message will be given below anyhow break; } } pEnd++; } wxString strKey(FilterInEntryName(wxString(pStart, pEnd))); // skip whitespace while ( wxIsspace(*pEnd) ) pEnd++; if ( *pEnd++ != wxT('=') ) { wxLogError(_("file '%s', line %d: '=' expected."), file.GetName(), n + 1); } else { ConfigEntry *pEntry = m_pCurrentGroup->FindEntry(strKey); if ( pEntry == NULL ) { // new entry pEntry = m_pCurrentGroup->AddEntry(strKey, n); if ( bLocal ) pEntry->SetLine(m_linesTail); } else { if ( bLocal && pEntry->IsImmutable() ) { // immutable keys can't be changed by user wxLogWarning(_("file '%s', line %d: value for immutable key '%s' ignored."), file.GetName(), n + 1, strKey.c_str()); continue; } // the condition below catches the cases (a) and (b) but not (c): // (a) global key found second time in global file // (b) key found second (or more) time in local file // (c) key from global file now found in local one // which is exactly what we want. else if ( !bLocal || pEntry->IsLocal() ) { wxLogWarning(_("file '%s', line %d: key '%s' was first found at line %d."), file.GetName(), n + 1, strKey.c_str(), pEntry->Line()); if ( bLocal ) pEntry->SetLine(m_linesTail); } } // skip whitespace while ( wxIsspace(*pEnd) ) pEnd++; if ( GetStyle() & wxCONFIG_USE_NO_ESCAPE_CHARACTERS ) pEntry->SetValue(pEnd, FALSE /* read from file, without escapes */); else pEntry->SetValue(FilterInValue(pEnd), FALSE /* read from file, with escapes */); //pEntry->SetValue(FilterInValue(pEnd), FALSE /* read from file */); } } } }
bool ClassGenerateDialog::GenerateFile(Table* pTab, wxTextFile& htmpFile, wxString& hFile, const wxString& classItemName, const wxString& classItemDef, const wxString& classColName, const wxString& classTableName, const wxString& classUtilName) { Constraint* pPK = NULL; int colCount = 0; int lastEditParam = 0; SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Constraint* pConstr = wxDynamicCast(node->GetData(),Constraint); if (pConstr) { if (pConstr->GetType() == Constraint::primaryKey) pPK = pConstr; } else colCount++; node = node->GetNext(); } Column* pPKCol = NULL; if (pPK) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { if (pCol->GetName() == pPK->GetLocalColumn()) pPKCol = pCol; } node = node->GetNext(); } } if( (pPKCol == NULL) && (pTab->IsView() == false) ) { m_textLog->AppendText( wxString::Format( _("Table %s has no primary key defined!\n"), pTab->GetName().c_str() ) ); return false; } for ( wxString str = htmpFile.GetFirstLine(); !htmpFile.Eof(); str = htmpFile.GetNextLine() ) { if (str.Contains(wxT("%%classItemGetters%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxString::Format(wxT("\tconst %s Get%s() const {"), GetResTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; hFile << wxString::Format(wxT("\t\treturn m_%s;"), pCol->GetName().c_str()) << "\n"; hFile << wxString::Format(wxT("\t\t}")) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classItemVariables%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxString::Format(wxT("\t%s m_%s;"), GetTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str())<< "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classItemLoading%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxString::Format(wxT("\t\tm_%s = pResult->%s(wxT(\"%s\"));"),pCol->GetName().c_str(), GetResultFunction(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classItemBindings%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << GetDebeaBinding(pCol) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classItemAddParameters%%"))) { bool first = true; SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { if( first ) { hFile << wxString::Format(wxT("\t\t\t%s %s"), GetParamTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; first = false; } else { hFile << wxString::Format(wxT("\t\t\t,%s %s"), GetParamTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; } } node = node->GetNext(); } } else if (str.Contains(wxT("%%classItemSetParams%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol ) { hFile << wxT("\tm_") + pCol->GetName() + wxT(" = ") + pCol->GetName() + wxT(";") << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classColLabelFillGrid%%"))) { int i = 0; SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxT("\t\tpGrid->AppendCols(1);")<< "\n"; hFile << wxString::Format(wxT("\t\tpGrid->SetColLabelValue(%i,wxT(\"%s\"));"),i++,pCol->GetName().c_str())<< "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classColDataFillGrid%%"))) { int i = 0; SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << GetFillData(pCol, i++) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%primaryKeyHeader%%"))) { if (pPKCol) { hFile << wxString::Format(wxT("\t/*! \\brief Return %s from db on the %s base */"),pPKCol->GetParentName().c_str(),pPKCol->GetName().c_str()) << "\n"; hFile << wxString::Format(wxT("\tstatic %s* GetBy%s(%s %s, DatabaseLayer* pDbLayer);"),classItemName.c_str(),pPKCol->GetName().c_str(), GetTypeName(pPKCol->GetType()->GetUniversalType()).c_str(),pPKCol->GetName().c_str()) << "\n"; } } else if (str.Contains(wxT("%%primaryKeyBody%%"))) { if (pPKCol) { hFile << wxString::Format(wxT("%s* %s::GetBy%s(%s %s, DatabaseLayer* pDbLayer)"),classItemName.c_str(),classItemName.c_str(),pPKCol->GetName().c_str(), GetTypeName(pPKCol->GetType()->GetUniversalType()).c_str(),pPKCol->GetName().c_str()) << "\n"; hFile << wxT("{") << "\n"; hFile << wxT("\tDatabaseResultSet* resSet = NULL;") << "\n"; hFile << wxT("\tPreparedStatement* pStatement = NULL;") << "\n"; hFile << wxT("\tif (pDbLayer){") << "\n"; hFile << wxT("\t\tif (pDbLayer->IsOpen()){") << "\n"; hFile << wxString::Format(wxT("\t\t\tpStatement = pDbLayer->PrepareStatement(wxT(\"SELECT * FROM %s WHERE %s = ?\"));"),classTableName.c_str(), pPKCol->GetName().c_str()) << "\n"; hFile << wxString::Format(wxT("\t\t\tpStatement->%s(1, %s);"), GetAddParamFunction(pPKCol->GetType()->GetUniversalType()).c_str(), pPKCol->GetName().c_str()) << "\n"; hFile << wxT("\t\t\tresSet = pStatement->RunQueryWithResults();") << "\n"; hFile << wxT("\t\t\t}") << "\n"; hFile << wxT("\t\t}") << "\n"; hFile << wxT("\tif (resSet){") << "\n"; hFile << wxString::Format(wxT("\t\tif (resSet->Next()) return new %s(resSet);"),classItemName.c_str()) << "\n"; hFile << wxT("\t\tpStatement->Close();") << "\n"; hFile << wxT("\t\t}") << "\n"; hFile << wxT("\treturn NULL;") << "\n"; hFile << wxT("}") << "\n"; } } else if (str.Contains(wxT("%%classUtilsAddParameters%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxString::Format(wxT("\t\t\t,%s %s"), GetParamTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classUtilsAddParametersWithoutPK%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol && ( !pPKCol || (pCol->GetName() != pPKCol->GetName()) ) ) { hFile << wxString::Format(wxT("\t\t\t,%s %s"), GetParamTypeName(pCol->GetType()->GetUniversalType()).c_str(), pCol->GetName().c_str()) << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classUtilsDeleteParameters%%"))) { if (pPKCol) hFile << wxString::Format(wxT("\t\t\t,%s %s"), GetParamTypeName(pPKCol->GetType()->GetUniversalType()).c_str(), pPKCol->GetName().c_str()) << "\n"; } else if (str.Contains(wxT("%%classUtilsAddSetParams%%"))) { int i = 1; SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { hFile << wxString::Format(wxT("\t\t\tpStatement->%s(%i, %s);"), GetAddParamFunction(pCol->GetType()->GetUniversalType()).c_str(),i++,pCol->GetName().c_str()) << "\n"; } node = node->GetNext(); } lastEditParam = i; } else if (str.Contains(wxT("%%classUtilsAddSetDebeaParams%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol && ( !pPKCol || (pCol->GetName() != pPKCol->GetName()) ) ) { hFile << wxT("\t\tc.m_") + pCol->GetName() + wxT(" = ") + pCol->GetName() + wxT(";") << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classUtilsAddDelParams%%"))) { if (pPKCol) hFile << wxString::Format(wxT("\t\t\tpStatement->%s(%i, %s);"), GetAddParamFunction(pPKCol->GetType()->GetUniversalType()).c_str(),1,pPKCol->GetName().c_str()) << "\n"; } else if (str.Contains(wxT("%%classUtilsAddStatement%%"))) { wxString cols = wxT(""); wxString params = wxT(""); SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { if (!cols.IsEmpty()) cols = cols + wxT(","); cols += pCol->GetName(); if (!params.IsEmpty()) params += wxT(","); params += wxT("?"); } node = node->GetNext(); } hFile << wxString::Format(wxT("\t\tPreparedStatement* pStatement = pDbLayer->PrepareStatement(wxT(\"INSERT INTO %s (%s) VALUES (%s)\"));"),pTab->GetName().c_str(), cols.c_str(), params.c_str()) << "\n"; } else if (str.Contains(wxT("%%classUtilsEditStatement%%"))) { wxString cols = wxT(""); wxString params = wxT(""); SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol) { if (!cols.IsEmpty()) cols = cols + wxT(","); cols += pCol->GetName() + wxT(" = ?"); } node = node->GetNext(); } if (pPKCol) hFile << wxString::Format(wxT("\t\tPreparedStatement* pStatement = pDbLayer->PrepareStatement(wxT(\"UPDATE %s SET %s WHERE %s = ?\"));"),pTab->GetName().c_str(), cols.c_str(), pPKCol->GetName().c_str()) << "\n"; else hFile << wxT("\t\tPreparedStatement* pStatement = NULL;") << "\n"; } else if (str.Contains(wxT("%%classUtilsEditDebeaStatement%%"))) { SerializableList::compatibility_iterator node = pTab->GetFirstChildNode(); while( node ) { Column* pCol = wxDynamicCast(node->GetData(),Column); if (pCol && ( !pPKCol || (pCol->GetName() != pPKCol->GetName()) ) ) { hFile << wxT("\t\t\tc->setMember(c->m_") + pCol->GetName() + wxT(", ") + pCol->GetName() + wxT(");") << "\n"; } node = node->GetNext(); } } else if (str.Contains(wxT("%%classUtilsDeleteStatement%%"))) { if (pPKCol) hFile << wxString::Format(wxT("\t\tPreparedStatement* pStatement = pDbLayer->PrepareStatement(wxT(\"DELETE FROM %s WHERE %s = ?\"));"),pTab->GetName().c_str(), pPKCol->GetName().c_str()) << "\n"; else hFile << wxT("\t\tPreparedStatement* pStatement = NULL;") << "\n"; } else if (str.Contains(wxT("%%classUtilsPKSetParams%%"))) { if (pPKCol) hFile << wxString::Format(wxT("\t\t\tpStatement->%s(%i, %s);"), GetAddParamFunction(pPKCol->GetType()->GetUniversalType()).c_str(),lastEditParam,pPKCol->GetName().c_str()) << "\n"; } else if (str.Contains(wxT("%%classUtilsCreateStatement%%"))) { wxStringTokenizer tknz( m_pDbAdapter->GetCreateTableSql( pTab, true ), wxT("\n"), wxTOKEN_STRTOK ); while( true ) { wxString line = tknz.GetNextToken(); if( !tknz.HasMoreTokens() ) break; // omit last line hFile << wxT("\t\t\t\"") + line + wxT("\" \\") << "\n"; } } else if (str.Contains(wxT("%%classUtilsDropStatement%%"))) { wxStringTokenizer tknz( m_pDbAdapter->GetDropTableSql( pTab ), wxT("\n"), wxTOKEN_STRTOK ); while( tknz.HasMoreTokens() ) { hFile << wxT("\t\t\t\"") + tknz.GetNextToken() + wxT("\" \\") << "\n"; } } else { str.Replace(wxT("%%classItemName%%"),classItemName); str.Replace(wxT("%%classItemDef%%"),classItemDef); str.Replace(wxT("%%classColName%%"),classColName); str.Replace(wxT("%%classTableName%%"),classTableName); str.Replace(wxT("%%classUtilName%%"), classUtilName); if( pPKCol ) { str.Replace(wxT("%%pkType%%"), GetParamTypeName(pPKCol->GetType()->GetUniversalType())); str.Replace(wxT("%%pkName%%"), pPKCol->GetName()); } hFile << str << "\n"; } } return true; }
bool STISpectrumExports::LoadFromFile(wxTextFile& wxtfSplData) { // TODO: missin' error check on reading int nBand; double dbValue; wxString wxszDataBuffer; wxszDataBuffer = wxtfSplData.GetFirstLine(); while(!wxtfSplData.Eof()) { if(wxszDataBuffer.Contains(wxT("BACKGROUND NOISE LEFT"))) { for( nBand = 2, wxszDataBuffer = wxtfSplData.GetNextLine(); (nBand < 9) && !wxtfSplData.Eof(); nBand++, wxszDataBuffer = wxtfSplData.GetNextLine() ) { wxszDataBuffer.ToDouble(&dbValue); m_pAs->SetNoiseLevel(dbValue, nBand, CH_LEFT, true); } } else if(wxszDataBuffer.Contains(wxT("SIGNAL LEVEL LEFT"))) { for( nBand = 2, wxszDataBuffer = wxtfSplData.GetNextLine(); (nBand < 9) && !wxtfSplData.Eof(); nBand++, wxszDataBuffer = wxtfSplData.GetNextLine() ) { wxszDataBuffer.ToDouble(&dbValue); m_pAs->SetSignalLevel(dbValue, nBand, CH_LEFT, true); } } else if(wxszDataBuffer.Contains(wxT("BACKGROUND NOISE RIGHT"))) { for( nBand = 2, wxszDataBuffer = wxtfSplData.GetNextLine(); (nBand < 9) && !wxtfSplData.Eof(); nBand++, wxszDataBuffer = wxtfSplData.GetNextLine() ) { wxszDataBuffer.ToDouble(&dbValue); m_pAs->SetNoiseLevel(dbValue, nBand, CH_RIGHT, true); } } else if(wxszDataBuffer.Contains(wxT("SIGNAL LEVEL RIGHT"))) { for( nBand = 2, wxszDataBuffer = wxtfSplData.GetNextLine(); (nBand < 9) && !wxtfSplData.Eof(); nBand++, wxtfSplData.GetNextLine() ) { wxszDataBuffer.ToDouble(&dbValue); m_pAs->SetSignalLevel(dbValue, nBand, CH_RIGHT, true); } } else { wxszDataBuffer = wxtfSplData.GetNextLine(); } } return true; }
bool cbMGMakefile::formFileForTarget( ProjectBuildTarget *p_BuildTarget, wxTextFile &p_File ) { bool l_Ret = false; if ( !p_BuildTarget ) { wxString l_Msg = _( "Can't found an active target!\n" "C::B MakefileGen could not complete the operation." ); cbMessageBox( l_Msg, _( "Error" ), wxICON_ERROR | wxOK, (wxWindow *)Manager::Get()->GetAppWindow() ); Manager::Get()->GetMessageManager()->DebugLog( l_Msg ); return l_Ret; } wxString l_TargetName = p_BuildTarget->GetTitle(); wxString l_ObjsName = _T("OBJS_") + l_TargetName.Upper(); wxString l_CmdBefore = cmdbefore + _T('_') + l_TargetName; wxString l_CmdAfter = cmdafter + _T('_') + l_TargetName; wxString l_CmdClean = cmdclean + _T('_') + l_TargetName; m_Rules.Clear(); const wxString& l_CompilerId = p_BuildTarget->GetCompilerID(); Compiler* l_pCompiler = CompilerFactory::GetCompiler( l_CompilerId ); if( !l_pCompiler ) { wxString l_Msg = _( "Can't found an compiler settings!\n" "C::B MakefileGen could not complete the operation." ); cbMessageBox( l_Msg, _( "Error" ), wxICON_ERROR | wxOK, (wxWindow *)Manager::Get()->GetAppWindow() ); Manager::Get()->GetMessageManager()->DebugLog( l_Msg ); return false; } if ( !getDependencies( p_BuildTarget, l_pCompiler ) ) return false; if ( !m_VariablesIsSaved ) { m_Variables.AddVariable(_T("CPP"),l_pCompiler->GetPrograms().CPP); m_Variables.AddVariable(_T("CC"),l_pCompiler->GetPrograms().C); m_Variables.AddVariable(_T("LD"),l_pCompiler->GetPrograms().LD); m_Variables.AddVariable(_T("LIB"),l_pCompiler->GetPrograms().LIB); m_Variables.AddVariable(_T("WINDRES"),l_pCompiler->GetPrograms().WINDRES); } const wxArrayString& l_CommandsBeforeBuild = p_BuildTarget->GetCommandsBeforeBuild(); const wxArrayString& l_CommandsAfterBuild = p_BuildTarget->GetCommandsAfterBuild(); wxString l_TargetFileName = p_BuildTarget->GetOutputFilename(); Manager::Get()->GetMacrosManager()->ReplaceMacros(l_TargetFileName, p_BuildTarget); wxFileName l_OutFileName = UnixFilename(l_TargetFileName); cbMGRule l_Rule; if ( 0 == l_TargetName.CmpNoCase( _T( "default" ) ) ) { l_Rule.SetTarget( _T( "all" ) ); } else { l_Rule.SetTarget( l_TargetName ); } wxString l_Pre; if ( l_CommandsBeforeBuild.GetCount() > 0 ) { l_Pre = l_CmdBefore; } l_Pre += l_OutFileName.GetFullPath(); if ( l_CommandsAfterBuild.GetCount() > 0 ) { l_Pre += _T(" ") + l_CmdAfter; } l_Rule.SetPrerequisites( l_Pre ); m_Rules.Add( l_Rule ); if ( l_CommandsBeforeBuild.GetCount() > 0 ) { l_Rule.Clear(); l_Rule.SetTarget( cmdphony ); l_Rule.SetPrerequisites( l_CmdBefore ); m_Rules.Add( l_Rule ); l_Rule.Clear(); l_Rule.SetTarget( l_CmdBefore ); for ( unsigned long idx = 0; idx < l_CommandsBeforeBuild.GetCount(); idx ++ ) { l_Rule.AddCommand( l_CommandsBeforeBuild[ idx ] ); } m_Rules.Add( l_Rule ); } if ( l_CommandsAfterBuild.GetCount() > 0 ) { l_Rule.Clear(); l_Rule.SetTarget( cmdphony ); l_Rule.SetPrerequisites( l_CmdAfter ); m_Rules.Add( l_Rule ); l_Rule.Clear(); l_Rule.SetTarget( l_CmdAfter ); for ( unsigned long idx = 0; idx < l_CommandsAfterBuild.GetCount(); idx ++ ) { l_Rule.AddCommand( l_CommandsAfterBuild[ idx ] ); } m_Rules.Add( l_Rule ); } l_Rule.Clear(); l_Rule.SetTarget( l_OutFileName.GetFullPath() ); l_Rule.SetPrerequisites( _T("$(") + l_ObjsName + _T(")") ); wxString kind_of_output = _T( "unknown" ); /* ctInvalid was deleted */ /* FIXME (shl#1#): Wrongly used ctCompileObjectCmd. Can have problems . */ CommandType ct = ctCompileObjectCmd; // get rid of compiler warning switch ( p_BuildTarget->GetTargetType() ) { case ttConsoleOnly: ct = ctLinkConsoleExeCmd; kind_of_output = _T( "console executable" ); break; case ttExecutable: ct = ctLinkExeCmd; kind_of_output = _T( "executable" ); break; case ttDynamicLib: ct = ctLinkDynamicCmd; kind_of_output = _T( "dynamic library" ); break; case ttStaticLib: ct = ctLinkStaticCmd; kind_of_output = _T( "static library" ); break; case ttNative: ct = ctLinkNativeCmd; kind_of_output = _T( "native" ); break; case ttCommandsOnly: ct = ctLinkConsoleExeCmd; kind_of_output = _T( "commands only" ); break; // case ttCommandsOnly: // // add target post-build commands // ret.Clear(); // AppendArray(GetPostBuildCommands(target), ret); // return ret; // break; break; } /*if(ttCommandsOnly == lTarget->GetTargetType()) { GetPostBuildCommands(lTarget); } else*/ { l_Rule.AddCommand( _T( "echo Building " ) + kind_of_output + _T( " " ) + l_OutFileName.GetFullPath() ); wxString l_LinkerCmd = l_pCompiler->GetCommand( ct ); Manager::Get()->GetMessageManager()->DebugLog(wxString::Format( _("LinkerCmd: %s"), l_LinkerCmd.c_str()) ); l_pCompiler->GenerateCommandLine( l_LinkerCmd, p_BuildTarget, NULL, l_OutFileName.GetFullPath(), _T("$$(") + l_TargetName + _T(")"), wxEmptyString, wxEmptyString ); l_Rule.AddCommand( l_LinkerCmd ); } m_Rules.Add( l_Rule ); // Form rules wxString l_Tmp; unsigned long ii; wxString macro; wxString file; wxString object; wxString FlatObject; wxString deps; cbMGSortFilesArray files = GetProjectFilesSortedByWeight(p_BuildTarget,true,false); unsigned long lnb_files = files.GetCount(); for ( ii = 0; ii < lnb_files; ii++ ) { l_Rule.Clear(); ProjectFile* pf = files[ ii ]; const pfDetails& pfd = pf->GetFileDetails( p_BuildTarget ); wxString l_Object = ( l_pCompiler->GetSwitches().UseFlatObjects )?pfd.object_file_flat:pfd.object_file; wxString l_CompilerCmd; // lookup file's type FileType ft = FileTypeOf( pf->relativeFilename ); bool isResource = ft == ftResource; bool isHeader = ft == ftHeader; if ( !isHeader || l_pCompiler->GetSwitches().supportsPCH ) { pfCustomBuild& pcfb = pf->customBuild[l_pCompiler->GetID()]; l_CompilerCmd = pcfb.useCustomBuildCommand ? pcfb.buildCommand : l_pCompiler->GetCommand( isResource ? ctCompileResourceCmd : ctCompileObjectCmd ); wxString l_SourceFile; if ( l_pCompiler->GetSwitches().UseFullSourcePaths ) { l_SourceFile = UnixFilename( pfd.source_file_absolute_native ); // for resource files, use short from if path because if windres bug with spaces-in-paths if ( isResource ) { l_SourceFile = pf->file.GetShortPath(); } } else { l_SourceFile = pfd.source_file; } QuoteStringIfNeeded( l_SourceFile ); Manager::Get()->GetMessageManager()->DebugLog(wxString::Format( _("CompilerCmd: %s"), l_CompilerCmd.c_str()) ); /* FIXME: traps after next command */ l_pCompiler->GenerateCommandLine( l_CompilerCmd, p_BuildTarget, pf, l_SourceFile, l_Object, pfd.object_file_flat, pfd.dep_file ); if ( m_Objs.size() ) { m_Objs += _T(' '); } m_Objs += l_Object; l_Rule.SetTarget( l_Object ); l_Rule.SetPrerequisites( l_SourceFile ); l_Rule.AddCommand( _T( "echo Compiling: " ) + l_SourceFile ); l_Rule.AddCommand( l_CompilerCmd ); m_Rules.Add( l_Rule ); } } for ( unsigned long i=0; i < m_Deps.Count(); i++ ) { l_Rule.Clear(); l_Rule.SetTarget( m_Deps.GetVarName( i ) ); l_Rule.SetPrerequisites( m_Deps.GetVariable( i ) ); m_Rules.Add( l_Rule ); } l_Rule.Clear(); l_Rule.SetTarget( cmdphony ); l_Rule.SetPrerequisites( l_CmdClean ); m_Rules.Add( l_Rule ); l_Rule.Clear(); l_Rule.SetTarget( l_CmdClean ); l_Rule.AddCommand( _T( "echo Delete $(" ) + l_ObjsName + _T( ") " ) + l_OutFileName.GetFullPath() ); #ifdef __WXMSW__ l_Rule.AddCommand( _T( "-del /f $(" ) + l_ObjsName + _T( ") " ) + l_OutFileName.GetFullPath() ); #else l_Rule.AddCommand( _T( "-rm -f $(" ) + l_ObjsName + _T( ") " ) + l_OutFileName.GetFullPath() ); #endif m_Rules.Add( l_Rule ); if ( !m_VariablesIsSaved ) { m_Variables.SaveAllVars( p_File ); m_VariablesIsSaved = true; } p_File.AddLine( _T("# Target: ") + l_TargetName ); p_File.AddLine( wxEmptyString ); p_File.AddLine( l_ObjsName + _T("=") + m_Objs ); p_File.AddLine( wxEmptyString ); SaveAllRules( p_File ); p_File.AddLine( wxEmptyString ); p_File.AddLine( wxEmptyString ); l_Ret = true; return l_Ret; }