mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-29 23:22:32 +00:00
83 lines
2.6 KiB
C#
83 lines
2.6 KiB
C#
using CodeImp.DoomBuilder.Config;
|
|
using CodeImp.DoomBuilder.Data;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
|
|
namespace CodeImp.DoomBuilder.Compilers
|
|
{
|
|
internal class BccCompiler : AccCompiler
|
|
{
|
|
public BccCompiler(CompilerInfo info) : base(info) { }
|
|
|
|
protected override CompileContext OnBeforeProcessStart(ProcessStartInfo info)
|
|
{
|
|
info.UseShellExecute = false;
|
|
info.CreateNoWindow = true;
|
|
info.RedirectStandardError = true;
|
|
info.RedirectStandardOutput = true;
|
|
return new CompileContext();
|
|
}
|
|
|
|
protected override void OnCheckError(HashSet<string> includes, ProcessStartInfo processinfo, Process process, CompileContext context)
|
|
{
|
|
if (process.ExitCode != 0)
|
|
{
|
|
bool foundAnyErrors = false;
|
|
string[] errorLines = process.StandardOutput.ReadToEnd().Split('\n');
|
|
|
|
foreach (string rawErrorLine in errorLines)
|
|
{
|
|
string[] rawError = rawErrorLine.Split(new char[] { ':' }, 4);
|
|
if (rawError.Length != 4)
|
|
continue;
|
|
string errorFile = rawError[0];
|
|
int errorLine;
|
|
if (!int.TryParse(rawError[1], out errorLine))
|
|
continue;
|
|
errorLine--;
|
|
// rawError[2] is ignored. in BCC, this contains the column at which the error happened. not supported in error viewer.
|
|
string errorContent = rawError[3].Trim();
|
|
|
|
// logic copied from AccCompiler
|
|
string temppath = this.tempdir.FullName + Path.DirectorySeparatorChar.ToString(); //mxd. Need trailing slash..
|
|
if (errorFile.StartsWith(temppath)) errorFile = errorFile.Replace(temppath, string.Empty);
|
|
|
|
if (!Path.IsPathRooted(errorFile))
|
|
{
|
|
//mxd. If the error is in an include file, try to find it in loaded resources
|
|
if (includes.Contains(errorFile))
|
|
{
|
|
foreach (DataReader dr in General.Map.Data.Containers)
|
|
{
|
|
if (dr is DirectoryReader && dr.FileExists(errorFile))
|
|
{
|
|
errorFile = Path.Combine(dr.Location.location, errorFile);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Add working directory to filename, so it could be recognized as map namespace lump in MapManager.CompileLump()
|
|
errorFile = Path.Combine(processinfo.WorkingDirectory, errorFile);
|
|
}
|
|
}
|
|
// end logic copied from AccCompiler
|
|
|
|
CompilerError err = new CompilerError();
|
|
err.linenumber = errorLine;
|
|
err.filename = errorFile;
|
|
err.description = errorContent;
|
|
|
|
ReportError(err);
|
|
foundAnyErrors = true;
|
|
}
|
|
|
|
if (!foundAnyErrors)
|
|
ReportError(new CompilerError(string.Join(Environment.NewLine, errorLines)));
|
|
}
|
|
}
|
|
}
|
|
}
|