Class: CType::StructUnion

Inherits:
Object
  • Object
show all
Defined in:
lib/caphir/ctype.rb

Direct Known Subclasses

Struct, Union

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name = nil) ⇒ StructUnion

Returns a new instance of StructUnion.



80
81
82
83
# File 'lib/caphir/ctype.rb', line 80

def initialize(name = nil)
  @name = name
  @members = nil
end

Class Method Details

.get(type, name, members = nil) ⇒ Object

want only one instance of each unique Struct or Union



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/caphir/ctype.rb', line 64

def StructUnion.get(type, name, members = nil)
  case type
    when 'struct'
      if members
        Struct[name].add(members)
      else
        Struct[name]
      end
    when 'union'
      if members
        Union[name].add(members)
      else
        Union[name]
      end
  end
end

Instance Method Details

#add(items) ⇒ Object



84
85
86
87
88
# File 'lib/caphir/ctype.rb', line 84

def add(items)
  #warn "structure or union #{@name} already defined" if @members
  @members = items.flatten
  self
end

#evaluate(identifier) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
# File 'lib/caphir/ctype.rb', line 99

def evaluate(identifier)
  return self if identifier.empty?
  CType.evaluation_error(identifier) unless identifier =~ /\A\.([A-Za-z_]\w*)/
  post_match = $'
  p_type = lookup($1)
  if p_type
    p_type.evaluate(post_match)
  else
    CType.evaluation_error(identifier)
  end
end

#get_membersObject



95
96
97
# File 'lib/caphir/ctype.rb', line 95

def get_members
  @members.dup
end

#keywordObject



111
112
113
114
115
116
117
# File 'lib/caphir/ctype.rb', line 111

def keyword
  if self.class == Struct
    'struct'
  elsif self.class == Union
    'union'
  end
end

#lookup(identifier) ⇒ Object



89
90
91
92
93
# File 'lib/caphir/ctype.rb', line 89

def lookup(identifier)
  @members.find do |m|
    identifier == m.identifier
  end
end

#to_def(indent = '') ⇒ Object

to_def is pretty much depreciated - might be useful for debugging in the future to_def methods would have to be added to all classes in this module though.



131
132
133
134
135
136
137
138
# File 'lib/caphir/ctype.rb', line 131

def to_def(indent='')
  str =  to_s
  str << " {\n"
  @members.each do |m|
    str << indent << "\t" << m.to_def(indent + "\t") << ";\n"
  end
  str << indent << '}'
end

#to_init_s(ident = nil) ⇒ Object



121
122
123
124
125
126
127
# File 'lib/caphir/ctype.rb', line 121

def to_init_s(ident = nil)
  str = ''
  str << keyword
  str << ' ' << @name if @name
  str << ' ' << ident if ident
  str # make sure we don't return nil
end

#to_sObject



118
119
120
# File 'lib/caphir/ctype.rb', line 118

def to_s
  to_init_s()
end