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

r168:c9a21e293d3e - - 2 files changed: 10 inserted, 3 deleted

@@ -65,101 +65,108
65 65 else
66 66 params[param_name] = default
67 67 end
68 68 talk "#{param_name}: #{params[param_name]}"
69 69 end
70 70
71 71 # Remove any remaining output files or message files.
72 72 if FileTest.exists? params[:output_file]
73 73 FileUtils.rm(params[:output_file])
74 74 end
75 75 if FileTest.exists? params[:message_file]
76 76 FileUtils.rm(params[:message_file])
77 77 end
78 78
79 79 # Check if the source file exists before attempt compiling.
80 80 if !FileTest.exists? params[:source_file]
81 81 talk("ERROR: The source file does not exist!")
82 82 open(params[:message_file],"w") do |f|
83 83 f.puts "ERROR: The source file did not exist."
84 84 end
85 85 exit(127)
86 86 end
87 87
88 88 if params[:prog_lang]=='cpp'
89 89 params[:prog_lang] = 'c++'
90 90 end
91 91
92 92 # Compile.
93 93 case params[:prog_lang]
94 94
95 95 when "c"
96 96 command = "#{C_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{C_OPTIONS} 2> #{params[:message_file]}"
97 97 system(command)
98 98
99 99 when "c++"
100 100 command = "#{CPLUSPLUS_COMPILER} #{params[:source_file]} -o #{params[:output_file]} #{CPLUSPLUS_OPTIONS} 2> #{params[:message_file]}"
101 101 system(command)
102 102
103 103 when "pas"
104 104 command = "#{PASCAL_COMPILER} #{params[:source_file]} -ooutpas #{PASCAL_OPTIONS} > #{params[:message_file]}"
105 105 system(command)
106 106 FileUtils.mv("output", params[:output_file])
107 107
108 108 when "java"
109 109 #rename the file to the public class name
110 110
111 111 #get the class name
112 112 classname = 'DUMMY'
113 + source = Array.new
113 114 File.foreach(params[:source_file]) do |line|
114 115 md = /\s*public\s*class\s*(\w*)/.match(line)
115 116 classname=md[1] if md
117 + source << line unless line =~ /\s*package\s*\w+\s*\;/
116 118 end
117 - system("cp #{params[:source_file]} #{classname}.java")
119 + File.open("#{classname}.java","w") do |file|
120 + source.each do |s|
121 + file.puts s
122 + end
123 + end
124 + #system("cp #{params[:source_file]} #{classname}.java")
118 125 command = "#{JAVA_COMPILER} #{classname}.java 2> #{params[:message_file]}"
119 126 system(command)
120 127 if File.exists?(classname + ".class")
121 128 File.open(params[:output_file],"w") {|file| file.write("#{classname}")}
122 129 end
123 130 if classname == 'DUMMY'
124 131 File.open(params[:message_file],"w") {|file| file.write("Cannot find any public class in the source code\n")}
125 132 end
126 133
127 134 when "ruby"
128 135 command = "#{RUBY_INTERPRETER} -c #{params[:source_file]} 2> #{params[:message_file]}"
129 136 if system(command)
130 137 File.open(params[:output_file],"w") do |out_file|
131 138 out_file.puts "#!#{RUBY_INTERPRETER}"
132 139 File.open(params[:source_file],"r").each do |line|
133 140 out_file.print line
134 141 end
135 142 end
136 143 File.chmod(0755, params[:output_file])
137 144 end
138 145
139 146 when "python"
140 147 command = "#{PYTHON_CHECKER} #{params[:source_file]} > #{params[:message_file]}"
141 148 if system(command)
142 149 #compile to python bytecode
143 150 command = "#{PYTHON_INTERPRETER} -m py_compile #{params[:source_file]}"
144 151 puts "compile: #{command}"
145 152 system(command)
146 153 puts "pwd: " + Dir.pwd
147 154 Dir.new('.').each {|file| puts file}
148 155 File.open(params[:output_file],"w") do |out_file|
149 156 out_file.puts "#!#{PYTHON_INTERPRETER} #{params[:source_file]}c"
150 157 end
151 158 File.chmod(0755, params[:output_file])
152 159 FileUtils.cp("#{params[:source_file]}c",params[:output_file])
153 160 end
154 161
155 162 when "php"
156 163 command = "#{PHP_INTERPRETER} #{PHP_OPTIONS} #{params[:source_file]} 2> #{params[:message_file]}"
157 164 if system(command)
158 165 File.open(params[:output_file],"w") do |out_file|
159 166 out_file.puts "#!#{PHP_INTERPRETER}"
160 167 File.open(params[:source_file],"r").each do |line|
161 168 out_file.print line
162 169 end
163 170 end
164 171 File.chmod(0755, params[:output_file])
165 172 end
@@ -46,98 +46,98
46 46 source_name = ENV['SOURCE_NAME']
47 47 require "#{problem_home}/script/test_dsl.rb"
48 48 load "#{problem_home}/test_cases/all_tests.cfg"
49 49 problem = Problem.get_instance
50 50
51 51 sandbox_dir = Dir.getwd
52 52
53 53 if problem.well_formed? == false
54 54 log "The problem specification is not well formed."
55 55 exit(127)
56 56 end
57 57
58 58 # Check if the test number is okay.
59 59 if test_num <= 0 || test_num > problem.num_tests
60 60 log "You have specified a wrong test number."
61 61 exit(127)
62 62 end
63 63
64 64 #####################################
65 65 # Set the relavant file names here. #
66 66 #####################################
67 67
68 68 input_file_name = "#{problem_home}/test_cases/#{test_num}/input-#{test_num}.txt"
69 69
70 70 #####################################
71 71
72 72 time_limit = problem.get_time_limit test_num
73 73 mem_limit = problem.get_mem_limit(test_num) * 1024
74 74
75 75 # Copy the input file.
76 76 #`cp #{problem_home}/test_cases/#{test_num}/#{input_file_name} .`
77 77
78 78 # check if box is there, if not, compile it!
79 79 if !File.exists?("#{problem_home}/script/box")
80 80 log "WARNING: Compiling box: to increase efficiency, it should be compile manually"
81 81 compile_box("#{problem_home}/script/box.cc",
82 82 "#{problem_home}/script/box")
83 83 end
84 84
85 85 # Hide PROBLEM_HOME
86 86 ENV['PROBLEM_HOME'] = nil
87 87 ENV['SOURCE_NAME'] = nil
88 88
89 89 # Run the program.
90 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 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 /lib64/ -p /dev/urandom -p #{sandbox_dir}/#{program_name} -s set_robust_list -s sched_getaffinity -s clock_gettime -s sigaltstack -s pipe2 -s clone -s futex -s openat"
95 - PYTHON_OPTION = "-p /usr/lib64/ -p /lib64/ -p /usr/bin/ -p /usr/local/lib64/ -p /usr/local/lib/ -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 -E PYTHONNOUSERSITE=yes"
94 + RUBY_OPTION = "-p /usr/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 /lib64/ -p /usr/bin/ -p /usr/local/lib64/ -p /usr/local/lib/ -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 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 "
97 97
98 98 case language
99 99 when "java"
100 100 # for java, extract the classname
101 101 # wne have to add additional systemcall and we don't check the mem limit (dunno how to fix...)
102 102 classname = 'DUMMY'
103 103 File.open(program_name,"r").each do |line|
104 104 classname = line
105 105 end
106 106 #for java, we cannot really check the memory limit...
107 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"
108 108 when "ruby"
109 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"
110 110 when "python"
111 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"
112 112 when "php"
113 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"
114 114 else # for c++, pascal, we do the normal checking
115 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"
116 116 end
117 117
118 118
119 119 log "Running test #{test_num}..."
120 120 log run_command
121 121 log
122 122 system(run_command)
123 123
124 124 # Restore PROBLEM_HOME
125 125 ENV['PROBLEM_HOME'] = problem_home
126 126
127 127 # Create the result file.
128 128 result_file = File.new("result", "w")
129 129 comment_file = File.new("comment", "w")
130 130
131 131 # Check if the program actually produced any output.
132 132 run_result_file = File.new("run_result", "r")
133 133 run_result = run_result_file.readlines
134 134 run_result_file.close
135 135
136 136 run_stat = run_result[run_result.length-1]
137 137 running_time = extract_time(run_stat)
138 138
139 139 report = lambda{ |status, points, comment|
140 140 result_file.write status.strip
141 141 result_file.write "\n"
142 142 result_file.write points.to_s.strip
143 143 result_file.write "\n"
You need to be logged in to leave comments. Login now