summaryrefslogtreecommitdiffstats
path: root/src/languages/gplink.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/languages/gplink.cpp')
-rw-r--r--src/languages/gplink.cpp174
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 *
+ * *
+ * 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;
+}
+
+
+