Module: DL::CParser

Module | DL::CParser
In: | dl/lib/dl/cparser.rb

### Methods

parse_ctype parse_signature parse_struct_signature

### Public Instance methods

parse_ctype(ty, tymap=nil)

[Source]

    # File dl/lib/dl/cparser.rb, line 59
        def parse_ctype(ty, tymap=nil)
          tymap ||= {}
          case ty
          when Array
            return [parse_ctype(ty[0], tymap), ty[1]]
          when "void"
            return TYPE_VOID
          when "char"
            return TYPE_CHAR
          when "unsigned char"
            return  -TYPE_CHAR
          when "short"
            return TYPE_SHORT
          when "unsigned short"
            return -TYPE_SHORT
          when "int"
            return TYPE_INT
          when "unsigned int"
            return -TYPE_INT
          when "long"
            return TYPE_LONG
          when "unsigned long"
            return -TYPE_LONG
          when "long long"
            if( defined?(TYPE_LONG_LONG) )
              return TYPE_LONG_LONG
            else
              raise(RuntimeError, "unsupported type: #{ty}")
            end
          when "unsigned long long"
            if( defined?(TYPE_LONG_LONG) )
              return -TYPE_LONG_LONG
            else
              raise(RuntimeError, "unsupported type: #{ty}")
            end
          when "float"
            return TYPE_FLOAT
          when "double"
            return TYPE_DOUBLE
          when /\*/, /\[\s*\]/
            return TYPE_VOIDP
          else
            if( tymap[ty] )
              return parse_ctype(tymap[ty], tymap)
            else
              raise(DLError, "unknown type: #{ty}")
            end
          end
        end

parse_signature(signature, tymap=nil)

[Source]

    # File dl/lib/dl/cparser.rb, line 38
        def parse_signature(signature, tymap=nil)
          tymap ||= {}
          signature = signature.gsub(/\s+/, " ").strip
          case signature
          when /^([\d\w@\*_\s]+)\(([\d\w\*_\s\,\[\]]*)\)$/
            ret = $1
            args = $2
            ret = ret.split(/\s+/)
            args = args.split(/\s*,\s*/)
            func = ret.pop
            if( func =~ /^\*/ )
              func.gsub!(/^\*+/,"")
              ret.push("*")
            end
            ret  = ret.join(" ")
            return [func, parse_ctype(ret, tymap), args.collect{|arg| parse_ctype(arg, tymap)}]
          else
            raise(RuntimeError,"can't parse the function prototype: #{proto}")
          end
        end

parse_struct_signature(signature, tymap=nil)

[Source]

    # File dl/lib/dl/cparser.rb, line 3
        def parse_struct_signature(signature, tymap=nil)
          if( signature.is_a?(String) )
            signature = signature.split("\s*,\s*")
          end
          mems = []
          tys  = []
          signature.each{|msig|
            tks = msig.split(/\s+(\*)?/)
            ty = tks[0..-2].join(" ")
            member = tks[-1]

            case ty
            when /\[(\d+)\]/
              n = $1.to_i
              ty.gsub!(/\s*\[\d+\]/,"")
              ty = [ty, n]
            when /\[\]/
              ty.gsub!(/\s*\[\]/, "*")
            end

            case member
            when /\[(\d+)\]/
              ty = [ty, $1.to_i]
              member.gsub!(/\s*\[\d+\]/,"")
            when /\[\]/
              ty = ty + "*"
              member.gsub!(/\s*\[\]/, "")
            end

            mems.push(member)
            tys.push(parse_ctype(ty,tymap))
          }
          return tys, mems
        end

[Validate]