Beispiel #1
0
        public override ObjectData GetData(NodeFactory factory, bool relocsOnly)
        {
            ObjectDataBuilder builder = new ObjectDataBuilder(factory, relocsOnly);

            builder.RequireInitialPointerAlignment();

            if (_sorter != null)
            {
                _nestedNodesList.Sort(_sorter);
            }

            builder.AddSymbol(StartSymbol);

            GetElementDataForNodes(ref builder, factory, relocsOnly);

            EndSymbol.SetSymbolOffset(builder.CountBytes);
            builder.AddSymbol(EndSymbol);

            ObjectData objData = builder.ToObjectData();

            return(objData);
        }
Beispiel #2
0
        public Line(string str, Dictionary <string, string> dic)
        {
            Original = str;

            RemoveAdditionalComment();

            Dic = dic;

            if (OriginalWithoutComment != null && OriginalWithoutComment != "")
            {
                string spaceTrimed = System.Text.RegularExpressions.Regex.Replace(OriginalWithoutComment, @"\b\s+\b", " ");
                spaceTrimed = spaceTrimed.Replace("\t", "");
                spaceTrimed = spaceTrimed.Trim(' ');
                RegularLine = spaceTrimed;
            }
            else
            {
                RegularLine = "";
            }

            if (
                (RegularLine.Length > 0)
                &&
                (
                    (RegularLine[0] == 'F' || RegularLine[0] == 'K') && (RegularLine[1] == '#') ||
                    ((RegularLine[0] == 'S') && (RegularLine[1] == 'T') && (RegularLine[2] == '#'))
                )
                )
            {
                Type = LineType.fehler;
            }
            else
            {
                Type = LineType.normal;
            }


            if (Type == LineType.fehler)
            {
                int spacePos = RegularLine.IndexOf(" ");
                if (spacePos > 0)
                {
                    FehlerNumber = RegularLine.Substring(0, spacePos);
                }
                else if (spacePos < 0)
                {
                    FehlerNumber = RegularLine;
                }
                else
                {
                    FehlerNumber = "TrimError";
                }
            }
            else
            {
                FehlerNumber = "";
            }


            if (Type == LineType.fehler)
            {
                string endSym = RegularLine.Substring(RegularLine.Length - 1, 1);
                if (endSym == "!" || endSym == "?" || endSym == ".")
                {
                    EndSymbol = endSym;
                }
                else
                {
                    EndSymbol = "";
                }
            }
            else
            {
                EndSymbol = "";
            }



            if (Type == LineType.fehler)
            {
                string tempBlock = System.Text.RegularExpressions.Regex.Replace(RegularLine, FehlerNumber, " ");
                if (EndSymbol != "")
                {
                    tempBlock = tempBlock.Trim(EndSymbol.ToCharArray());
                }
                tempBlock     = tempBlock.Trim(' ');
                OriginalBlock = tempBlock;
            }
            else
            {
                OriginalBlock = OriginalWithoutComment;
            }

            if (Type == LineType.fehler)
            {
                Translation = TranslateDecrease();
            }
            else
            {
                Translation = Original;
            }
        }
Beispiel #3
0
        private static void DrawEndSymbol(Canvas symbolCanvas, EndSymbol symbol, Point startPoint, Point linePoint)
        {
            Point p1 = new Point(startPoint.X, startPoint.Y);
            Point p2 = new Point(startPoint.X - 5, startPoint.Y - 10);
            Point p3 = new Point(startPoint.X + 5, startPoint.Y - 10);
            Point p4 = new Point(startPoint.X, startPoint.Y - 20);

            Path       path       = new Path();
            PathFigure pathFigure = new PathFigure();

            pathFigure.StartPoint = p2;
            pathFigure.IsClosed   = true;
            pathFigure.IsFilled   = true;
            path.Fill             = Brushes.Black;

            PathSegment segment;


            segment = new LineSegment(p1, true);
            pathFigure.Segments.Add(segment);

            segment = new LineSegment(p3, true);
            pathFigure.Segments.Add(segment);

            if (symbol == EndSymbol.SimpleArrow)
            {
                pathFigure.IsClosed = false;
                pathFigure.IsFilled = false;
            }
            else if (symbol == EndSymbol.EmptyTriangle)
            {
                path.Fill = Brushes.White;
            }
            else if (symbol == EndSymbol.FilledTriangle)
            {
                path.Fill = Brushes.Black;
            }
            else if (symbol == EndSymbol.EmptyRhombus)
            {
                segment = new LineSegment(p4, true);
                pathFigure.Segments.Add(segment);
                path.Fill = Brushes.White;
            }
            else if (symbol == EndSymbol.FilledRhumbus)
            {
                segment = new LineSegment(p4, true);
                pathFigure.Segments.Add(segment);
                path.Fill = Brushes.Black;
            }

            double degree = -90;

            if (linePoint.Y != startPoint.Y)
            {
                double m;
                m = (startPoint.X - linePoint.X) / (startPoint.Y - linePoint.Y);

                m      = -m;
                degree = Math.Atan(m) * 180 / Math.PI;

                if (startPoint.Y - linePoint.Y < 0)
                {
                    degree += 180;
                }
            }
            else if (linePoint.X > startPoint.X)
            {
                degree = 90;
            }

            path.RenderTransform = new RotateTransform(degree, p1.X, p1.Y);

            List <PathFigure> figures = new List <PathFigure>();

            figures.Add(pathFigure);
            path.Data = new PathGeometry(figures, FillRule.Nonzero, Transform.Identity);

            path.Stroke          = Brushes.Black;
            path.StrokeThickness = 1;

            symbolCanvas.Children.Add(path);
        }
Beispiel #4
0
 public override int GetHashCode()
 {
     return(StartSymbol.GetHashCode() ^ EndSymbol.GetHashCode());
 }
Beispiel #5
0
        public override bool Equals(object obj)
        {
            Bracket <T> context = obj as Bracket <T>;

            return(StartSymbol.Equals(context?.StartSymbol) && EndSymbol.Equals(context?.EndSymbol));
        }
Beispiel #6
0
        /// <summary>
        /// Reads symbol record from symbol references for the specified index.
        /// </summary>
        /// <param name="index">Index of the symbol record.</param>
        private SymbolRecord GetSymbol(int index)
        {
            // Since DictionaryCache is allowing only single thread to call this function, we don't need to lock reader here.
            SymbolRecordReference reference = references[index];

            Reader.Position = reference.DataOffset;
            switch (reference.Kind)
            {
            case SymbolRecordKind.S_GPROC32:
            case SymbolRecordKind.S_LPROC32:
            case SymbolRecordKind.S_GPROC32_ID:
            case SymbolRecordKind.S_LPROC32_ID:
            case SymbolRecordKind.S_LPROC32_DPC:
            case SymbolRecordKind.S_LPROC32_DPC_ID:
                return(ProcedureSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_PUB32:
                return(Public32Symbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_CONSTANT:
            case SymbolRecordKind.S_MANCONSTANT:
                return(ConstantSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_LDATA32:
            case SymbolRecordKind.S_GDATA32:
            case SymbolRecordKind.S_LMANDATA:
            case SymbolRecordKind.S_GMANDATA:
                return(DataSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_PROCREF:
            case SymbolRecordKind.S_LPROCREF:
                return(ProcedureReferenceSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_TOKENREF:
                return(TokenReferenceSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_UDT:
            case SymbolRecordKind.S_COBOLUDT:
                return(UdtSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_LTHREAD32:
            case SymbolRecordKind.S_GTHREAD32:
                return(ThreadLocalDataSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_GMANPROC:
            case SymbolRecordKind.S_LMANPROC:
                return(ManagedProcedureSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_BLOCK32:
                return(BlockSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_OEM:
                return(OemSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_UNAMESPACE:
                return(NamespaceSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_MANSLOT:
                return(AttributeSlotSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_END:
            case SymbolRecordKind.S_INLINESITE_END:
                return(EndSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_ANNOTATION:
                return(AnnotationSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_ANNOTATIONREF:
                return(AnnotationReferenceSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_REGREL32:
                return(RegisterRelativeSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_OBJNAME:
                return(ObjectNameSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_COMPILE2:
                return(Compile2Symbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_COMPILE3:
                return(Compile3Symbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_ENVBLOCK:
                return(EnvironmentBlockSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_BUILDINFO:
                return(BuildInfoSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_FRAMEPROC:
                return(FrameProcedureSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_LABEL32:
                return(LabelSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_HEAPALLOCSITE:
                return(HeapAllocationSiteSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_CALLSITEINFO:
                return(CallSiteInfoSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_FRAMECOOKIE:
                return(FrameCookieSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_THUNK32:
                return(Thunk32Symbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_LOCAL:
                return(LocalSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_DEFRANGE_REGISTER:
                return(DefRangeRegisterSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_DEFRANGE_REGISTER_REL:
                return(DefRangeRegisterRelativeSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_DEFRANGE_SUBFIELD_REGISTER:
                return(DefRangeSubfieldRegisterSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_DEFRANGE_FRAMEPOINTER_REL:
                return(DefRangeFramePointerRelativeSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
                return(DefRangeFramePointerRelativeFullScopeSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_CALLEES:
            case SymbolRecordKind.S_CALLERS:
                return(FunctionListSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            case SymbolRecordKind.S_FILESTATIC:
                return(FileStaticSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_TRAMPOLINE:
                return(TrampolineSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_SECTION:
                return(SectionSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_COFFGROUP:
                return(CoffGroupSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_EXPORT:
                return(ExportSymbol.Read(Reader, this, index, reference.Kind));

            case SymbolRecordKind.S_INLINESITE:
                return(InlineSiteSymbol.Read(Reader, this, index, reference.Kind, reference.DataLen));

            default:
#if DEBUG
                throw new NotImplementedException($"Unknown reference kind: {reference.Kind}");
#else
                return(null);
#endif
            }
        }