#!/usr/bin/ruby

# /* LICENSE:
#   =========================================================================
#     CMPack'04 Source Code Release for OPEN-R SDK 1.1.5-r2 for ERS7
#     Copyright (C) 2004 Multirobot Lab [Project Head: Manuela Veloso]
#     School of Computer Science, Carnegie Mellon University
#     All rights reserved.
#   ========================================================================= */

$verbose = false

$execute = true

def usage(exit_val)
  print "repl [options] <orig exp> <new exp> <file/dir1> [<file/dir2> ...]\n"
  print "-n	just simulate the change, don't actually change any files\n"
  exit exit_val
end

if(ARGV.size < 3)
  usage(1)
end

end_of_arguments = false
while(!end_of_arguments && ARGV[0][0] == '-'[0])
  case ARGV[0]
  when /-n/
    $execute = false
  when /-v/
    $verbose = true
  when /--/
    end_of_arguments = true
  end
  ARGV.shift
end

$orig = ARGV.shift
$new = ARGV.shift

$files_dirs = ARGV
$files = Array.new

while($file = $files_dirs.shift)
  case(File.ftype($file))
  when "directory"
    Dir.foreach($file) {|f|
      if(f!="." && f!="..")
        $files_dirs.push($file+"/"+f)
      end
    }
  when "file"
    $files.push($file)
  end
end

def binary?(filename)
  file = File.open(filename,"r")
  line = ""
  while(line.size < 256 && !file.eof?)
    line += file.gets()
  end
  bin_cnt = 0
  line.each_byte {|b|
    if(b.chr =~ /[^[:print:][:blank:][:space:]]/)
    #if(b >= 128 || b <= 9)
      #print "binary #{b}\n"
      bin_cnt+=1
    end
  }
  #print "binary test for '#{filename}' bin_cnt=#{bin_cnt} line.size=#{line.size} ratio=#{(bin_cnt+0.0) / line.size}\n"
  if((bin_cnt+0.0) / line.size > 0.1)
    true
  else
    false
  end
end

if($verbose)
  print "starting replacement of '#{$orig}' with '#{$new}'\n"
end

$orig_regexp = Regexp.new($orig)

$files.each {|filename|
  if(binary?(filename))
    if($verbose)
      print "skipping binary file '#{filename}'\n"
    end
  else
    printed_filename = false
    made_change = false
    if($verbose)
      printf "%s '#{$orig}' in '#{filename}': ",($execute ? "replacing" : "would replace")
      printed_filename=true
    end
    tmp_filename = "/tmp/reptmp"
    tmp_file = File.new(tmp_filename,"w")
    file = File.open(filename,"r")
    while(line = file.gets())
      line.gsub!($orig_regexp) {|old|
        if(!printed_filename)
          print "#{filename}: "
          printed_filename=true
        end
        print "+"
        made_change = true
        $new
      }
      tmp_file.print "#{line}"
    end
    file.close()
    tmp_file.close()
    if(printed_filename)
      print "\n"
    end
    if($execute && made_change)
      system("mv #{tmp_filename} #{filename}\n")
    else
      system("rm #{tmp_filename}")
    end
  end
}
