diff options
author | N.N. <matju@users.sourceforge.net> | 2008-04-28 18:10:15 +0000 |
---|---|---|
committer | N.N. <matju@users.sourceforge.net> | 2008-04-28 18:10:15 +0000 |
commit | 91c0003b158e5f0ed9d0677fb136ae8bb6f86ec5 (patch) | |
tree | d413a48086819f6a2620cd27d030861d122d4f3f /externals/gridflow/base/source_filter.rb | |
parent | 98dfdfa2fc1c92ba69e33fd77ed3392034297c1f (diff) |
this is an old gridflow, and there's already a svn repository at http://gridflow.ca/svn/trunk
svn path=/trunk/; revision=9739
Diffstat (limited to 'externals/gridflow/base/source_filter.rb')
-rw-r--r-- | externals/gridflow/base/source_filter.rb | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/externals/gridflow/base/source_filter.rb b/externals/gridflow/base/source_filter.rb deleted file mode 100644 index c55f4d95..00000000 --- a/externals/gridflow/base/source_filter.rb +++ /dev/null @@ -1,276 +0,0 @@ -#!/usr/bin/env ruby - -$keywords = %w(class decl def end grdecl) -$stack = [] -$classes = [] - -ClassDecl = Struct.new(:name,:supername,:methods,:grins,:attrs,:info) -MethodDecl = Struct.new(:rettype,:selector,:arglist,:minargs,:maxargs,:where,:static) -Arg = Struct.new(:type,:name,:default) - -class MethodDecl - def ==(o) - return false unless rettype==o.rettype && static==o.static && - maxargs==o.maxargs # && minargs==o.minargs - arglist.each_index{|i| arglist[i] == o.arglist[i] or return false } - return true - end -end - -class Arg - def ==(o) - type==o.type && name==o.name # && default==o.default - end -end - -In = File.open ARGV[0], "r" -Out = File.open ARGV[1], "w" - -def handle_class(line) - raise "already in class #{where}" if $stack[-1] and ClassDecl===$stack[-1] - #STDERR.puts "class: #{line}" - /^(\w+)(?:\s*<\s*(\w+))?$/.match line or raise "syntax error #{where}" - q=ClassDecl.new($1,$2,{},{},{},false) - $stack << q - $classes << q - Out.puts "" -end - -def parse_methoddecl(line,term) - /^(static\s)?\s*(\w+)\s+(\w+)\s*\(([^\)]*)\)\s*#{term}/.match line or - raise "syntax error #{where} #{line}" - static,rettype,selector,arglist = $1,$2,$3,$4 - arglist,minargs,maxargs = parse_arglist arglist - MethodDecl.new(rettype,selector,arglist,minargs,maxargs,where,static) -end - -def parse_arglist(arglist) - arglist = arglist.split(/,/) - maxargs = arglist.length - args = arglist.map {|arg| - if /^\s*\.\.\.\s*$/.match arg then maxargs=-1; next end - /^\s*([\w\s\*<>]+)\s*\b(\w+)\s*(?:\=(.*))?/.match arg or - raise "syntax error in \"#{arg}\" #{where}" - type,name,default=$1,$2,$3 - Arg.new(type.sub(/\s+$/,""),name,default) - }.compact - minargs = args.length - minargs-=1 while minargs>0 and args[minargs-1].default - [args,minargs,maxargs] -end - -def unparse_arglist(arglist,with_default=true) - arglist.map {|arg| - x="#{arg.type} #{arg.name} " - x<<'='<<arg.default if with_default and arg.default - x - }.join(", ") -end - -def where - "[#{ARGV[0]}:#{$linenumber}]" -end - -def handle_attr(line) - type = line.gsub(%r"//.*$","").gsub(%r"/\*.*\*/","").gsub(%r";?\s*$","") - name = type.slice!(/\w+$/) - raise "missing \\class #{where}" if - not $stack[-1] or not ClassDecl===$stack[-1] - $stack[-1].attrs[name]=Arg.new(type,name,nil) - Out.print line.gsub(/\/\/.*$/,"") # hack! - handle_decl "void _0_#{name}_m (#{type} #{name});" -# Out.puts "# #{$linenumber}" -end - -def handle_decl(line) - raise "missing \\class #{where}" if - not $stack[-1] or not ClassDecl===$stack[-1] - classname = $stack[-1].name - m = parse_methoddecl(line,";\s*$") - $stack[-1].methods[m.selector] = m - - Out.print "static " if m.static - Out.print "#{m.rettype} #{m.selector}(int argc, Ruby *argv" - Out.print "," if m.arglist.length>0 - Out.print "#{unparse_arglist m.arglist});" - Out.puts "static Ruby #{m.selector}_wrap"+ - "(int argc, Ruby *argv, Ruby rself);//FCS" -# Out.puts "# #{$linenumber}" -end - -def handle_def(line) - m = parse_methoddecl(line,"\\{?.*$") - term = line[/\{.*/] - qlass = $stack[-1] - raise "missing \\class #{where}" if not qlass or not ClassDecl===qlass - classname = qlass.name - if qlass.methods[m.selector] - n = m; m = qlass.methods[m.selector] - if m!=n then - STDERR.puts "warning: def does not match decl:" - STDERR.puts "#{m.where}: \\decl #{m.inspect}" - STDERR.puts "#{n.where}: \\def #{n.inspect}" - end - else - qlass.methods[m.selector] = m - end - - Out.print "Ruby #{classname}::#{m.selector}_wrap"+ - "(int argc, Ruby *argv, Ruby rself) {"+ - "static const char *methodspec = "+ - "\"#{qlass.name}::#{m.selector}(#{unparse_arglist m.arglist,false})\";"+ - "DGS(#{classname});" - - Out.print "if (argc<#{m.minargs}" - Out.print "||argc>#{m.maxargs}" if m.maxargs!=-1 - Out.print ") RAISE(\"got %d args instead of %d..%d in %s\""+ - ",argc,#{m.minargs},#{m.maxargs},methodspec);" - - error = proc {|x,y| - "RAISE(\"got %s instead of #{x} in %s\","+ - "rb_str_ptr(rb_inspect(rb_obj_class(#{y}))),methodspec)" - } - - m.arglist.each_with_index{|arg,i| - case arg.type - when "Symbol" - Out.print "if (argc>#{i} && TYPE(argv[#{i}])!=T_SYMBOL) "+ - error[arg.type,"argv[#{i}]"]+";" - when "Array" - Out.print "if (argc>#{i} && TYPE(argv[#{i}])!=T_ARRAY) "+ - error[arg.type,"argv[#{i}]"]+";" - when "String" - Out.print "if (argc>#{i} && TYPE(argv[#{i}])==T_SYMBOL) "+ - "argv[#{i}]=rb_funcall(argv[#{i}],SI(to_s),0);" - Out.print "if (argc>#{i} && TYPE(argv[#{i}])!=T_STRING) "+ - error[arg.type,"argv[#{i}]"]+";" - end - } - -# Out.print "return " if m.rettype!="void" - Out.print "VALUE foo = " if m.rettype!="void" ### - - Out.print " self->#{m.selector}(argc,argv" - m.arglist.each_with_index{|arg,i| - if arg.default then - Out.print ",argc<#{i+1}?#{arg.default}:convert(argv[#{i}],(#{arg.type}*)0)" - else - Out.print ",convert(argv[#{i}],(#{arg.type}*)0)" - end - } - Out.print ");" - Out.print "self->check_magic();" - Out.print "return Qnil;" if m.rettype=="void" - Out.print "return foo;" if m.rettype!="void" ### - Out.print "} #{m.rettype} #{classname}::#{m.selector}(int argc, Ruby *argv" - Out.print "," if m.arglist.length>0 - Out.puts "#{unparse_arglist m.arglist, false})#{term}//FCS" -end - -def handle_classinfo(line) - frame = $stack[-1] - cl = frame.name - line="{}" if /^\s*$/ =~ line - Out.puts "static void #{cl}_startup (Ruby rself);" - Out.puts "static void *#{cl}_allocator () {return new #{cl};}" - Out.puts "static MethodDecl #{cl}_methods[] = {" - Out.puts frame.methods.map {|foo,method| - c,s = frame.name,method.selector - "{ \"#{s}\",(RMethod)#{c}::#{s}_wrap }" - }.join(",") - Out.puts "}; static FClass ci#{cl} = { #{cl}_allocator, #{cl}_startup," - Out.puts "#{cl.inspect}, COUNT(#{cl}_methods), #{cl}_methods };" - Out.puts "void #{frame.name}_startup (Ruby rself) "+line -end - -def handle_grin(line) - fields = line.split(/\s+/) - i = fields[0].to_i - c = $stack[-1].name - Out.print "template <class T> void grin_#{i}(GridInlet *in, int n, Pt<T> data);" - Out.print "template <class T> static void grinw_#{i} (GridInlet *in, int n, Pt<T> data);" - Out.print "static GridHandler grid_#{i}_hand;" - handle_decl "Ruby _#{i}_grid(...);" - $stack[-1].grins[i] = fields.dup -end - -def handle_end(line) - frame = $stack.pop - fields = line.split(/\s+/) - n = fields.length - if ClassDecl===frame then - #handle_classinfo if not frame.info - cl = frame.name - if fields[0]!="class" or - (n>1 and fields[1]!=cl) - then raise "end not matching #{where}" end - $stack.push frame - frame.attrs.each {|name,attr| - type,name,default = attr.to_a - #STDERR.puts "type=#{type} name=#{name} default=#{default}" - handle_def "void _0_#{name}_m (#{type} #{name}) { this->#{name}=#{name}; }" - } - frame.grins.each {|i,v| - k = case v[1] - when nil; '4' - when 'int32'; '1' - when 'int'; '2' - when 'float'; 'F' - else raise 'BORK BORK BORK' end - Out.print "static GridHandler #{cl}_grid_#{i}_hand = GRIN#{k}(#{cl},#{i});" - handle_def "Ruby _#{i}_grid(...) {"+ - "if (in.size()<=#{i}) in.resize(#{i}+1);"+ - "if (!in[#{i}]) in[#{i}]=new GridInlet((GridObject *)this,&#{cl}_grid_#{i}_hand);"+ - "return in[#{i}]->begin(argc,argv);}" - - } - $stack.pop - Out.puts "# #{$linenumber}" - end - if :ruby==frame then - if fields[0]!="ruby" then raise "expected \\end ruby" end - end - Out.puts "" -end - -def handle_startall(line) - $classes.each {|q| - Out.print "rb_funcall(EVAL(\"GridFlow\"),SI(fclass_install),2,PTR2FIX(&ci#{q.name})," - if q.supername then - Out.print "EVAL(\"GridFlow::#{q.supername}\"));" - else - Out.print "Qnil);" - end - } - Out.puts "" -end - -def handle_ruby(line) - Out.puts "" - $stack.push :ruby -end - -$rubymode=false -$linenumber=1 -loop{ - x = In.gets - break if not x - if /^\s*\\(\w+)\s*(.*)$/.match x then - begin - send("handle_#{$1}",$2) - rescue StandardError => e - STDERR.puts e.inspect - STDERR.puts "at line #{$linenumber}" - STDERR.puts e.backtrace - File.unlink ARGV[1] - exit 1 - end - else - if $stack[-1]==:ruby then - x.gsub!(/([\\\"])/) { "\\"+$1 } - x="\"#{x.chomp}\\n\"\n" - end - Out.puts x - end - $linenumber+=1 -} |