diff options
Diffstat (limited to 'src/languages/gplink.cpp')
-rw-r--r-- | src/languages/gplink.cpp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/languages/gplink.cpp b/src/languages/gplink.cpp new file mode 100644 index 0000000..548449a --- /dev/null +++ b/src/languages/gplink.cpp @@ -0,0 +1,174 @@ +/*************************************************************************** + * Copyright (C) 2005 by David Saxton * + * david@bluehaze.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#include "gplink.h" +#include "languagemanager.h" +#include "logview.h" + +#include <klocale.h> +#include <kmessagebox.h> +#include <kprocess.h> + +Gplink::Gplink( ProcessChain *processChain, KTechlab * parent ) + : ExternalLanguage( processChain, parent, "Gpasm" ) +{ + m_successfulMessage = i18n("*** Linking successful ***"); + m_failedMessage = i18n("*** Linking failed ***"); +} + + +Gplink::~Gplink() +{ +} + + +void Gplink::processInput( ProcessOptions options ) +{ + resetLanguageProcess(); + m_processOptions = options; + + *m_languageProcess << ("gplink"); + + if ( !options.m_hexFormat.isEmpty() ) + { + *m_languageProcess << ("--hex-format"); + *m_languageProcess << (options.m_hexFormat); + } + + if ( options.m_bOutputMapFile ) + *m_languageProcess << ("--map"); + + if ( !options.m_libraryDir.isEmpty() ) + { + *m_languageProcess << ("--include"); + *m_languageProcess << ( options.m_libraryDir ); + } + + if ( !options.m_linkerScript.isEmpty() ) + { + *m_languageProcess << ("--script"); + *m_languageProcess << ( options.m_linkerScript ); + } + + if ( !options.m_linkOther.isEmpty() ) + *m_languageProcess << (options.m_linkOther); + + // Output hex file + *m_languageProcess << ("--output"); + *m_languageProcess << ( options.intermediaryOutput() ); + + // Input object file + const QStringList inputFiles = options.inputFiles(); + QStringList::const_iterator end = inputFiles.end(); + for ( QStringList::const_iterator it = inputFiles.begin(); it != end; ++it ) + *m_languageProcess << ( *it ); + + // Other libraries + end = options.m_linkLibraries.end(); + for ( QStringList::const_iterator it = options.m_linkLibraries.begin(); it != end; ++it ) + *m_languageProcess << ( *it ); + + if ( !start() ) + { + KMessageBox::sorry( LanguageManager::self()->logView(), i18n("Linking failed. Please check you have gputils installed.") ); + processInitFailed(); + return; + } +} + + +bool Gplink::isError( const QString &message ) const +{ + return message.contains( "Error", false ); +} + + +bool Gplink::isWarning( const QString &message ) const +{ + return message.contains( "Warning", false ); +} + + +MessageInfo Gplink::extractMessageInfo( const QString &text ) +{ +#if 0 + if ( text.length()<5 || !text.startsWith("/") ) + return MessageInfo(); + + const int index = text.find( ".asm", 0, false )+4; + if ( index == -1+4 ) + return MessageInfo(); + const QString fileName = text.left(index); + + // Extra line number + const QString message = text.right(text.length()-index); + const int linePos = message.find( QRegExp(":[\\d]+") ); + int line = -1; + if ( linePos != -1 ) + { + const int linePosEnd = message.find( ':', linePos+1 ); + if ( linePosEnd != -1 ) + { + const QString number = message.mid( linePos+1, linePosEnd-linePos-1 ).stripWhiteSpace(); + bool ok; + line = number.toInt(&ok)-1; + if (!ok) line = -1; + } + } + return MessageInfo( fileName, line ); +#endif + return MessageInfo(); +} + + + +ProcessOptions::ProcessPath::Path Gplink::outputPath( ProcessOptions::ProcessPath::Path inputPath ) const +{ + switch (inputPath) + { + case ProcessOptions::ProcessPath::Object_PIC: + return ProcessOptions::ProcessPath::Program_PIC; + + case ProcessOptions::ProcessPath::Object_Program: + return ProcessOptions::ProcessPath::None; + + case ProcessOptions::ProcessPath::AssemblyAbsolute_PIC: + case ProcessOptions::ProcessPath::AssemblyAbsolute_Program: + case ProcessOptions::ProcessPath::AssemblyRelocatable_Library: + case ProcessOptions::ProcessPath::AssemblyRelocatable_Object: + case ProcessOptions::ProcessPath::AssemblyRelocatable_PIC: + case ProcessOptions::ProcessPath::AssemblyRelocatable_Program: + case ProcessOptions::ProcessPath::C_AssemblyRelocatable: + case ProcessOptions::ProcessPath::C_Library: + case ProcessOptions::ProcessPath::C_Object: + case ProcessOptions::ProcessPath::C_PIC: + case ProcessOptions::ProcessPath::C_Program: + case ProcessOptions::ProcessPath::FlowCode_AssemblyAbsolute: + case ProcessOptions::ProcessPath::FlowCode_Microbe: + case ProcessOptions::ProcessPath::FlowCode_PIC: + case ProcessOptions::ProcessPath::FlowCode_Program: + case ProcessOptions::ProcessPath::Microbe_AssemblyAbsolute: + case ProcessOptions::ProcessPath::Microbe_PIC: + case ProcessOptions::ProcessPath::Microbe_Program: + case ProcessOptions::ProcessPath::Object_Disassembly: + case ProcessOptions::ProcessPath::Object_Library: + case ProcessOptions::ProcessPath::PIC_AssemblyAbsolute: + case ProcessOptions::ProcessPath::Program_Disassembly: + case ProcessOptions::ProcessPath::Program_PIC: + case ProcessOptions::ProcessPath::Invalid: + case ProcessOptions::ProcessPath::None: + return ProcessOptions::ProcessPath::Invalid; + } + + return ProcessOptions::ProcessPath::Invalid; +} + + + |