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); }
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; } }
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); }
public override int GetHashCode() { return(StartSymbol.GetHashCode() ^ EndSymbol.GetHashCode()); }
public override bool Equals(object obj) { Bracket <T> context = obj as Bracket <T>; return(StartSymbol.Equals(context?.StartSymbol) && EndSymbol.Equals(context?.EndSymbol)); }
/// <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 } }