Implemented an optional save function on exit
This commit is contained in:
parent
b371be43d6
commit
c7858791f4
@ -88,6 +88,7 @@ namespace Assignment_1
|
|||||||
}
|
}
|
||||||
public void StartParsing(Stream source, bool dynamicInput = false)
|
public void StartParsing(Stream source, bool dynamicInput = false)
|
||||||
{
|
{
|
||||||
|
long initSourceLength = source.Length;
|
||||||
if ((byte)source.ReadByte() == '{')
|
if ((byte)source.ReadByte() == '{')
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
@ -122,7 +123,7 @@ namespace Assignment_1
|
|||||||
switch ((statements)statementType)
|
switch ((statements)statementType)
|
||||||
{
|
{
|
||||||
case statements.exit:
|
case statements.exit:
|
||||||
result = Exit();
|
result = Exit(source, initSourceLength);
|
||||||
break;
|
break;
|
||||||
case statements.append:
|
case statements.append:
|
||||||
result = AppendSet(source);
|
result = AppendSet(source);
|
||||||
@ -169,6 +170,13 @@ namespace Assignment_1
|
|||||||
// Do a check semicolons etc
|
// Do a check semicolons etc
|
||||||
if (IsNextEoS(source))
|
if (IsNextEoS(source))
|
||||||
{
|
{
|
||||||
|
// Increment the source pos past the semi-colon
|
||||||
|
source.Position++;
|
||||||
|
if (dynamicInput)
|
||||||
|
{
|
||||||
|
// Nicely format the output stream, so we may print it cleanly
|
||||||
|
source.WriteByte((byte)'\n');
|
||||||
|
}
|
||||||
result();
|
result();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -317,10 +325,41 @@ namespace Assignment_1
|
|||||||
|
|
||||||
return () => Console.WriteLine(consoleOutput.ToString());
|
return () => Console.WriteLine(consoleOutput.ToString());
|
||||||
}
|
}
|
||||||
Action Exit()
|
Action Exit(Stream source, long initialStreamLength)
|
||||||
{
|
{
|
||||||
// Should do some save command here
|
Action exitAction = () =>
|
||||||
return () => Environment.Exit(0);
|
{
|
||||||
|
if (source.Length != initialStreamLength)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Commands list has been modified; would you like to save it to a file?");
|
||||||
|
string commandState = "";
|
||||||
|
while (commandState.ToLower() != "y" && commandState.ToLower() != "n")
|
||||||
|
{
|
||||||
|
Console.Write("Y/n: ");
|
||||||
|
commandState = Console.ReadLine();
|
||||||
|
}
|
||||||
|
if (commandState.ToLower() == "y")
|
||||||
|
{
|
||||||
|
Console.WriteLine("Enter an output file (default {0}):", Environment.CurrentDirectory);
|
||||||
|
string path = Console.ReadLine();
|
||||||
|
if (path == "")
|
||||||
|
{
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
path = Path.Combine(Environment.CurrentDirectory, path);
|
||||||
|
// insert the final closing bracket
|
||||||
|
source.WriteByte((byte)'}');
|
||||||
|
source.Position = 0;
|
||||||
|
using (FileStream fs = File.OpenWrite(path))
|
||||||
|
{
|
||||||
|
source.CopyTo(fs);
|
||||||
|
}
|
||||||
|
source.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Environment.Exit(0);
|
||||||
|
};
|
||||||
|
return exitAction;
|
||||||
}
|
}
|
||||||
Action Print(Stream source, int mode=0)
|
Action Print(Stream source, int mode=0)
|
||||||
{
|
{
|
||||||
@ -370,6 +409,7 @@ namespace Assignment_1
|
|||||||
|
|
||||||
return () => Symbols[key] = new Tuple<string, VariableFlags>(reversed.ToString(), Symbols[key].Item2);
|
return () => Symbols[key] = new Tuple<string, VariableFlags>(reversed.ToString(), Symbols[key].Item2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes the debug info to the screen in the form:<br/>
|
/// Writes the debug info to the screen in the form:<br/>
|
||||||
/// line read from stream (lineStart) to line end<br/>
|
/// line read from stream (lineStart) to line end<br/>
|
||||||
@ -379,7 +419,7 @@ namespace Assignment_1
|
|||||||
/// <param name="caratPos"></param>
|
/// <param name="caratPos"></param>
|
||||||
/// <param name="errorMessage"></param>
|
/// <param name="errorMessage"></param>
|
||||||
/// <param name="source"></param>
|
/// <param name="source"></param>
|
||||||
void WriteDebugLine(long lineStart, long caratPos, string errorMessage, Stream source)
|
static void WriteDebugLine(long lineStart, long caratPos, string errorMessage, Stream source)
|
||||||
{
|
{
|
||||||
source.Position = lineStart;
|
source.Position = lineStart;
|
||||||
string fullLine = GetNextLine(source);
|
string fullLine = GetNextLine(source);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user