using System; using System.Collections.Generic; using System.IO; using System.Text; namespace IFPSLib { /// /// Represents additional type/function metadata, similar to .NET attributes. /// public class CustomAttribute { /// /// Attribute type name /// public string Name { get; set; } /// /// Attribute arguments (indexed by constructor argument number). /// public IList Arguments { get; internal set; } = new List(); public CustomAttribute(string name) { Name = name; } internal static IList LoadList(BinaryReader br, Script script) { var listLen = br.Read(); var ret = new List(listLen); for (int idxAttr = 0; idxAttr < listLen; idxAttr++) { var nameLen = br.Read(); var attr = new CustomAttribute(br.ReadAsciiString(nameLen)); var argsLen = br.Read(); attr.Arguments = new List(argsLen); for (int idxArg = 0; idxArg < argsLen; idxArg++) { attr.Arguments.Add(TypedData.Load(br, script)); } ret.Add(attr); } return ret; } internal static void SaveList(BinaryWriter bw, IList list, Script.SaveContext ctx) { bw.Write(list.Count); for (int idxAttr = 0; idxAttr < list.Count; idxAttr++) { var attr = list[idxAttr]; bw.WriteAsciiString(attr.Name.ToUpper(), true); bw.Write(attr.Arguments.Count); for (int idxArg = 0; idxArg < attr.Arguments.Count; idxArg++) { attr.Arguments[idxArg].Save(bw, ctx); } } } public override string ToString() { var sb = new StringBuilder("["); sb.Append(Name); sb.Append('('); for (int i = 0; i < Arguments.Count; i++) { if (i != 0) sb.Append(", "); sb.Append(Arguments[i]); } sb.Append(")]"); return sb.ToString(); } } }