mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
87 lines
2.3 KiB
C#
87 lines
2.3 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using Microsoft.Build.Framework;
|
|
|
|
namespace Cosmos.Build.MSBuild {
|
|
public class NAsm : BaseToolTask {
|
|
#region Property
|
|
[Required]
|
|
public string InputFile {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
[Required]
|
|
public string OutputFile {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public bool IsELF {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
[Required]
|
|
public string ExePath {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
#endregion
|
|
|
|
private bool DoExecute()
|
|
{
|
|
var xNasmTask = new NAsmTask();
|
|
xNasmTask.InputFile = InputFile;
|
|
xNasmTask.OutputFile = OutputFile;
|
|
xNasmTask.IsELF = IsELF;
|
|
xNasmTask.ExePath = ExePath;
|
|
xNasmTask.LogMessage = s => Log.LogMessage(s);
|
|
xNasmTask.LogError = s => Log.LogError(s);
|
|
return xNasmTask.Execute();
|
|
}
|
|
|
|
public override bool Execute()
|
|
{
|
|
var xSW = Stopwatch.StartNew();
|
|
try
|
|
{
|
|
return DoExecute();
|
|
}
|
|
finally
|
|
{
|
|
xSW.Stop();
|
|
Log.LogMessage(MessageImportance.High, "NAsm task took {0}", xSW.Elapsed);
|
|
}
|
|
}
|
|
|
|
public override bool ExtendLineError(bool hasErrored, string errorMessage, out LogInfo log) {
|
|
log = new LogInfo();
|
|
try {
|
|
if (errorMessage.StartsWith(InputFile)) {
|
|
int IndexFile = errorMessage.LastIndexOf('\\', InputFile.Length);
|
|
log.file = errorMessage.Substring(IndexFile + 1, InputFile.Length - IndexFile - 1);
|
|
string[] split = errorMessage.Substring(InputFile.Length).Split(':');
|
|
if (split.Length > 3 && split[2].Contains("warning"))
|
|
log.logType = WriteType.Warning;
|
|
else
|
|
log.logType = WriteType.Error;
|
|
log.lineNumber = int.Parse(split[1]);
|
|
log.message = (split.Length == 4 ? split[3].TrimStart(' ') : string.Empty) + " Code: " + GetLine(InputFile, log.lineNumber).Trim();
|
|
}
|
|
} catch (Exception) {
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static string GetLine(string fileName, int line) {
|
|
using (var sr = new StreamReader(File.OpenRead(fileName))) {
|
|
for (int i = 1; i < line; i++)
|
|
sr.ReadLine();
|
|
return sr.ReadLine();
|
|
}
|
|
}
|
|
}
|
|
}
|