class Metasm::C::Enum

Attributes

backtrace[RW]
members[RW]

name => value

name[RW]

Public Instance Methods

align(parser) click to toggle source
# File metasm/parse_c.rb, line 589
def align(parser) BaseType.new(:int).align(parser) end
arithmetic?() click to toggle source
# File metasm/parse_c.rb, line 591
def arithmetic?; true end
compare_deep(o) click to toggle source
# File metasm/parse_c.rb, line 624
def compare_deep(o)
        return true if o.object_id == self.object_id
        return if o.class != self.class or o.name != self.name or o.attributes != self.attributes
        members == o.members
end
dump(scope, r=[CRenderString.new], dep=[]) click to toggle source
# File metasm/parse_c.rb, line 3747
def dump(scope, r=[CRenderString.new], dep=[])
        if name
                r.last << @qualifier.map { |q| q.to_s << ' ' }.join if qualifier
                r.last << 'enum ' << @name
                dep |= [scope.struct_ancestors[@name]]
                [r, dep]
        else
                dump_def(scope, r, dep)
        end
end
dump_def(scope, r=[CRenderString.new], dep=[]) click to toggle source
# File metasm/parse_c.rb, line 3758
def dump_def(scope, r=[CRenderString.new], dep=[])
        r.last << @qualifier.map { |q| q.to_s << ' ' }.join if qualifier
        r.last << 'enum'
        r.last << ' ' << @name if name
        if members
                r.last << ' { '
                val = -1
                @members.sort_by { |m, v| v }.each { |m, v|
                        r.last << ', ' if r.last[-2, 2] != '{ '
                        r.last << m
                        if v != (val += 1)
                                val = v
                                r.last << ' = ' << val.to_s
                        end
                }
                r.last << ' }'
        end
        [r, dep]
end
dump_initializer(init, scope, r=[CRenderString.new], dep=[]) click to toggle source
Calls superclass method Metasm::C::Type#dump_initializer
# File metasm/parse_c.rb, line 3778
def dump_initializer(init, scope, r=[CRenderString.new], dep=[])
        if members and (
                        k = @members.index(init) or
                        (init.kind_of? CExpression and not init.op and k = @members.index(init.rexpr))
        )
                r.last << k
                dep |= [scope.struct_ancestors[@name]]
                [r, dep]
        else super(init, scope, r, dep)
        end
end
integral?() click to toggle source
# File metasm/parse_c.rb, line 592
def integral?; true end
parse_members(parser, scope) click to toggle source
# File metasm/parse_c.rb, line 595
def parse_members(parser, scope)
        val = -1
        @members = {}
        loop do
                raise parser if not tok = parser.skipspaces
                break if tok.type == :punct and tok.raw == '}'

                name = tok.raw
                raise tok, 'bad enum name' if tok.type != :string or Keyword[name] or (?0..?9).include?(name[0])

                raise parser if not tok = parser.skipspaces
                if tok.type == :punct and tok.raw == '='
                        raise tok || parser if not val = CExpression.parse(parser, scope, false) or not val = val.reduce(parser) or not tok = parser.skipspaces
                else
                        val += 1
                end
                raise tok, "enum value #{name} redefinition" if scope.symbol[name] and scope.symbol[name] != val
                @members[name] = val
                scope.symbol[name] = val

                if tok.type == :punct and tok.raw == '}'
                        break
                elsif tok.type == :punct and tok.raw == ','
                else raise tok, '"," or "}" expected'
                end
        end
        parse_attributes(parser)
end
signed?() click to toggle source
# File metasm/parse_c.rb, line 593
def signed?; false end