Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        public SymbolResponse(string body) : base(body)
        {
            JSONObject ob = (JSONObject)this.ReturnData;

            symbol = new SymbolRecord();
            symbol.FieldsFromJSONObject(ob);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        /// <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());
        }
Ejemplo n.º 8
0
        /// <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?
                        }
                    }
Ejemplo n.º 9
0
            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;
            }
Ejemplo n.º 10
0
 private void RenderSymbolPrimitive(Graphics graphics, SymbolRecord symbol)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 11
0
        /// <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);
        }
Ejemplo n.º 12
0
 public GetSymbolResponse(string body)
     : base(body)
 {
     this.Symbol = new SymbolRecord((JSONObject)this.ReturnData);
 }