Ejemplo n.º 1
0
        public void DebugDump(TextWriter writer, Story story)
        {
            if (Name.Length > 0)
            {
                if (Negate) writer.Write("!");
                writer.Write("{0}(", Name);
                if (Parameters != null)
                {
                    for (var i = 0; i < Parameters.Count; i++)
                    {
                        Parameters[i].DebugDump(writer, story);
                        if (i < Parameters.Count - 1) writer.Write(", ");
                    }
                }

                writer.Write(") ");
            }

            if (GoalIdOrDebugHook != 0)
            {
                if (GoalIdOrDebugHook < 0)
                {
                    writer.Write("<Debug hook #{0}>", -GoalIdOrDebugHook);
                }
                else
                {
                    var goal = story.Goals[(uint)GoalIdOrDebugHook];
                    writer.Write("<Complete goal #{0} {1}>", GoalIdOrDebugHook, goal.Name);
                }
            }
        }
Ejemplo n.º 2
0
Archivo: Rel.cs Proyecto: Norbyte/lslib
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            writer.Write("   ");
            if (ParentRef.IsValid())
            {
                writer.Write(" Parent ");
                ParentRef.DebugDump(writer, story);
            }

            if (AdapterRef.IsValid())
            {
                writer.Write(" Adapter ");
                AdapterRef.DebugDump(writer, story);
            }

            if (RelDatabaseRef.IsValid())
            {
                writer.Write(" Database ");
                RelDatabaseRef.DebugDump(writer, story);
                writer.Write(" Flag {0}", RelDatabaseFlag);
                writer.Write(" Entry ");
                RelDatabase.DebugDump(writer, story);
            }

            writer.WriteLine("");
        }
Ejemplo n.º 3
0
        public override void MakeScript(TextWriter writer, Story story, Tuple tuple)
        {
            var adaptedTuple = story.Adapters[AdapterRef.AdapterIndex].Adapt(tuple);
            story.Nodes[ParentRef.NodeIndex].MakeScript(writer, story, adaptedTuple);
            writer.WriteLine("AND");

            if (Value1Index != -1)
                adaptedTuple.Logical[Value1Index].MakeScript(writer, story, tuple);
            else
                Value1.MakeScript(writer, story, tuple);

            switch (RelOp)
            {
                case RelOpType.Less: writer.Write(" < "); break;
                case RelOpType.LessOrEqual: writer.Write(" <= "); break;
                case RelOpType.Greater: writer.Write(" > "); break;
                case RelOpType.GreaterOrEqual: writer.Write(" >= "); break;
                case RelOpType.Equal: writer.Write(" == "); break;
                case RelOpType.NotEqual: writer.Write(" != "); break;
            }

            if (Value2Index != -1)
                adaptedTuple.Logical[Value2Index].MakeScript(writer, story, tuple);
            else
                Value2.MakeScript(writer, story, tuple);
            writer.WriteLine();
        }
Ejemplo n.º 4
0
 public void DebugDump(TextWriter writer, Story story)
 {
     for (var i = 0; i < Types.Count; i++)
     {
         writer.Write(story.Types[Types[i]].Name);
         if (i < Types.Count - 1) writer.Write(", ");
     }
 }
Ejemplo n.º 5
0
 public void DebugDump(TextWriter writer, Story story)
 {
     if (!IsValid())
     {
         writer.Write("(None)");
     }
     else
     {
         writer.Write("#{0}", AdapterIndex);
     }
 }
Ejemplo n.º 6
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            writer.Write("    Left:");
            if (LeftParentRef.IsValid())
            {
                writer.Write(" Parent ");
                LeftParentRef.DebugDump(writer, story);
            }

            if (Adapter1Ref.IsValid())
            {
                writer.Write(" Adapter ");
                Adapter1Ref.DebugDump(writer, story);
            }

            if (Database1Ref.IsValid())
            {
                writer.Write(" Database ");
                Database1Ref.DebugDump(writer, story);
                writer.Write(" Flag {0}", Database1Flag);
                writer.Write(" Entry ");
                Database1.DebugDump(writer, story);
            }

            writer.WriteLine("");

            writer.Write("    Right:");
            if (RightParentRef.IsValid())
            {
                writer.Write(" Parent ");
                RightParentRef.DebugDump(writer, story);
            }

            if (Adapter2Ref.IsValid())
            {
                writer.Write(" Adapter ");
                Adapter2Ref.DebugDump(writer, story);
            }

            if (Database2Ref.IsValid())
            {
                writer.Write(" Database ");
                Database2Ref.DebugDump(writer, story);
                writer.Write(" Flag {0}", Database2Flag);
                writer.Write(" Entry ");
                Database2.DebugDump(writer, story);
            }

            writer.WriteLine("");
        }
Ejemplo n.º 7
0
 public void DebugDump(TextWriter writer, Story story)
 {
     writer.Write(Name);
     writer.Write("(");
     for (var i = 0; i < Parameters.Types.Count; i++)
     {
         var type = story.Types[Parameters.Types[i]];
         var isOutParam = ((OutParamMask[i >> 3] << (i & 7)) & 0x80) == 0x80;
         if (isOutParam) writer.Write("out ");
         writer.Write(type.Name);
         if (i < Parameters.Types.Count - 1) writer.Write(", ");
     }
     writer.Write(")");
 }
Ejemplo n.º 8
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            if (ReferencedBy.Count > 0)
            {
                writer.WriteLine("    Referenced By:");
                foreach (var entry in ReferencedBy)
                {
                    writer.Write("        ");
                    entry.DebugDump(writer, story);
                    writer.WriteLine("");
                }
            }
        }
Ejemplo n.º 9
0
        public void DebugDump(TextWriter writer, Story story)
        {
            writer.WriteLine("{0}: SGC {1}, Unknown {2}", Name, SubGoalCombination, Unknown);

            if (ParentGoals.Count > 0)
            {
                writer.Write("    Parent goals: ");
                foreach (var goalId in ParentGoals)
                {
                    var goal = story.Goals[goalId];
                    writer.Write("#{0} {1}, ", goalId, goal.Name);
                }
                writer.WriteLine();
            }

            if (SubGoals.Count > 0)
            {
                writer.Write("    Subgoals: ");
                foreach (var goalId in SubGoals)
                {
                    var goal = story.Goals[goalId];
                    writer.Write("#{0} {1}, ", goalId, goal.Name);
                }
                writer.WriteLine();
            }

            if (InitCalls.Count > 0)
            {
                writer.WriteLine("    Init Calls: ");
                foreach (var call in InitCalls)
                {
                    writer.Write("        ");
                    call.DebugDump(writer, story);
                    writer.WriteLine();
                }
            }

            if (ExitCalls.Count > 0)
            {
                writer.WriteLine("    Exit Calls: ");
                foreach (var call in ExitCalls)
                {
                    writer.Write("        ");
                    call.DebugDump(writer, story);
                    writer.WriteLine();
                }
            }
        }
Ejemplo n.º 10
0
        public virtual void DebugDump(TextWriter writer, Story story)
        {
            if (Name.Length > 0)
            {
                writer.Write("{0}/{1}: ", Name, NameIndex);
            }

            writer.Write("<{0}>", TypeName());
            if (DatabaseRef.IsValid())
            {
                writer.Write(", Database ");
                DatabaseRef.DebugDump(writer, story);
            }

            writer.WriteLine();
        }
Ejemplo n.º 11
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            writer.Write("    Left Value: ");
            if (Value1Index != -1)
                writer.Write("[Source Column {0}]", Value1Index);
            else
                Value1.DebugDump(writer, story);
            writer.WriteLine();

            writer.Write("    Right Value: ");
            if (Value2Index != -1)
                writer.Write("[Source Column {0}]", Value2Index);
            else
                Value2.DebugDump(writer, story);
            writer.WriteLine();
        }
Ejemplo n.º 12
0
 public void DebugDump(TextWriter writer, Story story)
 {
     if (!IsValid())
     {
         writer.Write("(None)");
     }
     else
     {
         var node = story.Nodes[NodeIndex];
         if (node.Name.Length > 0)
         {
             writer.Write("#{0} <{1}/{2} {3}>", NodeIndex, node.Name, node.NameIndex, node.TypeName());
         }
         else
         {
             writer.Write("#{0} <{1}>", NodeIndex, node.TypeName());
         }
     }
 }
Ejemplo n.º 13
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            writer.WriteLine("    Variables: ");
            foreach (var v in Variables)
            {
                writer.Write("        ");
                v.DebugDump(writer, story);
                writer.WriteLine("");
            }

            writer.WriteLine("    Calls: ");
            foreach (var call in Calls)
            {
                writer.Write("        ");
                call.DebugDump(writer, story);
                writer.WriteLine("");
            }
        }
Ejemplo n.º 14
0
 public virtual void PostSave(Story story)
 {
 }
Ejemplo n.º 15
0
        public virtual void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false)
        {
            switch ((Type)TypeId)
            {
                case Type.Unknown:
                    throw new InvalidDataException("Script cannot contain unknown values");

                case Type.Integer:
                    writer.Write(IntValue);
                    break;

                case Type.Float:
                    writer.Write(FloatValue);
                    break;

                case Type.String:
                    writer.Write("\"{0}\"", StringValue);
                    break;

                default:
                    writer.Write(StringValue);
                    break;
            }
        }
Ejemplo n.º 16
0
 public Goal(Story story)
 {
     Story = story;
 }
Ejemplo n.º 17
0
        public void MakeScript(TextWriter writer, Story story, Tuple tuple)
        {
            if (Name.Length > 0)
            {
                if (Negate) writer.Write("NOT ");
                writer.Write("{0}(", Name);
                if (Parameters != null)
                {
                    for (var i = 0; i < Parameters.Count; i++)
                    {
                        var param = Parameters[i];
                        param.MakeScript(writer, story, tuple);
                        if (i < Parameters.Count - 1)
                            writer.Write(", ");
                    }
                }

                writer.Write(")");
            }

            if (GoalIdOrDebugHook > 0)
            {
                writer.Write("GoalCompleted;");
            }
        }
Ejemplo n.º 18
0
 public void MakeScript(TextWriter writer, Story story, bool printTypes = false)
 {
     for (var i = 0; i < Physical.Count; i++)
     {
         var value = Physical[i];
         value.MakeScript(writer, story, null, printTypes);
         if (i < Physical.Count - 1)
             writer.Write(", ");
     }
 }
Ejemplo n.º 19
0
        public void Visit(Story story)
        {
            using (var streamWriter = new StreamWriter(stream))
                using (this.writer = new JsonTextWriter(streamWriter))
                {
                    writer.IndentChar  = '\t';
                    writer.Indentation = 1;
                    writer.Formatting  = Newtonsoft.Json.Formatting.Indented;

                    writer.WriteStartObject();

                    writer.WritePropertyName("types");
                    writer.WriteStartObject();
                    foreach (var type in story.Types)
                    {
                        writer.WritePropertyName(type.Key.ToString());
                        Visit(type.Value);
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("objects");
                    writer.WriteStartObject();
                    foreach (var obj in story.DivObjects)
                    {
                        writer.WritePropertyName(obj.Name);
                        Visit(obj);
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("functions");
                    writer.WriteStartObject();
                    Int32 funcId = 1;
                    foreach (var fun in story.Functions)
                    {
                        writer.WritePropertyName(funcId.ToString());
                        funcId++;
                        Visit(fun);
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("nodes");
                    writer.WriteStartObject();
                    foreach (var node in story.Nodes)
                    {
                        writer.WritePropertyName(node.Key.ToString());
                        writer.WriteStartObject();
                        VisitNode(node.Value);
                        writer.WriteEndObject();
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("adapters");
                    writer.WriteStartObject();
                    foreach (var adapter in story.Adapters)
                    {
                        writer.WritePropertyName(adapter.Key.ToString());
                        Visit(adapter.Value);
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("databases");
                    writer.WriteStartObject();
                    foreach (var database in story.Databases)
                    {
                        writer.WritePropertyName(database.Key.ToString());
                        Visit(database.Value);
                    }
                    writer.WriteEndObject();

                    writer.WritePropertyName("goals");
                    writer.WriteStartObject();
                    foreach (var goal in story.Goals)
                    {
                        writer.WritePropertyName(goal.Key.ToString());
                        Visit(goal.Value);
                    }
                    writer.WriteEndObject();

                    writer.WriteEndObject();
                }
        }
Ejemplo n.º 20
0
        public void DebugDump(TextWriter writer, Story story)
        {
            writer.Write("Adapter - ");
            if (OwnerNode != null && OwnerNode.Name.Length > 0)
            {
                writer.WriteLine("Node {0}/{1}", OwnerNode.Name, OwnerNode.NameIndex);
            }
            else if (OwnerNode != null)
            {
                writer.WriteLine("Node <{0}>", OwnerNode.TypeName());
            }
            else
            {
                writer.WriteLine("(Not owned)");
            }

            if (Constants.Logical.Count > 0)
            {
                writer.Write("    Constants: ");
                Constants.DebugDump(writer, story);
                writer.WriteLine("");
            }

            if (LogicalIndices.Count > 0)
            {
                writer.Write("    Logical indices: ");
                foreach (var index in LogicalIndices)
                {
                    writer.Write("{0}, ", index);
                }
                writer.WriteLine("");
            }

            if (LogicalToPhysicalMap.Count > 0)
            {
                writer.Write("    Logical to physical mappings: ");
                foreach (var pair in LogicalToPhysicalMap)
                {
                    writer.Write("{0} -> {1}, ", pair.Key, pair.Value);
                }
                writer.WriteLine("");
            }
        }
Ejemplo n.º 21
0
        public override void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false)
        {
            if (Unused)
            {
                writer.Write("_");
            }
            else if (Adapted)
            {
                if (VariableName != null && VariableName.Length > 0)
                {
                    if (printTypes)
                    {
                        writer.Write("({0})", story.Types[TypeId].Name);
                    }

                    writer.Write(VariableName);
                }
                else
                {
                    tuple.Logical[Index].MakeScript(writer, story, null);
                }
            }
            else
            {
                base.MakeScript(writer, story, tuple);
            }
        }
Ejemplo n.º 22
0
 public RuleType GetRuleType(Story story)
 {
     var root = GetRoot(story);
     if (root is ProcNode)
     {
         if (IsQuery)
             return RuleType.Query;
         else
             return RuleType.Proc;
     }
     else
         return RuleType.Rule;
 }
Ejemplo n.º 23
0
        public override void MakeScript(TextWriter writer, Story story, Tuple tuple)
        {
            switch (GetRuleType(story))
            {
                case RuleType.Proc: writer.WriteLine("PROC"); break;
                case RuleType.Query: writer.WriteLine("QRY"); break;
                case RuleType.Rule: writer.WriteLine("IF"); break;
            }

            var initialTuple = MakeInitialTuple();
            story.Nodes[ParentRef.NodeIndex].MakeScript(writer, story, initialTuple);
            writer.WriteLine("THEN");
            foreach (var call in Calls)
            {
                call.MakeScript(writer, story, initialTuple);
                writer.WriteLine();
            }
        }
Ejemplo n.º 24
0
 public Node GetRoot(Story story)
 {
     Node parent = this;
     for (;;)
     {
         if (parent is RelNode)
         {
             var rel = parent as RelNode;
             parent = story.Nodes[rel.ParentRef.NodeIndex];
         }
         else if (parent is JoinNode)
         {
             var join = parent as JoinNode;
             parent = story.Nodes[join.LeftParentRef.NodeIndex];
         }
         else
         {
             return parent;
         }
     }
 }
Ejemplo n.º 25
0
        public void Write(Stream stream, Story story)
        {
            using (Writer = new OsiWriter(stream))
            {
                foreach (var node in story.Nodes)
                {
                    node.Value.PreSave(story);
                }

                Writer.MajorVersion = story.MajorVersion;
                Writer.MinorVersion = story.MinorVersion;

                var header = new SaveFileHeader();
                if (Writer.Ver >= OsiVersion.VerExternalStringTable)
                {
                    header.Version = "Osiris save file dd. 03/30/17 07:28:20. Version 1.8.";
                }
                else
                {
                    header.Version = "Osiris save file dd. 02/10/15 12:44:13. Version 1.5.";
                }
                header.MajorVersion = story.MajorVersion;
                header.MinorVersion = story.MinorVersion;
                header.BigEndian    = false;
                header.Unused       = 0;
                // Debug flags used in D:OS EE and D:OS 2
                header.DebugFlags = 0x000C10A0;
                header.Write(Writer);

                if (Writer.Ver > OsiVersion.VerLastSupported)
                {
                    var msg = String.Format(
                        "Osiris version v{0}.{1} unsupported; this tool supports saving up to version 1.11.",
                        Writer.MajorVersion, Writer.MinorVersion
                        );
                    throw new InvalidDataException(msg);
                }

                if (Writer.Ver >= OsiVersion.VerScramble)
                {
                    Writer.Scramble = 0xAD;
                }

                if (Writer.Ver >= OsiVersion.VerAddTypeMap)
                {
                    // Don't export builtin types, only externally declared ones
                    var types = story.Types.Values.Where(t => !t.IsBuiltin).ToList();
                    WriteTypes(types);
                }

                // TODO: regenerate string table?
                if (Writer.Ver >= OsiVersion.VerExternalStringTable && Writer.Ver < OsiVersion.VerRemoveExternalStringTable)
                {
                    WriteStrings(story.ExternalStringTable);
                }

                Writer.WriteList(story.DivObjects);
                Writer.WriteList(story.Functions);
                WriteNodes(story.Nodes);
                WriteAdapters(story.Adapters);
                WriteDatabases(story.Databases);
                WriteGoals(story.Goals);
                Writer.WriteList(story.GlobalActions);

                foreach (var node in story.Nodes)
                {
                    node.Value.PostSave(story);
                }
            }
        }
Ejemplo n.º 26
0
 public abstract void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false);
Ejemplo n.º 27
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            if (IsValid) writer.Write("valid ");
            if (OutParam) writer.Write("out ");
            if (IsAType) writer.Write("type ");

            if (IsValid)
            {
                base.DebugDump(writer, story);
            }
            else
            {
                writer.Write("<{0}>", story.Types[TypeId].Name);
            }
        }
Ejemplo n.º 28
0
        public Story Read(Stream stream)
        {
            var story = new Story();

            using (var reader = new OsiReader(stream, story))
            {
                var header = new SaveFileHeader();
                header.Read(reader);
                reader.MinorVersion = header.MinorVersion;
                reader.MajorVersion = header.MajorVersion;
                story.MinorVersion  = header.MinorVersion;
                story.MajorVersion  = header.MajorVersion;

                if (reader.Ver > OsiVersion.VerLastSupported)
                {
                    var msg = String.Format(
                        "Osiris version v{0}.{1} unsupported; this tool supports loading up to version 1.12.",
                        reader.MajorVersion, reader.MinorVersion
                        );
                    throw new InvalidDataException(msg);
                }

                if (reader.Ver >= OsiVersion.VerScramble)
                {
                    reader.Scramble = 0xAD;
                }

                if (reader.Ver >= OsiVersion.VerAddTypeMap)
                {
                    story.Types = ReadTypes(reader);
                    foreach (var type in story.Types)
                    {
                        if (type.Value.Alias != 0)
                        {
                            reader.TypeAliases.Add(type.Key, type.Value.Alias);
                        }
                    }
                }
                else
                {
                    story.Types = new Dictionary <uint, OsirisType>();
                }

                if (reader.Ver >= OsiVersion.VerExternalStringTable && reader.Ver < OsiVersion.VerRemoveExternalStringTable)
                {
                    story.ExternalStringTable = ReadStrings(reader);
                }
                else
                {
                    story.ExternalStringTable = new List <string>();
                }

                story.Types[0] = OsirisType.MakeBuiltin(0, "UNKNOWN");
                story.Types[1] = OsirisType.MakeBuiltin(1, "INTEGER");

                if (reader.Ver >= OsiVersion.VerEnhancedTypes)
                {
                    story.Types[2] = OsirisType.MakeBuiltin(2, "INTEGER64");
                    story.Types[3] = OsirisType.MakeBuiltin(3, "REAL");
                    story.Types[4] = OsirisType.MakeBuiltin(4, "STRING");
                    story.Types[5] = OsirisType.MakeBuiltin(5, "GUIDSTRING");
                }
                else
                {
                    story.Types[2] = OsirisType.MakeBuiltin(2, "FLOAT");
                    story.Types[3] = OsirisType.MakeBuiltin(3, "STRING");

                    // Populate custom type IDs for versions that had no type alias map
                    if (reader.Ver < OsiVersion.VerAddTypeMap)
                    {
                        for (byte typeId = 4; typeId <= 17; typeId++)
                        {
                            story.Types[typeId]       = OsirisType.MakeBuiltin(typeId, $"TYPE{typeId}");
                            story.Types[typeId].Alias = 3;
                            reader.TypeAliases.Add(typeId, 3);
                        }
                    }
                }

                story.DivObjects    = reader.ReadList <OsirisDivObject>();
                story.Functions     = reader.ReadList <Function>();
                story.Nodes         = ReadNodes(reader);
                story.Adapters      = ReadAdapters(reader);
                story.Databases     = ReadDatabases(reader);
                story.Goals         = ReadGoals(reader, story);
                story.GlobalActions = reader.ReadList <Call>();

                story.FunctionSignatureMap = new Dictionary <string, Function>();
                foreach (var func in story.Functions)
                {
                    story.FunctionSignatureMap.Add(func.Name.Name + "/" + func.Name.Parameters.Types.Count.ToString(), func);
                }

                foreach (var node in story.Nodes)
                {
                    node.Value.PostLoad(story);
                }

                return(story);
            }
        }
Ejemplo n.º 29
0
 public override void DebugDump(TextWriter writer, Story story)
 {
     writer.Write("#{0} ", Index);
     if (VariableName != null && VariableName.Length > 0) writer.Write("'{0}' ", VariableName);
     if (Unused) writer.Write("unused ");
     if (Adapted) writer.Write("adapted ");
     base.DebugDump(writer, story);
 }
Ejemplo n.º 30
0
        public void Write(Stream stream, Story story)
        {
            using (Writer = new OsiWriter(stream))
            {
                Writer.MajorVersion = story.MajorVersion;
                Writer.MinorVersion = story.MinorVersion;

                var header = new OsirisHeader();
                header.Version = "Osiris save file dd. 02/10/15 12:44:13. Version 1.5.";
                header.MajorVersion = story.MajorVersion;
                header.MinorVersion = story.MinorVersion;
                header.BigEndian = false;
                header.Unused = 0;
                // Debug flags used in D:OS EE
                header.DebugFlags = 0x000CA010;
                header.Write(Writer);

                if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion > 7))
                {
                    var msg = String.Format(
                        "Osiris version v{0}.{1} unsupported; this tool supports versions up to v1.7.",
                        Writer.MajorVersion, Writer.MinorVersion
                    );
                    throw new InvalidDataException(msg);
                }

                if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion >= 4))
                    Writer.Scramble = 0xAD;


                if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion >= 5))
                    WriteTypes(story.Types);

                Writer.WriteList(story.DivObjects);
                Writer.WriteList(story.Functions);
                WriteNodes(story.Nodes);
                WriteAdapters(story.Adapters);
                WriteDatabases(story.Databases);
                WriteGoals(story.Goals);
                Writer.WriteList(story.GlobalActions);
            }
        }
Ejemplo n.º 31
0
 public void DebugDump(TextWriter writer, Story story)
 {
     writer.Write("(");
     var keys = Logical.Keys.ToArray();
     for (var i = 0; i < Logical.Count; i++)
     {
         writer.Write("{0}: ", keys[i]);
         Logical[keys[i]].DebugDump(writer, story);
         if (i < Logical.Count - 1) writer.Write(", ");
     }
     writer.Write(")");
 }
Ejemplo n.º 32
0
        public void DebugDump(TextWriter writer, Story story)
        {
            writer.Write("{0} ", Type.ToString());
            Name.DebugDump(writer, story);
            if (NodeRef.IsValid())
            {
                var node = story.Nodes[NodeRef.NodeIndex];
                writer.Write(" @ {0}/{1}", node.Name, node.NameIndex);
            }

            writer.WriteLine(" [{0}, {1}]", Unknown1, Unknown2);
        }
Ejemplo n.º 33
0
 public OsiReader(Stream stream, Story story)
     : base(stream)
 {
     Story = story;
 }
Ejemplo n.º 34
0
 public FactCollection(Database database, Story story)
     : base()
 {
     Database = database;
     Story    = story;
 }
Ejemplo n.º 35
0
        public override void DebugDump(TextWriter writer, Story story)
        {
            base.DebugDump(writer, story);

            writer.Write("    Next: ");
            NextNode.DebugDump(writer, story);
            writer.WriteLine("");
        }
Ejemplo n.º 36
0
 public override void MakeScript(TextWriter writer, Story story, Tuple tuple)
 {
     writer.Write("{0}(", Name);
     tuple.MakeScript(writer, story);
     writer.WriteLine(")");
 }
Ejemplo n.º 37
0
 public override void PostSave(Story story)
 {
     base.PostSave(story);
     RemoveQueryPostfix(story);
 }
Ejemplo n.º 38
0
        public virtual void DebugDump(TextWriter writer, Story story)
        {
            switch ((Type)TypeId)
            {
                case Type.Unknown:
                    writer.Write("<unknown>");
                    break;

                case Type.Integer:
                    writer.Write(IntValue);
                    break;

                case Type.Float:
                    writer.Write(FloatValue);
                    break;

                case Type.String:
                    writer.Write("'{0}'", StringValue);
                    break;

                default:
                    writer.Write(StringValue);
                    break;
            }
        }
Ejemplo n.º 39
0
 public override void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes)
 {
     writer.Write("{0}(", Name);
     tuple.MakeScript(writer, story, true);
     writer.WriteLine(")");
 }
Ejemplo n.º 40
0
 public virtual void PreSave(Story story)
 {
 }
Ejemplo n.º 41
0
 public override void MakeScript(TextWriter writer, Story story, Tuple tuple)
 {
     writer.Write("{0}(", Name);
     tuple.MakeScript(writer, story);
     writer.WriteLine(")");
 }
Ejemplo n.º 42
0
        public Story Read(Stream stream)
        {
            using (var reader = new OsiReader(stream))
            {
                var story = new Story();
                var header = new OsirisHeader();
                header.Read(reader);
                reader.MinorVersion = header.MinorVersion;
                reader.MajorVersion = header.MajorVersion;
                story.MinorVersion = header.MinorVersion;
                story.MajorVersion = header.MajorVersion;

                if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion > 7))
                {
                    var msg = String.Format(
                        "Osiris version v{0}.{1} unsupported; this tool supports versions up to v1.7.",
                        reader.MajorVersion, reader.MinorVersion
                    );
                    throw new InvalidDataException(msg);
                }

                if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 4))
                    reader.Scramble = 0xAD;

                if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 5))
                    story.Types = ReadTypes(reader);
                else
                    story.Types = new Dictionary<uint, OsirisType>();

                story.Types[0] = new OsirisType();
                story.Types[0].Index = 0;
                story.Types[0].Name = "UNKNOWN";
                story.Types[1] = new OsirisType();
                story.Types[1].Index = 1;
                story.Types[1].Name = "INTEGER";
                story.Types[2] = new OsirisType();
                story.Types[2].Index = 2;
                story.Types[2].Name = "FLOAT";
                story.Types[3] = new OsirisType();
                story.Types[3].Index = 3;
                story.Types[3].Name = "STRING";

                story.DivObjects = reader.ReadList<OsirisDivObject>();
                story.Functions = reader.ReadList<Function>();
                story.Nodes = ReadNodes(reader);
                story.Adapters = ReadAdapters(reader);
                story.Databases = ReadDatabases(reader);
                story.Goals = ReadGoals(reader);
                story.GlobalActions = reader.ReadList<Call>();

                foreach (var node in story.Nodes)
                {
                    if (node.Value.DatabaseRef.IsValid())
                    {
                        var database = story.Databases[node.Value.DatabaseRef.DatabaseIndex];
                        if (database.OwnerNode != null)
                        {
                            throw new InvalidDataException("A database cannot be assigned to multiple database nodes!");
                        }

                        database.OwnerNode = node.Value;
                    }

                    if (node.Value is RuleNode)
                    {
                        // Remove the __DEF__ postfix that is added to the end of Query nodes
                        var rule = node.Value as RuleNode;
                        if (rule.IsQuery)
                        {
                            var ruleRoot = rule.GetRoot(story);
                            if (ruleRoot.Name != null && 
                                ruleRoot.Name.Length > 7 &&
                                ruleRoot.Name.Substring(ruleRoot.Name.Length - 7) == "__DEF__")
                            {
                                ruleRoot.Name = ruleRoot.Name.Substring(0, ruleRoot.Name.Length - 7);
                            }
                        }
                    }

                    if (node.Value is DataNode)
                    {
                        var data = node.Value as DataNode;
                        foreach (var reference in data.ReferencedBy)
                        {
                            if (reference.NodeRef.IsValid())
                            {
                                var ruleNode = story.Nodes[reference.NodeRef.NodeIndex];
                                if (reference.GoalId > 0 &&
                                    ruleNode is RuleNode)
                                {
                                    (ruleNode as RuleNode).DerivedGoalId = reference.GoalId;
                                }
                            }
                        }
                    }

                    if (node.Value is TreeNode)
                    {
                        var tree = node.Value as TreeNode;
                        if (tree.NextNode.NodeRef.IsValid())
                        {
                            var nextNode = story.Nodes[tree.NextNode.NodeRef.NodeIndex];
                            if (nextNode is RuleNode)
                            {
                                (nextNode as RuleNode).DerivedGoalId = tree.NextNode.GoalId;
                            }
                        }
                    }
                    
                    if (node.Value is RelNode)
                    {
                        var rel = node.Value as RelNode;
                        if (rel.AdapterRef.IsValid())
                        {
                            var adapter = story.Adapters[rel.AdapterRef.AdapterIndex];
                            if (adapter.OwnerNode != null)
                            {
                                throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!");
                            }

                            adapter.OwnerNode = node.Value;
                        }
                    }
                    else if (node.Value is JoinNode)
                    {
                        var join = node.Value as JoinNode;
                        if (join.Adapter1Ref.IsValid())
                        {
                            var adapter = story.Adapters[join.Adapter1Ref.AdapterIndex];
                            if (adapter.OwnerNode != null)
                            {
                                throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!");
                            }

                            adapter.OwnerNode = node.Value;
                        }

                        if (join.Adapter2Ref.IsValid())
                        {
                            var adapter = story.Adapters[join.Adapter2Ref.AdapterIndex];
                            if (adapter.OwnerNode != null)
                            {
                                throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!");
                            }

                            adapter.OwnerNode = node.Value;
                        }
                    }
                }

                return story;
            }
        }