Description:
merge
Commit status:
[Not Reviewed]
References:
merge java
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r179:9eed5e566314 - - 2 files changed: 20 inserted, 20 deleted

@@ -1,187 +1,187
1 #!/usr/bin/env ruby
1 #!/usr/bin/env ruby
2
2
3 require 'fileutils'
3 require 'fileutils'
4
4
5 ##############################
5 ##############################
6 #
6 #
7 # Standard Compile Script
7 # Standard Compile Script
8 #
8 #
9 # Supported compilers:
9 # Supported compilers:
10 # gcc, g++, and fpc.
10 # gcc, g++, and fpc.
11 #
11 #
12 ##############################
12 ##############################
13
13
14 def talk(str='')
14 def talk(str='')
15 if ENV['TALKATIVE']!=nil
15 if ENV['TALKATIVE']!=nil
16 puts str
16 puts str
17 end
17 end
18 if ENV['GRADER_LOGGING']!=nil
18 if ENV['GRADER_LOGGING']!=nil
19 log_fname = ENV['GRADER_LOGGING']
19 log_fname = ENV['GRADER_LOGGING']
20 fp = File.open(log_fname,"a")
20 fp = File.open(log_fname,"a")
21 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
21 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
22 fp.close
22 fp.close
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"
29 JAVA_COMPILER = "/usr/bin/javac"
30 RUBY_INTERPRETER = "/usr/bin/ruby"
30 RUBY_INTERPRETER = "/usr/bin/ruby"
31 PYTHON_INTERPRETER = "/usr/bin/python"
31 PYTHON_INTERPRETER = "/usr/bin/python"
32 PYTHON_CHECKER = "/usr/bin/pyflakes"
32 PYTHON_CHECKER = "/usr/bin/pyflakes"
33 PHP_INTERPRETER = "/usr/bin/php"
33 PHP_INTERPRETER = "/usr/bin/php"
34
34
35 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
35 C_OPTIONS = "-O2 -s -static -std=c99 -DCONTEST -lm -Wall"
36 CPLUSPLUS_OPTIONS = "-O2 -s -std=c++11 -static -DCONTEST -lm -Wall"
36 CPLUSPLUS_OPTIONS = "-O2 -s -std=c++11 -static -DCONTEST -lm -Wall"
37 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
37 PASCAL_OPTIONS = "-O1 -XS -dCONTEST"
38 JAVA_OPTIONS = ""
38 JAVA_OPTIONS = ""
39 PYTHON_OPTIONS = ""
39 PYTHON_OPTIONS = ""
40 PHP_OPTIONS = "-l"
40 PHP_OPTIONS = "-l"
41
41
42 # Check for the correct number of arguments. Otherwise, print usage.
42 # Check for the correct number of arguments. Otherwise, print usage.
43 if ARGV.length == 0 or ARGV.length > 4
43 if ARGV.length == 0 or ARGV.length > 4
44 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
44 puts "Usage: compile <language> [<source-file>] [<output-file>] [<message-file>]"
45 puts
45 puts
46 puts "<source-file> is defaulted to \"source\"."
46 puts "<source-file> is defaulted to \"source\"."
47 puts "<output-file> is defaulted to \"a.out\"."
47 puts "<output-file> is defaulted to \"a.out\"."
48 puts "<message-file> is defaulted to \"compiler_message\"."
48 puts "<message-file> is defaulted to \"compiler_message\"."
49 puts
49 puts
50 exit(127)
50 exit(127)
51 end
51 end
52
52
53 PARAMS = {
53 PARAMS = {
54 :source_file => [1,'source'],
54 :source_file => [1,'source'],
55 :output_file => [2,'a.out'],
55 :output_file => [2,'a.out'],
56 :message_file => [3,'compiler_message']
56 :message_file => [3,'compiler_message']
57 }
57 }
58
58
59 params = {}
59 params = {}
60 params[:prog_lang] = ARGV[0]
60 params[:prog_lang] = ARGV[0]
61 PARAMS.each_key do |param_name|
61 PARAMS.each_key do |param_name|
62 index, default = PARAMS[param_name]
62 index, default = PARAMS[param_name]
63 if ARGV.length > index
63 if ARGV.length > index
64 params[param_name] = ARGV[index]
64 params[param_name] = ARGV[index]
65 else
65 else
66 params[param_name] = default
66 params[param_name] = default
67 end
67 end
68 talk "#{param_name}: #{params[param_name]}"
68 talk "#{param_name}: #{params[param_name]}"
69 end
69 end
70
70
71 # Remove any remaining output files or message files.
71 # Remove any remaining output files or message files.
72 if FileTest.exists? params[:output_file]
72 if FileTest.exists? params[:output_file]
73 FileUtils.rm(params[:output_file])
73 FileUtils.rm(params[:output_file])
74 end
74 end
75 if FileTest.exists? params[:message_file]
75 if FileTest.exists? params[:message_file]
76 FileUtils.rm(params[:message_file])
76 FileUtils.rm(params[:message_file])
77 end
77 end
78
78
79 # Check if the source file exists before attempt compiling.
79 # Check if the source file exists before attempt compiling.
80 if !FileTest.exists? params[:source_file]
80 if !FileTest.exists? params[:source_file]
81 talk("ERROR: The source file does not exist!")
81 talk("ERROR: The source file does not exist!")
82 open(params[:message_file],"w") do |f|
82 open(params[:message_file],"w") do |f|
83 f.puts "ERROR: The source file did not exist."
83 f.puts "ERROR: The source file did not exist."
84 end
84 end
85 exit(127)
85 exit(127)
86 end
86 end
87
87
88 if params[:prog_lang]=='cpp'
88 if params[:prog_lang]=='cpp'
89 params[:prog_lang] = 'c++'
89 params[:prog_lang] = 'c++'
90 end
90 end
91
91
92 # Compile.
92 # Compile.
93 case params[:prog_lang]
93 case params[:prog_lang]
94
94
95 when "c"
95 when "c"
96 - command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
96 + command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS}"
97 - system(command)
97 + system(command, err: params[:message_file])
98
98
99 when "c++"
99 when "c++"
100 - command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
100 + command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS}"
101 - system(command)
101 + system(command, err: params[:message_file])
102
102
103 when "pas"
103 when "pas"
104 - command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
104 + command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS}"
105 - system(command)
105 + system(command,out: params[:message_file])
106 FileUtils.mv("output", params[:output_file])
106 FileUtils.mv("output", params[:output_file])
107
107
108 when "java"
108 when "java"
109 #rename the file to the public class name
109 #rename the file to the public class name
110
110
111 #get the class name
111 #get the class name
112 classname = 'DUMMY'
112 classname = 'DUMMY'
113 source = Array.new
113 source = Array.new
114 File.foreach(params[:source_file]) do |line|
114 File.foreach(params[:source_file]) do |line|
115 md = /\s*public\s*class\s*(\w*)/.match(line)
115 md = /\s*public\s*class\s*(\w*)/.match(line)
116 classname=md[1] if md
116 classname=md[1] if md
117 source << line unless line =~ /\s*package\s*\w+\s*\;/
117 source << line unless line =~ /\s*package\s*\w+\s*\;/
118 end
118 end
119 File.open("#{classname}.java","w") do |file|
119 File.open("#{classname}.java","w") do |file|
120 source.each do |s|
120 source.each do |s|
121 file.puts s
121 file.puts s
122 end
122 end
123 end
123 end
124 #system("cp #{params[:source_file]} #{classname}.java")
124 #system("cp #{params[:source_file]} #{classname}.java")
125 - command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
125 + command = "#{JAVA_COMPILER} #{classname}.java"
126 - system(command)
126 + system(command, err: params[:message_file])
127 if File.exists?(classname + ".class")
127 if File.exists?(classname + ".class")
128 File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
128 File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
129 end
129 end
130 if classname == 'DUMMY'
130 if classname == 'DUMMY'
131 File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
131 File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
132 end
132 end
133
133
134 when "ruby"
134 when "ruby"
135 - command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
135 + command = "#{RUBY_INTERPRETER} -c #{params[:source_file]}"
136 - if system(command)
136 + if system(command, err: params[:message_file])
137 File.open(params[:output_file],"w") do |out_file|
137 File.open(params[:output_file],"w") do |out_file|
138 out_file.puts "#!#{RUBY_INTERPRETER}"
138 out_file.puts "#!#{RUBY_INTERPRETER}"
139 File.open(params[:source_file],"r").each do |line|
139 File.open(params[:source_file],"r").each do |line|
140 out_file.print line
140 out_file.print line
141 end
141 end
142 end
142 end
143 File.chmod(0755, params[:output_file])
143 File.chmod(0755, params[:output_file])
144 end
144 end
145
145
146 when "python"
146 when "python"
147 - command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
147 + command = "#{PYTHON_CHECKER} #{params[:source_file]}"
148 - if system(command)
148 + if system(command, out: params[:message_file])
149 #compile to python bytecode
149 #compile to python bytecode
150 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
150 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
151 puts "compile: #{command}"
151 puts "compile: #{command}"
152 system(command)
152 system(command)
153 puts "pwd: " + Dir.pwd
153 puts "pwd: " + Dir.pwd
154 Dir.new('.').each {|file| puts file}
154 Dir.new('.').each {|file| puts file}
155 File.open(params[:output_file],"w") do |out_file|
155 File.open(params[:output_file],"w") do |out_file|
156 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
156 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
157 end
157 end
158 File.chmod(0755, params[:output_file])
158 File.chmod(0755, params[:output_file])
159 FileUtils.cp("#{params[:source_file]}c",params[:output_file])
159 FileUtils.cp("#{params[:source_file]}c",params[:output_file])
160 end
160 end
161
161
162 when "php"
162 when "php"
163 - command = "#{PHP_INTERPRETER} #{PHP_OPTIONS} #{params[:source_file]} 2> #{params[:message_file]}"
163 + command = "#{PHP_INTERPRETER} #{PHP_OPTIONS} #{params[:source_file]}"
164 - if system(command)
164 + if system(command, err: params[:message_file])
165 File.open(params[:output_file],"w") do |out_file|
165 File.open(params[:output_file],"w") do |out_file|
166 out_file.puts "#!#{PHP_INTERPRETER}"
166 out_file.puts "#!#{PHP_INTERPRETER}"
167 File.open(params[:source_file],"r").each do |line|
167 File.open(params[:source_file],"r").each do |line|
168 out_file.print line
168 out_file.print line
169 end
169 end
170 end
170 end
171 File.chmod(0755, params[:output_file])
171 File.chmod(0755, params[:output_file])
172 end
172 end
173
173
174 else
174 else
175 talk("ERROR: Invalid language specified!")
175 talk("ERROR: Invalid language specified!")
176 open(params[:message_file],"w") do |f|
176 open(params[:message_file],"w") do |f|
177 f.puts "ERROR: Invalid language specified!"
177 f.puts "ERROR: Invalid language specified!"
178 end
178 end
179 exit(127)
179 exit(127)
180 end
180 end
181
181
182 # Report success or failure.
182 # Report success or failure.
183 if FileTest.exists? params[:output_file]
183 if FileTest.exists? params[:output_file]
184 talk "Compilation was successful!"
184 talk "Compilation was successful!"
185 else
185 else
186 talk "ERROR: Something was wrong during the compilation!"
186 talk "ERROR: Something was wrong during the compilation!"
187 end
187 end
@@ -11,179 +11,179
11 fp = File.open(log_fname,"a")
11 fp = File.open(log_fname,"a")
12 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
12 fp.puts("run: #{Time.new.strftime("%H:%M")} #{str}")
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=/^(.*)r(.*)u(.*)s/.match(t))
20 {:real => result[1], :user => result[2], :sys => result[3]}
20 {:real => result[1], :user => result[2], :sys => result[3]}
21 else
21 else
22 #{:real => 0, :user => 0, :sys => 0}
22 #{:real => 0, :user => 0, :sys => 0}
23 #puts "ERROR READING RUNNING TIME: #{t}"
23 #puts "ERROR READING RUNNING TIME: #{t}"
24 raise "Error reading running time: #{t}"
24 raise "Error reading running time: #{t}"
25 end
25 end
26 end
26 end
27
27
28 def compile_box(source,bin)
28 def compile_box(source,bin)
29 system("g++ #{source} -o #{bin}")
29 system("g++ #{source} -o #{bin}")
30 end
30 end
31
31
32 if ARGV.length < 2 || ARGV.length > 3
32 if ARGV.length < 2 || ARGV.length > 3
33 puts "Usage: run <language> <test-num> [<program-name>]"
33 puts "Usage: run <language> <test-num> [<program-name>]"
34 exit(127)
34 exit(127)
35 end
35 end
36
36
37 language = ARGV[0]
37 language = ARGV[0]
38 test_num = ARGV[1].to_i
38 test_num = ARGV[1].to_i
39 if ARGV.length > 2
39 if ARGV.length > 2
40 program_name = ARGV[2]
40 program_name = ARGV[2]
41 else
41 else
42 program_name = "a.out"
42 program_name = "a.out"
43 end
43 end
44
44
45 problem_home = ENV['PROBLEM_HOME']
45 problem_home = ENV['PROBLEM_HOME']
46 source_name = ENV['SOURCE_NAME']
46 source_name = ENV['SOURCE_NAME']
47 require "#{problem_home}/script/test_dsl.rb"
47 require "#{problem_home}/script/test_dsl.rb"
48 load "#{problem_home}/test_cases/all_tests.cfg"
48 load "#{problem_home}/test_cases/all_tests.cfg"
49 problem = Problem.get_instance
49 problem = Problem.get_instance
50
50
51 sandbox_dir = Dir.getwd
51 sandbox_dir = Dir.getwd
52
52
53 if problem.well_formed? == false
53 if problem.well_formed? == false
54 log "The problem specification is not well formed."
54 log "The problem specification is not well formed."
55 exit(127)
55 exit(127)
56 end
56 end
57
57
58 # Check if the test number is okay.
58 # Check if the test number is okay.
59 if test_num <= 0 || test_num > problem.num_tests
59 if test_num <= 0 || test_num > problem.num_tests
60 log "You have specified a wrong test number."
60 log "You have specified a wrong test number."
61 exit(127)
61 exit(127)
62 end
62 end
63
63
64 #####################################
64 #####################################
65 # Set the relavant file names here. #
65 # Set the relavant file names here. #
66 #####################################
66 #####################################
67
67
68 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
68 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
69
69
70 #####################################
70 #####################################
71
71
72 time_limit = problem.get_time_limit test_num
72 time_limit = problem.get_time_limit test_num
73 mem_limit = problem.get_mem_limit(test_num) * 1024
73 mem_limit = problem.get_mem_limit(test_num) * 1024
74
74
75 # Copy the input file.
75 # Copy the input file.
76 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
76 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
77
77
78 # check if box is there, if not, compile it!
78 # check if box is there, if not, compile it!
79 if !File.exists?("#{problem_home}/script/box")
79 if !File.exists?("#{problem_home}/script/box")
80 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
80 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
81 compile_box("#{problem_home}/script/box.cc",
81 compile_box("#{problem_home}/script/box.cc",
82 "#{problem_home}/script/box")
82 "#{problem_home}/script/box")
83 end
83 end
84
84
85 # Hide PROBLEM_HOME
85 # Hide PROBLEM_HOME
86 ENV['PROBLEM_HOME'] = nil
86 ENV['PROBLEM_HOME'] = nil
87 ENV['SOURCE_NAME'] = nil
87 ENV['SOURCE_NAME'] = nil
88
88
89 # Run the program.
89 # Run the program.
90 #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}"
90 #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}"
91 #
91 #
92
92
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
93 JAVA_OPTION = "-s set_robust_list -s futex -s clone -s getppid -s clone -s wait4 -p /usr/bin/ -p ./"
94 RUBY_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -p #{sandbox_dir}/ -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat -s pipe"
94 RUBY_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -p #{sandbox_dir}/ -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat -s pipe"
95 PYTHON_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /usr/bin/ -p /lib64/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -s futex -E PYTHONNOUSERSITE=yes"
95 PYTHON_OPTION = "-p /usr/lib64/ -p /usr/local/lib64/ -p /usr/local/lib/ -p /usr/bin/ -p /lib64/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p #{sandbox_dir}/#{source_name} -s set_robust_list -s openat -s recvmsg -s connect -s socket -s sendto -s futex -E PYTHONNOUSERSITE=yes"
96 PHP_OPTION = "-p /usr/lib64/ -p/lib64/ -p /usr/bin/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p /usr/share/ -s setfsuid -s setfsgid -s openat -s set_robust_list -s futex -s clone -s socket -s connect"
96 PHP_OPTION = "-p /usr/lib64/ -p/lib64/ -p /usr/bin/ -p #{sandbox_dir}/#{program_name} -p ./#{program_name} -p /usr/share/ -s setfsuid -s setfsgid -s openat -s set_robust_list -s futex -s clone -s socket -s connect"
97
97
98 case language
98 case language
99 when "java"
99 when "java"
100 # for java, extract the classname
100 # for java, extract the classname
101 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
101 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
102 classname = 'DUMMY'
102 classname = 'DUMMY'
103 File.open(program_name,"r").each do |line|
103 File.open(program_name,"r").each do |line|
104 classname = line
104 classname = line
105 end
105 end
106 #for java, we cannot really check the memory limit...
106 #for java, we cannot really check the memory limit...
107 - run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java #{classname} 2>run_result"
107 + run_command = "#{problem_home}/script/box -a 3 -f -T -t #{time_limit} #{JAVA_OPTION} -i #{input_file_name} -o output.txt /usr/bin/java #{classname} "
108 when "ruby"
108 when "ruby"
109 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} 2>run_result"
109 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{RUBY_OPTION} -i #{input_file_name} -o output.txt /usr/bin/ruby #{program_name} "
110 when "python"
110 when "python"
111 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} 2>run_result"
111 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} -m #{mem_limit} #{PYTHON_OPTION} -i #{input_file_name} -o output.txt /usr/bin/python #{program_name} "
112 when "php"
112 when "php"
113 - run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} #{PHP_OPTION} -i #{input_file_name} -o output.txt /usr/bin/php #{program_name} 2>run_result"
113 + run_command = "#{problem_home}/script/box -a 2 -f -T -t #{time_limit*=2} #{PHP_OPTION} -i #{input_file_name} -o output.txt /usr/bin/php #{program_name} "
114 else # for c++, pascal, we do the normal checking
114 else # for c++, pascal, we do the normal checking
115 - 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"
115 + 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} "
116 end
116 end
117
117
118
118
119 log "Running test #{test_num}..."
119 log "Running test #{test_num}..."
120 log run_command
120 log run_command
121 log
121 log
122 - system(run_command)
122 + system(run_command,err: 'run_result')
123
123
124 # Restore PROBLEM_HOME
124 # Restore PROBLEM_HOME
125 ENV['PROBLEM_HOME'] = problem_home
125 ENV['PROBLEM_HOME'] = problem_home
126
126
127 # Create the result file.
127 # Create the result file.
128 result_file = File.new("result", "w")
128 result_file = File.new("result", "w")
129 comment_file = File.new("comment", "w")
129 comment_file = File.new("comment", "w")
130
130
131 # Check if the program actually produced any output.
131 # Check if the program actually produced any output.
132 run_result_file = File.new("run_result", "r")
132 run_result_file = File.new("run_result", "r")
133 run_result = run_result_file.readlines
133 run_result = run_result_file.readlines
134 run_result_file.close
134 run_result_file.close
135
135
136 run_stat = run_result[run_result.length-1]
136 run_stat = run_result[run_result.length-1]
137 running_time = extract_time(run_stat)
137 running_time = extract_time(run_stat)
138
138
139 report = lambda{ |status, points, comment|
139 report = lambda{ |status, points, comment|
140 result_file.write status.strip
140 result_file.write status.strip
141 result_file.write "\n"
141 result_file.write "\n"
142 result_file.write points.to_s.strip
142 result_file.write points.to_s.strip
143 result_file.write "\n"
143 result_file.write "\n"
144 result_file.write run_stat.strip
144 result_file.write run_stat.strip
145 result_file.write "\n"
145 result_file.write "\n"
146 result_file.close
146 result_file.close
147 FileUtils.rm "run_result"
147 FileUtils.rm "run_result"
148 # `rm output.txt` --- keep the output
148 # `rm output.txt` --- keep the output
149
149
150 comment_file.write comment
150 comment_file.write comment
151
151
152 # added for debuggin --- jittat
152 # added for debuggin --- jittat
153 comment_file.write "--run-result--\n"
153 comment_file.write "--run-result--\n"
154 run_result.each do |l|
154 run_result.each do |l|
155 comment_file.write l
155 comment_file.write l
156 end
156 end
157
157
158 comment_file.close
158 comment_file.close
159
159
160 log "Done!"
160 log "Done!"
161 exit(0)
161 exit(0)
162 }
162 }
163
163
164
164
165 if run_result[0][0,2] != "OK"
165 if run_result[0][0,2] != "OK"
166 log "There was a runtime error."
166 log "There was a runtime error."
167 report.call(run_result[0], 0, "No comment.\n")
167 report.call(run_result[0], 0, "No comment.\n")
168 end
168 end
169
169
170 if running_time[:user].to_f > time_limit
170 if running_time[:user].to_f > time_limit
171 log "Time limit exceeded."
171 log "Time limit exceeded."
172 report.call("Time limit exceeded", 0, "No comment.\n")
172 report.call("Time limit exceeded", 0, "No comment.\n")
173 end
173 end
174
174
175 # Run 'check' to evaluate the output.
175 # Run 'check' to evaluate the output.
176 #puts "There was no runtime error. Proceed to checking the output."
176 #puts "There was no runtime error. Proceed to checking the output."
177 check_command = "#{problem_home}/script/check #{language} #{test_num}"
177 check_command = "#{problem_home}/script/check #{language} #{test_num}"
178 log "Checking the output..."
178 log "Checking the output..."
179 log check_command
179 log check_command
180 if not system(check_command)
180 if not system(check_command)
181 log "Problem with check script"
181 log "Problem with check script"
182 report.call("Incorrect",0,"Check script error.\n")
182 report.call("Incorrect",0,"Check script error.\n")
183 exit(127)
183 exit(127)
184 end
184 end
185
185
186 check_file = File.new("check_result", "r")
186 check_file = File.new("check_result", "r")
187 check_file_lines = check_file.readlines
187 check_file_lines = check_file.readlines
188
188
189 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
189 report.call(check_file_lines[0], check_file_lines[1], "No comment.\n")
You need to be logged in to leave comments. Login now