/// <summary> /// Tries to get symbol record by offset in the binary reder stream. /// </summary> /// <param name="position">Position in the binary reader.</param> /// <param name="symbolRecord">Symbol record at the specified position.</param> /// <returns><c>true</c> if offset points to symbol record; <c>false</c> otherwise</returns> public bool TryGetSymbolRecordByOffset(long position, out SymbolRecord symbolRecord) { int index = -1; uint dataOffset = (uint)position + RecordPrefix.Size; int min = 0, max = references.Count - 1; while (min <= max) { int mid = min + (max - min) / 2; uint value = references[mid].DataOffset; if (value == dataOffset) { index = mid; break; } else if (dataOffset < value) { max = mid - 1; } else { min = mid + 1; } } if (index >= 0) { symbolRecord = symbols[index]; return(true); } symbolRecord = null; return(false); }
public SymbolResponse(string body) : base(body) { JSONObject ob = (JSONObject)this.ReturnData; symbol = new SymbolRecord(); symbol.FieldsFromJSONObject(ob); }
public AllSymbolsResponse(string body) : base(body) { JSONArray symbolRecords = (JSONArray)ReturnData; foreach (JSONObject e in symbolRecords) { SymbolRecord symbolRecord = new SymbolRecord(); symbolRecord.FieldsFromJSONObject(e); this.symbolRecords.AddLast(symbolRecord); } }
public GetAllSymbolsResponse(string body) : base(body) { this.SymbolRecords = new LinkedList <SymbolRecord>(); JSONArray symbolRecords = (JSONArray)this.ReturnData; foreach (JSONObject symbolRecordJson in symbolRecords) { SymbolRecord symbolRecord = new SymbolRecord(symbolRecordJson); this.SymbolRecords.AddLast(symbolRecord); } }
/// <summary> /// Creates a new symbol or gives a reference to a symbol that is /// determined by the type of the symbol record in the file content. /// </summary> /// <param name="symbolRecord"></param> /// <returns></returns> public static Symbol CreateSymbol(SymbolRecord symbolRecord) { Symbol symbol; switch (symbolRecord.Kind) { case 0: symbol = new SymbolNonterminal(symbolRecord.Index, symbolRecord.Name); break; case 1: symbol = new SymbolTerminal(symbolRecord.Index, symbolRecord.Name); break; case 2: symbol = new SymbolWhiteSpace(symbolRecord.Index); break; case 3: symbol = SymbolCollection.EOF; break; case 4: symbol = new SymbolCommentStart(symbolRecord.Index); break; case 5: symbol = new SymbolCommentEnd(symbolRecord.Index); break; case 6: symbol = new SymbolCommentLine(symbolRecord.Index); break; case 7: symbol = SymbolCollection.ERROR; break; default: // this sort of symbol should never be here symbol = new SymbolError(-1); break; } return(symbol); }
private SourceObject CreateSourceObject(SymbolRecord record) { SourceObject srcObj; switch (record.Type) { case TokenRef.Type.Keyword: case TokenRef.Type.Modifier: case TokenRef.Type.Identifier: case TokenRef.Type.Operator: srcObj = new SourceObject(record.Token, record.Type); break; default: throw InvalidEnumValueException.InvalidArgument(typeof(TokenRef.Type), record.Type, nameof(record.Type)); } return(srcObj); }
/// <summary> /// Parses all symbols of the specified symbol record kind. /// </summary> /// <param name="kind">Symbol record kind.</param> /// <returns>Array of symbol record for the specified symbol record kind.</returns> private SymbolRecord[] GetSymbolsByKind(SymbolRecordKind kind) { List <SymbolRecord> symbols = new List <SymbolRecord>(); for (int i = 0; i < references.Count; i++) { if (references[i].Kind == kind) { SymbolRecord symbol = this.symbols[i]; if (symbol != null) { symbols.Add(symbol); } } } return(symbols.ToArray()); }
/// <summary> /// Creates a list of static fields based on <see cref="TagRecord"/>.<see cref="TagRecord.FieldList"/>. /// </summary> private List <PdbTypeStaticField> EnumerateStaticFields() { List <PdbTypeStaticField> fields = new List <PdbTypeStaticField>(); foreach (TypeRecord field in EnumerateFieldList()) { if (field is StaticDataMemberRecord staticDataMemberRecord) { // Check if static field is constant string fullName = Name + "::" + staticDataMemberRecord.Name; var globals = Pdb.PdbFile.GlobalsStream; ConstantSymbol constant = null; ThreadLocalDataSymbol threadLocalData = null; DataSymbol data = null; if (globals.HashBuckets != null) { uint hash = HashTable.HashStringV1(fullName); var bucket = globals.HashBuckets[hash % (uint)globals.HashBuckets.Length]; for (int i = bucket.Start; i < bucket.End; i++) { SymbolRecord record = globals.Symbols[i]; if (record is ConstantSymbol c && c.Name.String == fullName) { constant = c; break; } else if (record is ThreadLocalDataSymbol tls && tls.Name.String == fullName) { threadLocalData = tls; break; } else if (record is DataSymbol ds && ds.Name.String == fullName) { data = ds; break; } // TODO: bucket items are ordered by byte value. Is it comparable by string.CompareTo? } }
public SYMB(EndianBinaryReader er) { long baseoffset = er.BaseStream.Position; Signature = er.ReadString(Encoding.ASCII, 4); if (Signature != "SYMB") { throw new SignatureNotCorrectException(Signature, "SYMB", er.BaseStream.Position - 4); } SectionSize = er.ReadUInt32(); RecordOffsets = er.ReadUInt32s(8); Padding = er.ReadBytes(24); long curpos = er.BaseStream.Position; er.BaseStream.Position = baseoffset + RecordOffsets[0]; SEQRecord = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[1]; SEQARCRecord = new ArchiveSymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[2]; BANKRecord = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[3]; WAVEARCRecord = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[4]; PLAYERRecord = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[5]; GROUPRecord = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[6]; PLAYER2Record = new SymbolRecord(er); er.BaseStream.Position = baseoffset + RecordOffsets[7]; STRMRecord = new SymbolRecord(er); er.BaseStream.Position = curpos; SEQRecord.ReadNames(er, baseoffset); SEQARCRecord.ReadNames(er, baseoffset); BANKRecord.ReadNames(er, baseoffset); WAVEARCRecord.ReadNames(er, baseoffset); PLAYERRecord.ReadNames(er, baseoffset); GROUPRecord.ReadNames(er, baseoffset); PLAYER2Record.ReadNames(er, baseoffset); STRMRecord.ReadNames(er, baseoffset); er.BaseStream.Position = baseoffset + SectionSize; }
private void RenderSymbolPrimitive(Graphics graphics, SymbolRecord symbol) { throw new NotImplementedException(); }
/// <summary> /// Instantiates a record according to its record type number. /// </summary> /// <param name="recordType">Integer representing the record type.</param> /// <returns>A new empty instance of a record primitive.</returns> private SchPrimitive CreateRecord(int recordType) { SchPrimitive record; switch (recordType) { case 1: record = new SchComponent(); break; case 2: record = new PinRecord(); break; case 3: record = new SymbolRecord(); break; case 4: record = new TextStringRecord(); break; case 5: record = new BezierRecord(); break; case 6: record = new PolylineRecord(); break; case 7: record = new PolygonRecord(); break; case 8: record = new EllipseRecord(); break; case 9: record = new PieChartRecord(); break; case 10: record = new RoundedRectangleRecord(); break; case 11: record = new EllipticalArcRecord(); break; case 12: record = new ArcRecord(); break; case 13: record = new LineRecord(); break; case 14: record = new RectangleRecord(); break; case 28: case 209: record = new TextFrameRecord(); break; case 30: record = new ImageRecord(); break; case 34: record = new Record34(); break; case 41: record = new Record41(); break; case 44: record = new Record44(); break; case 45: record = new Record45(); break; case 46: record = new Record46(); break; case 48: record = new Record48(); break; default: EmitWarning($"Record {recordType} not supported"); record = new SchPrimitive(); break; } return(record); }
public GetSymbolResponse(string body) : base(body) { this.Symbol = new SymbolRecord((JSONObject)this.ReturnData); }