internal static Value ShovelStringRepresentation(VmApi api, Value obj) { var result = Value.Make(ShovelStringRepresentationImpl(api, obj, new HashSet <object> ())); api.CellsIncrementer(result.StringValue.Length); return(result); }
static Value HashConstructor(VmApi api, Value[] args, int start, int length) { if (args.Length % 2 != 0) { api.RaiseShovelError("Must provide an even number of arguments."); } var sizeIncrease = 1 + 2 * args.Length; api.CellsIncrementHerald(sizeIncrease); var result = new Dictionary <Value, Value> (); for (var i = start; i < start + length; i += 2) { if (args [i].Kind == Value.Kinds.String) { result [args [i]] = args [i + 1]; } else { api.RaiseShovelError("Keys must be strings"); } } api.CellsIncrementer(sizeIncrease); return(Value.Make(result)); }
static Value StringLower(VmApi api, Value str) { CheckString(api, str); api.CellsIncrementer(str.StringValue.Length); return(Value.Make(str.StringValue.ToLower())); }
static Value DecodeTime(VmApi api, Value timeInSeconds) { if (timeInSeconds.Kind != Value.Kinds.Integer) { api.RaiseShovelError ("Argument must be an integer."); } var epochTimeSpan = TimeSpan.FromSeconds (timeInSeconds.integerValue); var date = Prim0.unixEpoch + epochTimeSpan; var result = new HashInstance (); result [Value.Make ("year")] = Value.MakeInt (date.Year); result [Value.Make ("month")] = Value.MakeInt (date.Month); result [Value.Make ("day")] = Value.MakeInt (date.Day); var dayOfWeekKey = Value.Make ("dayOfWeek"); switch (date.DayOfWeek) { case DayOfWeek.Monday: result [dayOfWeekKey] = Value.MakeInt (1); break; case DayOfWeek.Tuesday: result [dayOfWeekKey] = Value.MakeInt (2); break; case DayOfWeek.Wednesday: result [dayOfWeekKey] = Value.MakeInt (3); break; case DayOfWeek.Thursday: result [dayOfWeekKey] = Value.MakeInt (4); break; case DayOfWeek.Friday: result [dayOfWeekKey] = Value.MakeInt (5); break; case DayOfWeek.Saturday: result [dayOfWeekKey] = Value.MakeInt (6); break; case DayOfWeek.Sunday: result [dayOfWeekKey] = Value.MakeInt (7); break; } result [Value.Make ("hour")] = Value.MakeInt (date.Hour); result [Value.Make ("minute")] = Value.MakeInt (date.Minute); result [Value.Make ("second")] = Value.MakeInt (date.Second); api.CellsIncrementer (8); return Value.Make (result); }
static Value ArrayConstructor(VmApi api, Value[] args, int start, int length) { var result = new ArrayInstance (); var sizeIncrease = 1 + length; api.CellsIncrementHerald (sizeIncrease); for (var i = start; i < start+length; i++) { result.Add (args [i]); } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
internal static Value ShovelStringRepresentation(VmApi api, Value obj) { var result = Value.Make (ShovelStringRepresentationImpl (api, obj, new HashSet<object> ())); api.CellsIncrementer (result.stringValue.Length); return result; }
internal static Value ShovelString(VmApi api, Value obj) { var result = ShovelStringImpl (api, obj); api.CellsIncrementer (result.Length); return Value.Make (result); }
internal static void Keys(VmApi api, ref Value hash) { if (hash.Kind != Value.Kinds.Hash) { api.RaiseShovelError ("First argument must be a hash table."); } var result = new ArrayInstance (); var sizeIncrease = 1 + hash.hashValue.Count; api.CellsIncrementHerald (sizeIncrease); result.AddRange (hash.hashValue.Keys); hash.arrayValue = result; hash.Kind = Value.Kinds.Array; api.CellsIncrementer (sizeIncrease); }
static Value Format(VmApi api, Value[] args, int start, int length) { CheckString(api, args[start]); var formatArgs = new List<object>(); for (int i = 1; i < length; i++) { var arg = args[i + start]; switch(arg.Kind) { case Value.Kinds.Array: formatArgs.Add(ShovelStringRepresentation(api, arg)); break; case Value.Kinds.Bool: formatArgs.Add(arg.boolValue); break; case Value.Kinds.Callable: api.RaiseShovelError("Cannot call 'format' on callables."); break; case Value.Kinds.Double: formatArgs.Add(arg.doubleValue); break; case Value.Kinds.Hash: formatArgs.Add(ShovelStringRepresentation(api, arg)); break; case Value.Kinds.Integer: formatArgs.Add(arg.integerValue); break; case Value.Kinds.NamedBlock: api.RaiseShovelError("Cannot call 'format' on named blocks."); break; case Value.Kinds.Null: formatArgs.Add(ShovelStringRepresentation(api, arg)); break; case Value.Kinds.ReturnAddress: api.RaiseShovelError("Cannot call 'format' on return addresses."); break; case Value.Kinds.String: formatArgs.Add(arg.stringValue); break; case Value.Kinds.Struct: formatArgs.Add(ShovelStringRepresentation(api, arg)); break; case Value.Kinds.StructInstance: formatArgs.Add(ShovelStringRepresentation(api, arg)); break; default: api.RaiseShovelError(String.Format( "'format' called with unknown value ('{0}').", arg.Kind.ToString())); break; } } api.CellsIncrementer(1); return Value.Make(String.Format(args[start].stringValue, formatArgs.ToArray())); }
static Value StructToHash(VmApi api, Value[] args, int start, int length) { if (args [start].Kind != Value.Kinds.StructInstance) { api.RaiseShovelError ("First argument must be a struct instance."); } var result = new HashInstance (); var structInstance = args [start].structInstanceValue; var ztruct = structInstance.Struct; var sizeIncrease = 1 + 2 * ztruct.Fields.Length; api.CellsIncrementHerald (sizeIncrease); for (int i = 0; i < ztruct.Fields.Length; i++) { result [Value.Make (ztruct.Fields [i])] = structInstance.Values [i]; } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
static Value StringUpper(VmApi api, Value str) { CheckString (api, str); api.CellsIncrementer (str.stringValue.Length); api.CellsIncrementer (str.stringValue.Length); return Value.Make (str.stringValue.ToUpper ()); }
static Value SizedArrayConstructor(VmApi api, Value size) { if (size.Kind != Value.Kinds.Integer) { api.RaiseShovelError ("Argument must be an integer."); } var result = new ArrayInstance (); var sizeIncrease = 1 + (int)size.integerValue; api.CellsIncrementHerald (sizeIncrease); for (var i = 0; i < size.integerValue; i++) { result.Add (Value.Make ()); } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
static Value InstantiateStruct(VmApi api, Value[] args, int start, int length) { if (length == 0) { api.RaiseShovelError ("Must provide at least one argument."); } if (args [start].Kind != Value.Kinds.Struct) { api.RaiseShovelError ("First argument must be a struct."); } var ztruct = args [start].StructValue; var sizeIncrease = 1 + ztruct.Fields.Length; api.CellsIncrementHerald (sizeIncrease); var result = new StructInstance (); result.Struct = ztruct; result.Values = new Value[ztruct.Fields.Length]; for (int i = 1; i < length; i++) { result.Values [i - 1] = args [start + i]; } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
static Value HashToStruct(VmApi api, Value[] args, int start, int length) { if (args [start].Kind != Value.Kinds.Struct) { api.RaiseShovelError ("First argument must be a struct."); } if (args [start + 1].Kind != Value.Kinds.Hash) { api.RaiseShovelError ("Second argument must be a hash."); } var ztruct = args [start].StructValue; var result = new StructInstance (); result.Struct = ztruct; result.Values = new Value[ztruct.Fields.Length]; var hash = args [start + 1].hashValue; var sizeIncrease = 1 + ztruct.Fields.Length; api.CellsIncrementHerald (sizeIncrease); for (int i = 0; i < ztruct.Fields.Length; i++) { var svKey = Value.Make (ztruct.Fields [i]); if (hash.ContainsKey (svKey)) { result.Values [i] = hash [svKey]; } } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
static Value HashConstructor(VmApi api, Value[] args, int start, int length) { if (length % 2 != 0) { api.RaiseShovelError ("Must provide an even number of arguments."); } var sizeIncrease = 1 + 2 * length; api.CellsIncrementHerald (sizeIncrease); var result = new HashInstance (); for (var i = start; i < start + length; i += 2) { if (args [i].Kind == Value.Kinds.String) { result [args [i]] = args [i + 1]; } else { api.RaiseShovelError ("Keys must be strings"); } } api.CellsIncrementer (sizeIncrease); return Value.Make (result); }
static Value GetSlice(VmApi api, Value arrayOrString, Value start, Value end) { if (start.Kind != Value.Kinds.Integer) { api.RaiseShovelError ("The start index must be an integer."); throw new InvalidOperationException (); } if (end.Kind != Value.Kinds.Integer) { api.RaiseShovelError ("The end index must be an integer."); throw new InvalidOperationException (); } if (arrayOrString.Kind == Value.Kinds.Array) { var length = arrayOrString.arrayValue.Count; var realStart = (int)start.integerValue; var realEnd = (int)end.integerValue; AdjustRealStartEnd (api, ref realStart, ref realEnd, length); api.CellsIncrementer (realEnd - realStart); return Value.Make ( arrayOrString.arrayValue.GetRange2 (realStart, realEnd - realStart)); } else if (arrayOrString.Kind == Value.Kinds.String) { var length = arrayOrString.stringValue.Length; var realStart = (int)start.integerValue; var realEnd = (int)end.integerValue; AdjustRealStartEnd (api, ref realStart, ref realEnd, length); api.CellsIncrementer (realEnd - realStart); return Value.Make ( arrayOrString.stringValue.Substring (realStart, realEnd - realStart)); } else { api.RaiseShovelError ("Argument must be a string or an array."); throw new InvalidOperationException (); } }
internal static void ArrayPush(VmApi api, ref Value array, ref Value value) { CheckVector (api, ref array); array.arrayValue.Add (value); array = value; api.CellsIncrementer (1); }
static Value Defstruct(VmApi api, Value[] args, int start, int length) { if (args [start].Kind != Value.Kinds.Array) { api.RaiseShovelError ("Argument must be an array of strings."); } var fieldNames = args [start].arrayValue; var sizeIncrease = 1 + length; api.CellsIncrementHerald (sizeIncrease); Struct newStruct = new Struct (); newStruct.Fields = new string[fieldNames.Count]; for (int i = 0; i < newStruct.Fields.Length; i++) { if (fieldNames [i].Kind != Value.Kinds.String) { api.RaiseShovelError ("Argument must be an array of strings."); } newStruct.Fields [i] = fieldNames [i].stringValue; } api.CellsIncrementer (sizeIncrease); return Value.Make (newStruct); }