Description:
add more languages, java and ruby add bookmark algo-bm and branch algo
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r147:9e3cee7d454d - - 5 files changed: 52 inserted, 5 deleted

@@ -23,16 +23,19
23 end
23 end
24 end
24 end
25
25
26 C_COMPILER = "/usr/bin/gcc"
26 C_COMPILER = "/usr/bin/gcc"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
27 CPLUSPLUS_COMPILER = "/usr/bin/g++"
28 PASCAL_COMPILER = "/usr/bin/fpc"
28 PASCAL_COMPILER = "/usr/bin/fpc"
29 + JAVA_COMPILER = "/usr/bin/javac"
30 + RUBY_INTEPRETER = "/home/dae/.rvm/rubies/ruby-1.9.2-p320/bin/ruby"
29
31
30 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
32 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
31 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
33 CPLUSPLUS_OPTIONS = "-O2 -s -static -DCONTEST -lm -Wall"
32 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
34 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
35 + JAVA_OPTIONS = ""
33
36
34 # Check for the correct number of arguments. Otherwise, print usage.
37 # Check for the correct number of arguments. Otherwise, print usage.
35 if ARGV.length == 0 or ARGV.length > 4
38 if ARGV.length == 0 or ARGV.length > 4
36 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
39 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
37 puts
40 puts
38 puts "<source-file> is defaulted to \"source\"."
41 puts "<source-file> is defaulted to \"source\"."
@@ -94,12 +97,38
94
97
95 when "pas"
98 when "pas"
96 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
99 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
97 system(command)
100 system(command)
98 FileUtils.mv("output", params[:output_file])
101 FileUtils.mv("output", params[:output_file])
99
102
103 + when "java"
104 + #rename the file to the public class name
105 +
106 + #get the class name
107 + classname = 'DUMMY'
108 + File.foreach(params[:source_file]) do |line|
109 + md = /\s*public\s*class\s*(\w*)/.match(line)
110 + classname=md[1] if md
111 + end
112 + system("cp #{params[:source_file]} #{classname}.java")
113 + command = "#{JAVA_COMPILER} #{classname}.java > #{params[:message_file]}"
114 + system(command)
115 + File.open(params[:output_file],"w") {|file| file.write("#!/bin/sh\n/usr/bin/java #{classname}\n")}
116 + File.chmod(0755, params[:output_file])
117 +
118 + when "ruby"
119 + command = "#{RUBY_INTEPRETER} -c #{params[:source_file]} > #{params[:message_file]}"
120 + system(command)
121 + File.open(params[:output_file],"w") do |out_file|
122 + out_file.puts "#!#{RUBY_INTEPRETER}"
123 + File.open(params[:source_file],"r").each do |line|
124 + out_file.print line
125 + end
126 + end
127 + File.chmod(0755, params[:output_file])
128 +
100 else
129 else
101 talk("ERROR: Invalid language specified!")
130 talk("ERROR: Invalid language specified!")
102 open(params[:message_file],"w") do |f|
131 open(params[:message_file],"w") do |f|
103 f.puts "ERROR: Invalid language specified!"
132 f.puts "ERROR: Invalid language specified!"
104 end
133 end
105 exit(127)
134 exit(127)
@@ -50,13 +50,13
50 puts " <test-result-directory> is defaulted to ./test-result"
50 puts " <test-result-directory> is defaulted to ./test-result"
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
51 puts "WARNING: The judge script will forcefully create the (implicitly and explicitly) specified directories and remove anything inside it."
52 exit(127)
52 exit(127)
53 end
53 end
54
54
55 language = ARGV[0]
55 language = ARGV[0]
56 - if language != "c" && language != "c++" && language != "pas"
56 + if language != "c" && language != "c++" && language != "pas" && language != "java" && language != "ruby"
57 log "You specified a language that is not supported: #{language}."
57 log "You specified a language that is not supported: #{language}."
58 exit(127)
58 exit(127)
59 end
59 end
60
60
61 source_file = ARGV[1]
61 source_file = ARGV[1]
62 if File.exist?(source_file) == false
62 if File.exist?(source_file) == false
@@ -107,12 +107,13
107 if !FileTest.exist?("a.out")
107 if !FileTest.exist?("a.out")
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
108 log "Cannot compile the source code. See message in #{test_result_dir}/compile_message"
109 exit(127)
109 exit(127)
110 else
110 else
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
111 call_and_log("Cannot move the compiled program to #{test_result_dir}") {
112 FileUtils.mv("a.out",test_result_dir)
112 FileUtils.mv("a.out",test_result_dir)
113 + if language == "java" then Dir["*.class"].each { |file| FileUtils.mv(file,test_result_dir)} end
113 }
114 }
114 FileUtils.rm_rf("#{sandbox_dir}/.")
115 FileUtils.rm_rf("#{sandbox_dir}/.")
115 end
116 end
116
117
117 require "#{problem_home}/script/test_dsl.rb"
118 require "#{problem_home}/script/test_dsl.rb"
118 load "#{problem_home}/test_cases/all_tests.cfg"
119 load "#{problem_home}/test_cases/all_tests.cfg"
@@ -130,12 +131,13
130 $stdout.flush
131 $stdout.flush
131
132
132 log "Test number: #{test_num}"
133 log "Test number: #{test_num}"
133
134
134 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
135 call_and_log("Cannot copy the compiled program into #{sandbox_dir}") {
135 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
136 FileUtils.cp("#{test_result_dir}/a.out", sandbox_dir, :preserve => true)
137 + if language == "java" then Dir["#{test_result_dir}/*.class"].each { |file| FileUtils.cp(file,sandbox_dir)} end
136 }
138 }
137
139
138 begin
140 begin
139 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
141 execute("#{problem_home}/script/run #{language} #{test_num}", "Error occured during execution of the run script")
140 rescue
142 rescue
141 # do nothing
143 # do nothing
@@ -13,13 +13,14
13 fp.close
13 fp.close
14 end
14 end
15 end
15 end
16
16
17 def extract_time(t)
17 def extract_time(t)
18 # puts "TIME: #{t}"
18 #puts "TIME: #{t}"
19 - if (result=/^(.*)r(.*)u(.*)s/.match(t))
19 + #if (result=/^(.*)real(.*)wall(.*)s/.match(t))
20 + if (result=/^OK \((.*) sec real\, (.*) sec wall,.*MB, (.*) syscalls/.match(t))
20 {:real => result[1], :user => result[2], :sys => result[3]}
21 {:real => result[1], :user => result[2], :sys => result[3]}
21 else
22 else
22 #{:real => 0, :user => 0, :sys => 0}
23 #{:real => 0, :user => 0, :sys => 0}
23 #puts "ERROR READING RUNNING TIME: #{t}"
24 #puts "ERROR READING RUNNING TIME: #{t}"
24 raise "Error reading running time: #{t}"
25 raise "Error reading running time: #{t}"
25 end
26 end
@@ -81,14 +82,29
81
82
82 # Hide PROBLEM_HOME
83 # Hide PROBLEM_HOME
83 ENV['PROBLEM_HOME'] = nil
84 ENV['PROBLEM_HOME'] = nil
84
85
85 # Run the program.
86 # Run the program.
86 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
87 #run_command = "/usr/bin/time -f \"#{time_output_format}\" 2>run_result #{problem_home}/script/box_new -a 2 -f -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name}"
88 + #
87
89
90 +
91 +
92 +
93 + case language
94 + when "java"
95 + # for java, we have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
96 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s clone -s wait4 -p /usr/bin/ -p ./ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
97 + when "ruby"
98 + run_command = "#{problem_home}/script/box -T -t #{time_limit} -s getppid -s wait4 -s clone -s set_robust_list -s futex -s sigaltstack -p /dev/urandom -p ./ -p /home/dae/.rvm/rubies/ruby-1.9.2-p320/ -p #{problem_home}/ -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
99 + when "c++"
88 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
100 run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
101 + else
102 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit} -m #{mem_limit} -i #{input_file_name} -o output.txt #{program_name} 2>run_result"
103 + end
104 +
89
105
90 log "Running test #{test_num}..."
106 log "Running test #{test_num}..."
91 log run_command
107 log run_command
92 log
108 log
93 system(run_command)
109 system(run_command)
94
110
@@ -134,13 +150,13
134
150
135 if run_result[0][0,2] != "OK"
151 if run_result[0][0,2] != "OK"
136 log "There was a runtime error."
152 log "There was a runtime error."
137 report.call(run_result[0], 0, "No comment.\n")
153 report.call(run_result[0], 0, "No comment.\n")
138 end
154 end
139
155
140 - if running_time[:user].to_f + running_time[:sys].to_f > time_limit
156 + if running_time[:user].to_f > time_limit
141 log "Time limit exceeded."
157 log "Time limit exceeded."
142 report.call("Time limit exceeded", 0, "No comment.\n")
158 report.call("Time limit exceeded", 0, "No comment.\n")
143 end
159 end
144
160
145 # Run 'check' to evaluate the output.
161 # Run 'check' to evaluate the output.
146 #puts "There was no runtime error. Proceed to checking the output."
162 #puts "There was no runtime error. Proceed to checking the output."
@@ -1,7 +1,7
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
@@ -1,7 +1,7
1 - #!/usr/bin/ruby
1 + #!/usr/bin/env ruby
2
2
3 problem_home = ENV['PROBLEM_HOME']
3 problem_home = ENV['PROBLEM_HOME']
4 require "#{problem_home}/script/test_dsl.rb"
4 require "#{problem_home}/script/test_dsl.rb"
5
5
6 if ARGV.length < 2
6 if ARGV.length < 2
7 puts "Usage: check <language> <test-number> [<output-file>]"
7 puts "Usage: check <language> <test-number> [<output-file>]"
You need to be logged in to leave comments. Login now