#!/usr/bin/env ruby require 'pp' class Qt4API API_TOOL_PATH = '/usr/local/bin/rbqt4api' @@dir = File.dirname(__FILE__) # Signature = Struct.new :return_ , :class_ , :method_ , :args_ class Signature attr_accessor :return_ , :class_ , :method_ , :args_ def initialize(return_ , class_ , method_ , args_) @return_ , @class_ , @method_ , @args_ = return_ , class_ , method_ , args_ end def inspect "\n" + ['[C] ' + class_ , '[M]' + method_ , '[A]' + args_ , '[R]' + return_ ].join("\t") end end @@api = nil attr_reader :api def initialize(api = @@api , use_cache = true) return @api = api if api and api.class == Array return if @api = load_cached if use_cache @api = `#{API_TOOL_PATH} -r`.strip.split("\n\t") @api.collect!{|s| sig = s.scan( /(.+?) ([^ ]+?)::([^ ]+?)(\(.*\))/ )[0] if sig.nil? or sig.length != 4 ; pp s ; next; end sig[0].gsub!(/^.* / , '') sig[0].gsub!(/^Q(?!t)/ , 'Qt::') sig[1].gsub!(/^Q(?!t)/ , 'Qt::') Signature.new *sig } @api.compact! update_cache ensure @@api = @api if @@api.nil? # puts 'returned' end def load_cached Marshal.load File.read(@@dir + '/qt4api_cache') rescue puts('couldnt load cache') end def update_cache File.open(@@dir + '/qt4api_cache' , 'w+'){|f| Marshal.dump @api , f} rescue puts('couldnt update cache') end def find_signatures(params) case params when String prms = {} prms[:method_] , prms[:class_] , prms[:return_] , prms[:args_] = params.split(',').collect{|par| par.empty? ? nil : Regexp.new(*par.strip.split('/')) } params = prms end subset = @api.find_all{|s| next unless s.return_ =~ params[:return_] if params[:return_] next unless s.class_ =~ params[:class_] if params[:class_] next unless s.method_ =~ params[:method_] if params[:method_] next unless s.args_ =~ params[:args_] if params[:args_] true } Qt4APISubset.new( subset ) end def classes @class_cache ||= @api.map{|s| s.class_}.uniq end def inspect @api.inspect end def method_missing meth , *args , &block result = @api.send meth , *args , &block result = Qt4APISubset.new(result) if result.is_a? Array result end end class Qt4APISubset < Qt4API end if $0 == __FILE__ api = Qt4API.new puts "Usage: method_regex,class_regex,args_regex,return_type_regex" print ">> " while params = gets.chomp # :return_ , :class_ , :method_ , :args_ begin found = api.find_signatures( params ) if found.length < 400 pp found.sort_by{|s| s.class_} end puts "Found #{found.length} matches" rescue => e puts e nil ensure print ">> " end end end