feat: add C++14 and C++17 support

This commit is contained in:
Baoshuo Ren 2022-09-18 10:54:13 +08:00
parent c48966420b
commit af58465477
Signed by: baoshuo
GPG Key ID: 00CB9680AB29F51A
5 changed files with 36 additions and 4 deletions

View File

@ -987,6 +987,14 @@ RunCompilerResult compile_cpp11(const string &name, const string &path = work_pa
return run_compiler(path.c_str(), return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++11", NULL); "/usr/bin/g++", "-o", name.c_str(), "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++11", NULL);
} }
RunCompilerResult compile_cpp17(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++17", NULL);
}
RunCompilerResult compile_cpp98(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++98", NULL);
}
RunCompilerResult compile_python2(const string &name, const string &path = work_path) { RunCompilerResult compile_python2(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(), return run_compiler(path.c_str(),
"/usr/bin/python2.7", "-E", "-s", "-B", "-O", "-c", "/usr/bin/python2.7", "-E", "-s", "-B", "-O", "-c",
@ -1000,7 +1008,7 @@ RunCompilerResult compile_python3(const string &name, const string &path = work_
RunCompilerResult compile(const char *name) { RunCompilerResult compile(const char *name) {
string lang = conf_str(string(name) + "_language"); string lang = conf_str(string(name) + "_language");
if ((lang == "C++" || lang == "C++11" || lang == "C") && has_illegal_keywords_in_file(work_path + "/" + name + ".code")) if ((lang == "C++" || lang == "C++11" || lang == "C++17" || lang == "C++98" || lang == "C") && has_illegal_keywords_in_file(work_path + "/" + name + ".code"))
{ {
RunCompilerResult res; RunCompilerResult res;
res.type = RS_DGS; res.type = RS_DGS;
@ -1017,6 +1025,12 @@ RunCompilerResult compile(const char *name) {
if (lang == "C++11") { if (lang == "C++11") {
return compile_cpp11(name); return compile_cpp11(name);
} }
if (lang == "C++17") {
return compile_cpp17(name);
}
if (lang == "C++98") {
return compile_cpp98(name);
}
if (lang == "Python2") { if (lang == "Python2") {
return compile_python2(name); return compile_python2(name);
} }
@ -1046,12 +1060,20 @@ RunCompilerResult compile_pas_with_implementer(const string &name, const string
} }
RunCompilerResult compile_cpp_with_implementer(const string &name, const string &path = work_path) { RunCompilerResult compile_cpp_with_implementer(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(), return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", NULL); "/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++14", NULL);
}
RunCompilerResult compile_cpp98_with_implementer(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++98", NULL);
} }
RunCompilerResult compile_cpp11_with_implementer(const string &name, const string &path = work_path) { RunCompilerResult compile_cpp11_with_implementer(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(), return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++11", NULL); "/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++11", NULL);
} }
RunCompilerResult compile_cpp17_with_implementer(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(),
"/usr/bin/g++", "-o", name.c_str(), "implementer.cpp", "-x", "c++", (name + ".code").c_str(), "-lm", "-O2", "-DONLINE_JUDGE", "-std=c++17", NULL);
}
/* /*
RunCompilerResult compile_python2(const string &name, const string &path = work_path) { RunCompilerResult compile_python2(const string &name, const string &path = work_path) {
return run_compiler(path.c_str(), return run_compiler(path.c_str(),
@ -1083,6 +1105,12 @@ RunCompilerResult compile_with_implementer(const char *name) {
if (lang == "C++11") { if (lang == "C++11") {
return compile_cpp11_with_implementer(name); return compile_cpp11_with_implementer(name);
} }
if (lang == "C++17") {
return compile_cpp17_with_implementer(name);
}
if (lang == "C++98") {
return compile_cpp98_with_implementer(name);
}
if (lang == "C") { if (lang == "C") {
return compile_c_with_implementer(name); return compile_c_with_implementer(name);
} }

View File

@ -54,7 +54,7 @@
<div class="card-body"> <div class="card-body">
<p>默认的测评环境是 Ubuntu Linux 20.04 LTS x64。</p> <p>默认的测评环境是 Ubuntu Linux 20.04 LTS x64。</p>
<p>C的编译器是 gcc 9.4.0,编译命令:<code>gcc code.c -o code -lm -O2 -DONLINE_JUDGE</code></p> <p>C的编译器是 gcc 9.4.0,编译命令:<code>gcc code.c -o code -lm -O2 -DONLINE_JUDGE</code></p>
<p>C++的编译器是 g++ 9.4.0,编译命令:<code>g++ code.cpp -o code -lm -O2 -DONLINE_JUDGE</code>如果选择C++11会在编译命令后面添加<code>-std=c++11</code></p> <p>C++的编译器是 g++ 9.4.0,编译命令:<code>g++ code.cpp -o code -lm -O2 -DONLINE_JUDGE</code>默认为 C++14,如果选择特定语言版本会添加 <code>-std=</code> 参数</p>
<p>Pascal的编译器是 fpc 3.0.4,编译命令:<code>fpc code.pas -O2</code></p> <p>Pascal的编译器是 fpc 3.0.4,编译命令:<code>fpc code.pas -O2</code></p>
<p>Python会先编译为优化过的字节码<samp>.pyo</samp>文件。支持的Python版本分别为Python 2.7和3.8</p> <p>Python会先编译为优化过的字节码<samp>.pyo</samp>文件。支持的Python版本分别为Python 2.7和3.8</p>
</div> </div>

View File

@ -430,6 +430,8 @@ function echoSubmissionContent($submission, $requirement) {
switch ($file_language) { switch ($file_language) {
case 'C++': case 'C++':
case 'C++11': case 'C++11':
case 'C++17':
case 'C++98':
$sh_class = 'sh_cpp'; $sh_class = 'sh_cpp';
break; break;
case 'Python2': case 'Python2':

View File

@ -1,6 +1,6 @@
<?php <?php
global $uojSupportedLanguages, $uojMainJudgerWorkPath; global $uojSupportedLanguages, $uojMainJudgerWorkPath;
$uojSupportedLanguages = array('C', 'C++', 'C++11', 'Pascal', 'Python2', 'Python3'); $uojSupportedLanguages = array('C', 'C++', 'C++11', 'C++17', 'C++98', 'Pascal', 'Python2', 'Python3');
$uojMainJudgerWorkPath = "/opt/uoj/judger/uoj_judger"; $uojMainJudgerWorkPath = "/opt/uoj/judger/uoj_judger";
function authenticateJudger() { function authenticateJudger() {

View File

@ -561,6 +561,8 @@ function get_codemirror_mode(lang) {
switch (lang) { switch (lang) {
case 'C++': case 'C++':
case 'C++11': case 'C++11':
case 'C++17':
case 'C++98':
return 'text/x-c++src'; return 'text/x-c++src';
case 'C': case 'C':
return 'text/x-csrc'; return 'text/x-csrc';