• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Created by SharpDevelop.
3  * User: lextm
4  * Date: 2008/5/18
5  * Time: 13:24
6  *
7  * To change this template use Tools | Options | Coding | Edit Standard Headers.
8  */
9 using System;
10 using System.Collections.Generic;
11 
12 namespace Lextm.SharpSnmpLib.Mib.Elements.Types
13 {
14     /* Please be aware of the following possible constructs:
15      *
16      *    isnsRegEntityIndex          OBJECT-TYPE
17      *    SYNTAX                      IsnsEntityIndexIdOrZero
18      *                                ( 1 .. 4294967295 )
19      *    MAX-ACCESS              not-accessible
20      *
21      *
22      */
23 
24     /// <summary/>
25     /// </summary>
26     public sealed class TypeAssignment : ITypeAssignment
27     {
28         private IModule _module;
29         private string _name;
30         private string _type;
31         private ValueRanges _ranges;
32         private ValueMap _map;
33 
34         /// <summary>
35         /// Creates an <see cref="TypeAssignment" />.
36         /// </summary>
37         /// <param name="module">The module.</param>
38         /// <param name="name">The name.</param>
39         /// <param name="type">The type.</param>
40         /// <param name="symbols">The symbols.</param>
41         /// <param name="isMacroSyntax">if set to <c>true</c> indicates that the syntax clause of a macro is parsed (e.g. OBJECT-TYPE, TEXTUAL-CONVENTION).</param>
TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax)42         public TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax)
43         {
44             _module = module;
45             _name   = name;
46 
47             SymbolList typeSymbols = new SymbolList();
48             typeSymbols.Add(type);
49 
50             Symbol current = symbols.NextSymbol();
51             while (current != Symbol.EOL)
52             {
53                 if (current == Symbol.OpenParentheses)
54                 {
55                     // parse range of unknown type
56                     symbols.PutBack(current);
57                     _ranges = Lexer.DecodeRanges(symbols);
58                     break;
59                 }
60                 else if (current == Symbol.OpenBracket)
61                 {
62                     symbols.PutBack(current);
63                     _map = Lexer.DecodeEnumerations(symbols);
64                     break;
65                 }
66 
67                 typeSymbols.Add(current);
68                 current = symbols.NextSymbol();
69             }
70 
71             _type = typeSymbols.Join(" ");
72 
73             if ((_ranges == null) && (_map == null))
74             {
75                 current = symbols.NextNonEOLSymbol();
76                 if (current == Symbol.OpenParentheses)
77                 {
78                     // parse range of unknown type
79                     symbols.PutBack(current);
80                     _ranges = Lexer.DecodeRanges(symbols);
81                 }
82                 else if (current == Symbol.OpenBracket)
83                 {
84                     symbols.PutBack(current);
85                     _map = Lexer.DecodeEnumerations(symbols);
86                 }
87                 else if (current != null)
88                 {
89                     symbols.PutBack(current);
90                 }
91             }
92 
93             if (isMacroSyntax)
94             {
95                 // inside a macro the syntax is limited to one line, except there are brackets used for ranges/enums
96                 return;
97             }
98 
99             // outside macro Syntax clause we  wait for two consecutive linebreaks with a following valid identifier as end condition
100             Symbol previous = current;
101             Symbol veryPrevious = null;
102 
103             while ((current = symbols.NextSymbol()) != null)
104             {
105                 if ((veryPrevious == Symbol.EOL) && (previous == Symbol.EOL) && current.IsValidIdentifier())
106                 {
107                     symbols.PutBack(current);
108                     return;
109                 }
110 
111                 veryPrevious = previous;
112                 previous = current;
113             }
114 
115             previous.Assert(false, "end of file reached");
116         }
117 
118         public string Type
119         {
120             get { return _type; }
121         }
122 
123         public ValueRanges Ranges
124         {
125             get { return _ranges; }
126         }
127 
128         public IDictionary<long, string> Map
129         {
130             get { return _map; }
131         }
132 
133         #region ITypeAssignment Member
134 
135         public IModule Module
136         {
137             get { return _module; }
138         }
139 
140         public string Name
141         {
142             get { return _name; }
143         }
144 
145         #endregion
146     }
147 }