#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>
#include <windows.h>
#include <process.h>
#include <Psapi.h>
#include "global.h"
#include "subfunction.h"
#include "TimeUnit.h"
#include "FileUnit.h"
#include "UserUnit.h"
#include "CaseUnit.h"
#pragma comment(lib,"Psapi.Lib")
using namespace std;
TimeUint timer;
UserUnit user;
FileUnit file;
CaseUnit testcase;
int main(int argc, char** argv) {
/*Set Environment*/
system("cls");
SetConsoleTitle(Settings::Title);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_LIGHTGREEN);
puts(Settings::Title);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
// 读取测试选项
if (argc < 2) {
puts(Error::TooFewParamMsg);
return Error::TooFewParam;
}
else {
GetOption(argc,argv);
}
// 初始化句柄安全属性,获取启动状态,设置环境变量
saIn.nLength = sizeof(SECURITY_ATTRIBUTES);
saIn.lpSecurityDescriptor = NULL;
saIn.bInheritHandle = TRUE; // 句柄可被子进程继承
saOut.nLength = sizeof(SECURITY_ATTRIBUTES);
saOut.lpSecurityDescriptor = NULL;
saOut.bInheritHandle = TRUE;
GetStartupInfo(&StartInfo);
StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.dwFlags = STARTF_USESTDHANDLES;
SetEnvVar();
/*End of Set Environment*/
/*Get Information*/
// 读取题目信息
flag = file.FileOpenR(chCodeName);
if (flag != Error::NoError) ExitJudge(flag);
file.FileRead();
file.FileClose();
if (flag != Error::NoError) ExitJudge(flag);
flag = user.GetInfo(file);
if (flag != Error::NoError) ExitJudge(flag);
sprintf(chCasePath,"%s\\%s\\",chCurDir,user.pid);
/*End of Get Information*/
/*Compiling*/
// 调用进程编译文件,保存并输出编译错误
puts("[Compiling]");
if (Settings::ComplierChoose == 'c') {
sprintf(buf,"%s \"%s\" %s",Settings::CppPath,file.fileName,Settings::CppParam);
}
else {
sprintf(buf,"%s \"%s\" %s",Settings::GppPath,file.fileName,Settings::GppParam);
}
hTempFile = CreateFile("complier_return.txt",
GENERIC_WRITE,
0,
&saOut,
CREATE_ALWAYS,
0,
NULL);
if (hTempFile == INVALID_HANDLE_VALUE) {
PrintErrMsg(GetLastError());
ExitJudge(Error::SystemError);
}
StartInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
StartInfo.hStdOutput = hTempFile;
StartInfo.hStdError = hTempFile;
flag = CreateProcess(NULL,
buf,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&StartInfo,
&ProcessInfo);
if (flag == FALSE) {
PrintErrMsg(GetLastError());
ExitJudge(Error::SystemError);
}
flag = WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(hTempFile);
if (flag != WAIT_OBJECT_0 || ! GetExitCodeProcess(ProcessInfo.hProcess,&dwExitCode)) {
PrintErrMsg(GetLastError());
ExitJudge(Error::SystemError);
}
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
if (dwExitCode != Error::NoError) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
system("type complier_return.txt");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | BACKGROUND_BLUE);
puts(Result::CEMsg);
ExitJudge(Result::CE);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
/*End of Compiling*/
/*Find TestCase File*/
// 查找测试标准输入和输出文件
WIN32_FIND_DATA findData;
sprintf(buf,"%s*%s",chCasePath,Settings::DefaultInExt);
hFind = FindFirstFile(buf,&findData);
if (hFind == INVALID_HANDLE_VALUE) {
puts(Error::NoInputFileMsg);
ExitJudge(Error::SystemError);
}
testcase.ClearCase();
do {
int len = strlen(findData.cFileName);
findData.cFileName[len-3] = 0;
testcase.InsertCase(findData.cFileName);
} while( FindNextFile(hFind,&findData) );
char * pbuf;
while ( (pbuf = testcase.GetNextCase()) != NULL ) {
sprintf(buf,"%s%s%s",chCasePath,pbuf,Settings::DefaultStdExt);
hFind = FindFirstFile(buf,&findData);
if (hFind == INVALID_HANDLE_VALUE) {
puts(Error::NoStandardFileMsg);
ExitJudge(Error::SystemError);
}
}
/*End of Find TestCase File*/
/*Run*/
puts("[Run]");
testcase.RebackCase();
while ( (pbuf = testcase.GetNextCase()) != NULL ) {
// 创建文件句柄,读入和输出数据
printf("Case No.%d %s:\n",testcase.iNowCase,pbuf);
sprintf(buf2,"%s%s%s",chCasePath,pbuf,Settings::DefaultInExt);
hInFile = CreateFile(buf2,
GENERIC_READ,
FILE_SHARE_READ,
&saIn,
OPEN_EXISTING,
0,
NULL);
if (hInFile == INVALID_HANDLE_VALUE) {
PrintErrMsg(GetLastError());
ExitJudge(Error::SystemError);
}
sprintf(buf,".\\userout.txt");
hTempFile = CreateFile(buf,
GENERIC_WRITE,
0,
&saOut,
CREATE_ALWAYS,
0,
NULL);
if (hTempFile == INVALID_HANDLE_VALUE) {
PrintErrMsg(GetLastError());
ExitJudge(Error::SystemError);
}
StartInfo.hStdInput = hInFile;
StartInfo.hStdOutput = hTempFile;
StartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
flag = RunTestCase(); // TLE,MLE,OLE,RTE
CloseHandle(hInFile);
CloseHandle(hTempFile);
if ( IsError(flag) ) {
ExitJudge(flag);
}
if (flag == Result::NoResult) { // AC,WA,PE
sprintf(buf2,"%s%s%s",chCasePath,pbuf,Settings::DefaultStdExt);
if (JudgeUserOut() == Result::AC) testcase.iAC ++;
}
// 输出运行状态
PrintStatus();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
}
if ( testcase.iAC == testcase.iCaseTotal ) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
puts("All Test Cases Are Past. ^_^");
}
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
printf("Passed %d Cases, %d in Total.\n",testcase.iAC,testcase.iCaseTotal);
puts("Sorry, Your Program Have Something Wrong.");
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
/*End of Run*/
ExitJudge(Error::NoError);
}
没有合适的资源?快使用搜索试试~ 我知道了~
OfflineJudge
共8个文件
h:6个
cpp:1个
rar:1个
需积分: 10 91 下载量 69 浏览量
2007-11-21
15:33:42
上传
评论
收藏 32KB RAR 举报
温馨提示
Offline Judge1.00 Beta<br>简单的离线ACM/ICPC测试内核<br>使用WindowsAPI和C++开发<br>支持多文件Case的测试,获取测试时间,内存和输出文件大小<br>Powered by Wiskey<br>mail:huangwei@stu.hdu.edu.cn
资源推荐
资源详情
资源评论
收起资源包目录
OfflineJudge.rar (8个子文件)
OfflineJudge
CaseUnit.h 884B
fileunit.h 3KB
userunit.h 534B
TimeUnit.h 2KB
global.h 4KB
subfunction.h 7KB
OfflineJudgeKernel.rar 25KB
judge.cpp 6KB
共 8 条
- 1
资源评论
huangwei1024
- 粉丝: 53
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功