File indexing completed on 2024-12-08 11:07:02
0001 /*************************************************************************** 0002 * Copyright (C) 2005 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #ifndef LANGUAGE_H 0012 #define LANGUAGE_H 0013 0014 #include <QObject> 0015 #include <QStringList> 0016 0017 class FlowCodeDocument; 0018 class KTechlab; 0019 class LogView; 0020 class MessageInfo; 0021 class MicroSettings; 0022 class OutputMethodInfo; 0023 class ProcessChain; 0024 class ProcessOptions; 0025 class TextDocument; 0026 class QProcess; 0027 0028 typedef QList<ProcessOptions> ProcessOptionsList; 0029 0030 class ProcessOptionsSpecial 0031 { 0032 public: 0033 ProcessOptionsSpecial(); 0034 0035 bool b_addToProject; 0036 bool b_forceList; 0037 QString m_picID; 0038 FlowCodeDocument *p_flowCodeDocument; 0039 0040 // Linking 0041 QString m_hexFormat; 0042 bool m_bOutputMapFile; 0043 QString m_libraryDir; 0044 QString m_linkerScript; 0045 QStringList m_linkLibraries; 0046 QString m_linkOther; 0047 0048 // Programming 0049 QString m_port; 0050 QString m_program; 0051 }; 0052 0053 class ProcessOptionsHelper : public QObject 0054 { 0055 Q_OBJECT 0056 #define protected public 0057 signals: 0058 #undef protected 0059 void textOutputtedTo(TextDocument *outputtedTo); 0060 }; 0061 0062 class ProcessOptions : public ProcessOptionsSpecial 0063 { 0064 public: 0065 ProcessOptions(); 0066 ProcessOptions(OutputMethodInfo info); 0067 0068 class ProcessPath 0069 { 0070 public: 0071 enum MediaType { 0072 AssemblyAbsolute, 0073 AssemblyRelocatable, 0074 C, 0075 Disassembly, 0076 FlowCode, 0077 Library, 0078 Microbe, 0079 Object, 0080 Pic, 0081 Program, 0082 0083 Unknown // Used for guessing the media type 0084 }; 0085 0086 enum Path // From_To // processor that will be invoked first 0087 { AssemblyAbsolute_PIC, // gpasm (indirect) 0088 AssemblyAbsolute_Program, // gpasm (direct) 0089 0090 AssemblyRelocatable_Library, // gpasm (indirect) 0091 AssemblyRelocatable_Object, // gpasm (direct) 0092 AssemblyRelocatable_PIC, // gpasm (indirect) 0093 AssemblyRelocatable_Program, // gpasm (indirect) 0094 0095 C_AssemblyRelocatable, // sdcc (direct) 0096 C_Library, // sdcc (indirect) 0097 C_Object, // sdcc (indirect) 0098 C_PIC, // sdcc (indirect) 0099 C_Program, // sdcc (indirect) 0100 0101 FlowCode_AssemblyAbsolute, // flowcode (indirect) 0102 FlowCode_Microbe, // flowcode (direct) 0103 FlowCode_PIC, // flowcode (indirect) 0104 FlowCode_Program, // flowcode (indirect) 0105 0106 Microbe_AssemblyAbsolute, // microbe (direct) 0107 Microbe_PIC, // microbe (indirect) 0108 Microbe_Program, // microbe (indirect) 0109 0110 Object_Disassembly, // gpdasm (direct) 0111 Object_Library, // gplib (direct) 0112 Object_PIC, // gplink (indirect) 0113 Object_Program, // gplink (direct) 0114 0115 PIC_AssemblyAbsolute, // download from pic (direct) 0116 0117 Program_Disassembly, // gpdasm (direct) 0118 Program_PIC, // upload to pic (direct) 0119 0120 Invalid, // From and to types are incompatible 0121 None // From and to types are the same 0122 }; 0123 0124 static Path path(MediaType from, MediaType to); 0125 static MediaType from(Path path); 0126 static MediaType to(Path path); 0127 }; 0128 0129 class Method 0130 { 0131 public: 0132 enum type { 0133 Forget, // Don't do anything after processing successfully 0134 LoadAsNew, // Load the output as a new file 0135 Load // Load the output file 0136 }; 0137 }; 0138 0139 /** 0140 * Tries to guess the media type from the url (and possible the contents 0141 * of the file as well). 0142 * @param url a path to a file in the local filesystem 0143 */ 0144 static ProcessPath::MediaType guessMediaType(const QString &url); 0145 /** 0146 * The *final* target file (not any intermediatary ones) 0147 */ 0148 QString targetFile() const 0149 { 0150 return m_targetFile; 0151 } 0152 /** 0153 * This sets the final target file, as well as the initial intermediatary one 0154 */ 0155 void setTargetFile(const QString &file); 0156 0157 void setIntermediaryOutput(const QString &file) 0158 { 0159 m_intermediaryFile = file; 0160 } 0161 QString intermediaryOutput() const 0162 { 0163 return m_intermediaryFile; 0164 } 0165 0166 /** 0167 * As paths in local filesystem 0168 */ 0169 void setInputFiles(const QStringList &files) 0170 { 0171 m_inputFiles = files; 0172 } 0173 QStringList inputFiles() const 0174 { 0175 return m_inputFiles; 0176 } 0177 0178 void setMethod(Method::type method) 0179 { 0180 m_method = method; 0181 } 0182 Method::type method() const 0183 { 0184 return m_method; 0185 } 0186 0187 void setProcessPath(ProcessPath::Path path) 0188 { 0189 m_processPath = path; 0190 } 0191 ProcessPath::Path processPath() const 0192 { 0193 return m_processPath; 0194 } 0195 0196 /** 0197 * If the output is text; If the user has selected (in config options) 0198 * ReuseSameViewForOutput, then the given TextDocument will have its 0199 * text set to the output if the TextDocument is not modified and has 0200 * an empty url. Otherwise a new TextDocument will be created. Either 0201 * way, once the processing has finished, a signal will be emitted 0202 * to the given receiver passing a TextDocument * as an argument. This 0203 * is not to be confused with setTextOutputtedTo, which is called once 0204 * the processing has finished, and will call-back to the slot given. 0205 */ 0206 void setTextOutputTarget(TextDocument *target, QObject *receiver, const char *slot); 0207 /** 0208 * @see setTextOutputTarget 0209 */ 0210 TextDocument *textOutputTarget() const 0211 { 0212 return m_pTextOutputTarget; 0213 } 0214 /** 0215 * @see setTextOuputTarget 0216 */ 0217 void setTextOutputtedTo(TextDocument *outputtedTo); 0218 0219 protected: 0220 TextDocument *m_pTextOutputTarget; 0221 ProcessOptionsHelper *m_pHelper; 0222 bool b_targetFileSet; 0223 QStringList m_inputFiles; 0224 QString m_targetFile; 0225 QString m_intermediaryFile; 0226 Method::type m_method; 0227 ProcessPath::Path m_processPath; 0228 }; 0229 0230 /** 0231 @author Daniel Clarke 0232 @author David Saxton 0233 */ 0234 class Language : public QObject 0235 { 0236 Q_OBJECT 0237 public: 0238 Language(ProcessChain *processChain, const QString &name); 0239 ~Language() override; 0240 0241 /** 0242 * Compile / assemble / dissassembly / whatever the given input. 0243 */ 0244 virtual void processInput(ProcessOptions options) = 0; 0245 /** 0246 * Return the ProcessOptions object current state 0247 */ 0248 ProcessOptions processOptions() const 0249 { 0250 return m_processOptions; 0251 } 0252 /** 0253 * Return the output path from the given input path. Will return None 0254 * if we've done processing. 0255 */ 0256 virtual ProcessOptions::ProcessPath::Path outputPath(ProcessOptions::ProcessPath::Path inputPath) const = 0; 0257 0258 signals: 0259 /** 0260 * Emitted when the processing was successful. 0261 * @param language Pointer to this class 0262 */ 0263 void processSucceeded(Language *language); 0264 /** 0265 * Emitted when the processing failed. 0266 * @param language Pointer to this class 0267 */ 0268 void processFailed(Language *language); 0269 0270 protected: 0271 /** 0272 * Examines the string for the line number if applicable, and creates a new 0273 * MessageInfo for it. 0274 */ 0275 virtual MessageInfo extractMessageInfo(const QString &text); 0276 0277 /** 0278 * Reset the error count 0279 */ 0280 void reset(); 0281 void outputMessage(const QString &message); 0282 void outputWarning(const QString &message); 0283 void outputError(const QString &error); 0284 void finish(bool successful); 0285 0286 int m_errorCount; 0287 ProcessOptions m_processOptions; 0288 ProcessChain *p_processChain; 0289 0290 /** 0291 * A message appropriate to the language's success after compilation or similar. 0292 */ 0293 QString m_successfulMessage; 0294 /** 0295 * A message appropriate to the language's failure after compilation or similar. 0296 */ 0297 QString m_failedMessage; 0298 }; 0299 0300 #endif