#/usr/bin/ruby require 'yaml' pecl_dir = open('config.yml') {|f| YAML::load f}['source']['pecl_dir'] file = code = data = mode = '' def php2ruby file, code, data # whitespace code.gsub! /\t/, ' ' # comments code.gsub!(/\/\*(.*?)\*\//m) {$1.gsub(/^(\s* ) (\S)/, '\1# \2')} # administrivia code.gsub! /require_once\('(prepare\w*).inc'\)/, '\1 conn' code.gsub! /require_once\('.*?'\);\s*/, '' # save here documents code.gsub! /, "(\n.*\n)"\);/m, ', <<.*?)\)/m, '{\1}' code.gsub! /\barray\s*\((\s*\S+,.*?)\)/m, '[\1]' code.gsub! /\barray\s*\((\s*\S+,.*?)\)/m, '[\1]' code.gsub! /\barray\s*\((\s*\d+\s*)\)/m, '[\1]' # printing code.gsub! /\{\$(.*?)\}/, '#{\1}' code.gsub! /^(\s*)echo /, '\1print ' code.gsub! 'printf (', 'printf(' code.gsub! '."\n"', ' . "\n"' code.gsub! '".$', '" . $' code.gsub! '$j ."', '$j . "' code.gsub! /^(\s*)print (.*?);/ do pre,chunks = $1, $2.split(' . ') chunks = chunks.map do |chunk| if chunk[0] == ?" and chunk[-1] == ?" chunk[1..-2] elsif chunk[0] == ?' and chunk[-1] == ?' chunk[1..-2] else '#{' + chunk.gsub('$','') + '}' end end pre + 'print "' + chunks.join('') + '";' end code.gsub! /(\s*)print(\s+".*)\\n";$/, '\1puts\2";' code.gsub! /(\s*)puts(\s+".*\\n)";$/, '\1print\2\n";' # string interpolation chunks = code.split('"') (1 ... chunks.length).each do |i| if i % 2 == 1 chunks[i].gsub! /\$([\w\[\]]+)/, '#{\1}' else end end code = chunks.join('"') code.gsub! /(\s*)(print|puts)\s+"#\{([^}]*)\}";$/, '\1\2 \3;' # concatenation code.gsub! ']."', '] + "' code.gsub! '."/".', '+ "/" +' code.gsub! '." "', ' + " "' code.gsub! ' . ', ' + ' code.gsub! "'. ", "' + " # optional parens code.gsub! /^(\s*DB2::\w+)\s*\(\s*(.*?)\s*\);$/, '\1 \2;' code.gsub! /^(\s*\$\w+\s*=\s*DB2::\w+)\s*\(\s*(.*?)\s*\);$/, '\1 \2;' code.gsub! /^\b(var_dump)\s*\(\s*(.*?)\s*\);$/, '\1 \2;' code.gsub! /\(\);$/, ';' code.gsub! '()}', '}' # php => ruby code.gsub! /die\s*\(\s*(.*)\s*\)\s*;/, 'throw \1;' code.gsub! /file_get_contents\s*\(\s*(.*)\s*\)\s*;/, 'open(\1) {|f| f.read};' code.gsub! /sizeof\s*\(\s*(.*?)\s*\)/, '\1.size' code.gsub! /strlen\s*\(\s*(.*)\s*\)/, '\1.length' code.gsub! /strtoupper\s*\(\s*(.*?)\s*\)/, '\1.upcase' code.gsub! /trim\s*\(\s*(.*?)\s*\)/, '\1.strip' code.gsub! /exit\(?\)?;/, 'next;' code.gsub! /null/, 'nil' code.gsub! /&\$/, '' code.gsub! '.=', '+=' code.gsub! '++;', '+=1;' code.gsub! '++)', '+=1)' code.gsub! '--;', '-=1;' code.gsub! '->', '.' code.gsub! '//', '#' code.gsub! /@(.*);/, '\1 rescue nil;' code.gsub! /;$/, '' code.gsub! '$', '' # restore here document code.sub! /<</m)[-1][0].strip code, data = php2ruby file, code, '' # output code if file.gsub! /.*?(\w+)\.\w+$/, '\1.rb' open("tests/#{file}",'w') {|$stdout| erb.run} end end ######################################################################## # test cases # ######################################################################## erb = ERB.new(open('phpt2ruby.erb') {|f| f.read}) Dir[pecl_dir + '/ibm_db2/tests/test_*.phpt'].each do |file| code = open(file) {|f| f.read}.scan(/<\?php(.*?)\?>/m)[-1][0].strip data = open(file) {|f| f.read}.scan(/\n--EXPECTF?--\n(.*)/m)[-1][0].chomp mode = open(file) {|f| f.read}.scan(/\n--(EXPECTF?)--\n/m)[-1][0].downcase code, data = php2ruby file, code, data # output code if file.gsub! /.*?(\w+)\.\w+$/, '\1.rb' open("tests/#{file}",'w') {|$stdout| erb.run} end end