diff --git a/std-script/compile b/std-script/compile --- a/std-script/compile +++ b/std-script/compile @@ -26,10 +26,18 @@ C_COMPILER = "/usr/bin/gcc" CPLUSPLUS_COMPILER = "/usr/bin/g++" PASCAL_COMPILER = "/usr/bin/fpc" +JAVA_COMPILER = "/usr/bin/javac" +RUBY_INTERPRETER = "/usr/bin/ruby" +PYTHON_INTERPRETER = "/usr/bin/python" +PYTHON_CHECKER = "/usr/bin/pyflakes" +PHP_INTERPRETER = "/usr/bin/php" C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall" -CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall" +CPLUSPLUS_OPTIONS = "-O2 -s -std=c++11 -static -DCONTEST -lm -Wall" PASCAL_OPTIONS = "-O1 -XS -dCONTEST" +JAVA_OPTIONS = "" +PYTHON_OPTIONS = "" +PHP_OPTIONS = "-l" # Check for the correct number of arguments. Otherwise, print usage. if ARGV.length == 0 or ARGV.length > 4 @@ -84,20 +92,87 @@ # Compile. case params[:prog_lang] - when "c" - command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}" - system(command) +when "c" + command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS}" + system(command, err: params[:message_file]) + +when "c++" + command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS}" + system(command, err: params[:message_file]) + +when "pas" + command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS}" + system(command,out: params[:message_file]) + FileUtils.mv("output", params[:output_file]) + +when "java" + #rename the file to the public class name + + #get the class name + classname = 'DUMMY' + source = Array.new + File.foreach(params[:source_file],'r:UTF-8') do |line| + line.encode!('UTF-8','UTF-8',invalid: :replace, replace: '') + md = /\s*public\s*class\s*(\w*)/.match(line) + classname=md[1] if md + source << line unless line =~ /\s*package\s*\w+\s*\;/ + end + File.open("#{classname}.java","w") do |file| + source.each do |s| + file.puts s + end + end + #system("cp #{params[:source_file]} #{classname}.java") + command = "#{JAVA_COMPILER} -encoding utf8 #{classname}.java" + system(command, err: params[:message_file]) + if File.exists?(classname + ".class") + File.open(params[:output_file],"w") {|file| file.write("#{classname}")} + end + if classname == 'DUMMY' + File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")} + end - when "c++" - command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}" - system(command) - - when "pas" - command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}" - system(command) - FileUtils.mv("output", params[:output_file]) - - else +when "ruby" + command = "#{RUBY_INTERPRETER} -c #{params[:source_file]}" + if system(command, err: params[:message_file]) + File.open(params[:output_file],"w") do |out_file| + out_file.puts "#!#{RUBY_INTERPRETER}" + File.open(params[:source_file],"r").each do |line| + out_file.print line + end + end + File.chmod(0755, params[:output_file]) + end + +when "python" + command = "#{PYTHON_CHECKER} #{params[:source_file]}" + if system(command, out: params[:message_file]) + #compile to python bytecode + command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}" + puts "compile: #{command}" + system(command) + puts "pwd: " + Dir.pwd + Dir.new('.').each {|file| puts file} + File.open(params[:output_file],"w") do |out_file| + out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c" + end + File.chmod(0755, params[:output_file]) + FileUtils.cp("#{params[:source_file]}c",params[:output_file]) + end + +when "php" + command = "#{PHP_INTERPRETER} #{PHP_OPTIONS} #{params[:source_file]}" + if system(command, err: params[:message_file]) + File.open(params[:output_file],"w") do |out_file| + out_file.puts "#!#{PHP_INTERPRETER}" + File.open(params[:source_file],"r").each do |line| + out_file.print line + end + end + File.chmod(0755, params[:output_file]) + end + +else talk("ERROR: Invalid language specified!") open(params[:message_file],"w") do |f| f.puts "ERROR: Invalid language specified!"