/// <summary>
/// Execute a line of code.
/// </summary>
/// <param name="sender"></param>
/// <param name="line"></param>
/// <param name="output"></param>
internal void ExecLine(Context sender, string line, StringBuilder output)
{
var log = sender.Root.Log;
string key;
Variable[] args;
int i = 0;
char c;
while (i < line.Length && !sender.ExitLine)
{
c = line[i];
++i;
switch (c)
{
case '#':
case '@':
execSplitCommand(sender, line, ref i, out key, out args);
if (key != null)
{
Variable variable = sender.Get(new Key(key, sender), log);
if (variable == null || variable.IsSet == false)
continue;
var func = variable.Value as Function;
if (func != null)
variable = func(sender, args);
// ToDo : Do we need to do anything to other value types?
// output if @
if (c == '@' && variable != null)
variable.WriteValueUser(sender, output);
}
else
{
if (c == '@' && args != null && args.Length > 0 && args[0] != null)
args[0].WriteValueUser(sender, output);
}
break;
//case '\\':
// ToDo : escape character.
//break;
default:
output.Append(c);
break;
}
}
}