Skip to content
This repository has been archived by the owner on Feb 26, 2022. It is now read-only.
/ rant3 Public archive

Commit

Permalink
Implement a few instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicholas Fleck committed Jun 9, 2016
1 parent 676ec50 commit d92f0f8
Show file tree
Hide file tree
Showing 18 changed files with 697 additions and 133 deletions.
2 changes: 1 addition & 1 deletion Rant/Internal/Engine/RantFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
using Rant.Internal.Engine.Constructs;
using Rant.Internal.Engine.Formatters;
using Rant.Internal.Engine.Metadata;
using Rant.Internal.Engine.Output;
using Rant.Internal.Engine.Syntax;
using Rant.Internal.VM.Output;
using Rant.Vocabulary;

using exec = System.Collections.Generic.IEnumerator<Rant.Internal.Engine.Syntax.RantAction>;
Expand Down
2 changes: 1 addition & 1 deletion Rant/Internal/Engine/Sandbox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
using Rant.Formats;
using Rant.Internal.Engine.Constructs;
using Rant.Internal.Engine.ObjectModel;
using Rant.Internal.Engine.Output;
using Rant.Internal.Engine.Syntax;
using Rant.Internal.Engine.Syntax.Richard;
using Rant.Internal.VM.Output;
using Rant.Vocabulary;

namespace Rant.Internal.Engine
Expand Down
13 changes: 13 additions & 0 deletions Rant/Internal/VM/CallFrame.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;

namespace Rant.Internal.VM
{
internal class CallFrame
{
// TODO: Query args
public string QueryTableName = String.Empty;
public int Position = 0;

}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Rant.Internal.VM.Instructions
{
internal enum OpCodes : byte
internal enum RantOpCode : byte
{
/// <summary>
/// Debug-mode data provider. Sets the current position within the source code at which the next instruction takes place.
Expand All @@ -25,7 +25,7 @@ internal enum OpCodes : byte
OpenChannelConstant = 0x03,
/// <summary>
/// Closes a channel with a name equal to the string at the specified string table index.
/// <para>close [int table_index]</para>
/// <para>close</para>
/// </summary>
CloseChannelConstant = 0x04,
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using Rant.Internal.Engine.Metadata;

namespace Rant.Internal.Engine.Output
namespace Rant.Internal.VM.Output
{
/// <summary>
/// Provides visibility settings for output channels.
/// </summary>
public enum ChannelVisibility
public enum ChannelVisibility : byte
{
/// <summary>
/// Channel outputs to itself and 'main'.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@
using System.Collections.Generic;
using System.Text;

namespace Rant.Internal.Engine.Output
using Rant.Internal.Engine;

namespace Rant.Internal.VM.Output
{
/// <summary>
/// Specially designed linked list for storing targets and output buffers, with support for change events for auto-formatting functionality.
/// </summary>
internal class OutputChain
{
// Engine
private readonly Sandbox sandbox;
private readonly RVM _vm;

// Targets
private readonly Dictionary<string, OutputChainBuffer> targets = new Dictionary<string, OutputChainBuffer>();
Expand All @@ -25,17 +27,17 @@ internal class OutputChain
public ChannelVisibility Visibility { get; set; } = ChannelVisibility.Public;
public string Name { get; }

public OutputChain(Sandbox sb, string name)
public OutputChain(RVM vm, string name)
{
sandbox = sb;
_first = new OutputChainBuffer(sb, null);
_vm = vm;
_first = new OutputChainBuffer(vm, null);
_last = _first;
Name = name;
}

public OutputChainBuffer AddBuffer()
{
return _last = new OutputChainBuffer(sandbox, _last);
return _last = new OutputChainBuffer(_vm, _last);
}

public void InsertTarget(string targetName)
Expand All @@ -50,7 +52,7 @@ public void InsertTarget(string targetName)
else
{
// If it does exist, just create a new instance of it with the same buffer and add it in.
_last = new OutputChainBuffer(sandbox, _last, buffer);
_last = new OutputChainBuffer(_vm, _last, buffer);
}

// Then add an empty buffer after it so we don't start printing onto the target.
Expand All @@ -62,7 +64,7 @@ public void PrintToTarget(string targetName, string value)
OutputChainBuffer buffer;
if (!targets.TryGetValue(targetName, out buffer))
{
buffer = targets[targetName] = new OutputChainBuffer(sandbox, null);
buffer = targets[targetName] = new OutputChainBuffer(_vm, null);
}

buffer.Print(value);
Expand Down Expand Up @@ -102,7 +104,7 @@ public void Print(object obj)
public OutputChainBuffer AddArticleBuffer()
{
// If the last buffer is empty, just replace it.
var b = _last = new OutputChainArticleBuffer(sandbox, _last);
var b = _last = new OutputChainArticleBuffer(_vm, _last);
return b;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Linq;

namespace Rant.Internal.Engine.Output
namespace Rant.Internal.VM.Output
{
internal class OutputChainArticleBuffer : OutputChainBuffer
{
Expand All @@ -17,12 +17,12 @@ internal class OutputChainArticleBuffer : OutputChainBuffer
private static readonly string[] allowWords =
{ "f", "fbi", "fcc", "fda", "x", "l", "m", "n", "s", "h" };

public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev) : base(sb, prev)
public OutputChainArticleBuffer(RVM vm, OutputChainBuffer prev) : base(vm, prev)
{
Initialize();
}

public OutputChainArticleBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin) : base(sb, prev, targetOrigin)
public OutputChainArticleBuffer(RVM vm, OutputChainBuffer prev, OutputChainBuffer targetOrigin) : base(vm, prev, targetOrigin)
{
Initialize();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
using System.Collections.Generic;
using System.Text;

using Rant.Internal.Engine;
using Rant.Internal.Engine.Formatters;
using Rant.Internal.IO;

namespace Rant.Internal.Engine.Output
namespace Rant.Internal.VM.Output
{
internal class OutputChainBuffer
{
Expand All @@ -15,7 +16,7 @@ internal class OutputChainBuffer
private static readonly HashSet<char> sentenceTerminators
= new HashSet<char>(new[] { '.', '?', '!' });

private readonly Sandbox sandbox;
private readonly RVM _vm;
protected readonly StringBuilder _buffer;
private readonly OutputChainBuffer _prevItem;
private OutputChainBuffer _nextItem;
Expand Down Expand Up @@ -44,7 +45,7 @@ public Capitalization Caps

protected bool PrintedSinceCapsChange => _printedSinceCapsChange;

public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev)
public OutputChainBuffer(RVM vm, OutputChainBuffer prev)
{
_prevItem = prev;

Expand All @@ -60,10 +61,10 @@ public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev)

_isTarget = true;
_buffer = new StringBuilder(InitialCapacity);
sandbox = sb;
_vm = vm;
}

public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer targetOrigin)
public OutputChainBuffer(RVM vm, OutputChainBuffer prev, OutputChainBuffer targetOrigin)
{
_prevItem = prev;

Expand All @@ -74,7 +75,7 @@ public OutputChainBuffer(Sandbox sb, OutputChainBuffer prev, OutputChainBuffer t
}

_buffer = targetOrigin._buffer;
sandbox = sb;
_vm = vm;
}

public NumberFormatter NumberFormatter => _numberFormatter;
Expand Down Expand Up @@ -126,8 +127,8 @@ public void Print(object value)

private void UpdateSize()
{
if (sandbox.SizeLimit.Accumulate(_buffer.Length - oldSize))
throw new InvalidOperationException($"Exceeded character limit ({sandbox.SizeLimit.Maximum})");
if (_vm.SizeLimit.Accumulate(_buffer.Length - oldSize))
throw new InvalidOperationException($"Exceeded character limit ({_vm.SizeLimit.Maximum})");
oldSize = _buffer.Length;
}

Expand All @@ -138,7 +139,7 @@ public void Clear()
#else
_buffer.Clear();
#endif
sandbox.SizeLimit.Accumulate(-oldSize);
_vm.SizeLimit.Accumulate(-oldSize);
oldSize = 0;
}

Expand Down Expand Up @@ -214,7 +215,7 @@ protected void Format(ref string value)
return;
}
// If it's not capitalizable in a title, skip it.
if (sandbox.Format.Excludes(value) && boundary) return;
if (_vm.Format.Excludes(value) && boundary) return;

CapitalizeFirstLetter(ref value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@

using Rant.Internal.Engine.Formatters;

namespace Rant.Internal.Engine.Output
namespace Rant.Internal.VM.Output
{
internal class OutputWriter
{
private readonly Sandbox sandbox;
private readonly RVM _vm;
private readonly OutputChain mainChain;
private readonly Dictionary<string, OutputChain> chains = new Dictionary<string, OutputChain>();
private readonly Stack<OutputChain> chainStack = new Stack<OutputChain>();
private readonly HashSet<OutputChain> activeChains = new HashSet<OutputChain>();

private const string MainChannelName = "main";

public OutputWriter(Sandbox sb)
public OutputWriter(RVM vm)
{
sandbox = sb;
mainChain = chains[MainChannelName] = new OutputChain(sb, MainChannelName);
_vm = vm;
mainChain = chains[MainChannelName] = new OutputChain(_vm, MainChannelName);
chainStack.Push(mainChain);
activeChains.Add(mainChain);
}
Expand All @@ -35,7 +35,7 @@ public void OpenChannel(string name, ChannelVisibility visibility)
OutputChain chain;
if (!chains.TryGetValue(name, out chain))
{
chain = chains[name] = new OutputChain(sandbox, name);
chain = chains[name] = new OutputChain(_vm, name);
}
else if (activeChains.Contains(chain))
{
Expand Down Expand Up @@ -81,6 +81,6 @@ public void Do(Action<OutputChain> chainAction)

public void PrintToTarget(string targetName, string value) => Do(chain => chain.PrintToTarget(targetName, value));

public RantOutput ToRantOutput() => new RantOutput(sandbox.RNG.Seed, sandbox.StartingGen, chains.Values);
public RantOutput ToRantOutput() => new RantOutput(_vm.RNG.Seed, _vm.StartingGen, chains.Values);
}
}

0 comments on commit d92f0f8

Please sign in to comment.