From d3049c59518dc02d078e45d0addd4a2185532f0a Mon Sep 17 00:00:00 2001 From: Shashank Kumar Date: Tue, 15 Nov 2011 02:35:52 +0530 Subject: [PATCH] CodeRunner now supports command line options --- .gitignore | 2 +- ContentParser.cpp | 7 ++----- ContentParser.h | 4 +--- CurlWrapper.cpp | 14 ++++++++----- CurlWrapper.h | 26 ++++++++++++++---------- FileHandle.cpp | 8 +++++--- FileHandle.h | 13 ++++++++---- FileInfo.h | 4 ++-- Logs.h | 2 +- Makefile | 19 ++++++++++------- Execution.cpp => cpp_execution.cpp | 7 ++++--- includeh.h | 6 ++++++ includes.h | 6 ------ Java_Execution.cpp => java_execution.cpp | 4 ++-- main.cpp | 18 ++++++++-------- 15 files changed, 79 insertions(+), 61 deletions(-) rename Execution.cpp => cpp_execution.cpp (98%) create mode 100644 includeh.h rename Java_Execution.cpp => java_execution.cpp (98%) diff --git a/.gitignore b/.gitignore index 6751894..8abef48 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ Logs/* main config.h TestCases2/* -Execution +*_execution diff --git a/ContentParser.cpp b/ContentParser.cpp index b41c37c..c5cc4fd 100755 --- a/ContentParser.cpp +++ b/ContentParser.cpp @@ -1,4 +1,4 @@ -#include "includes.h" +#include "includeh.h" #include "ContentParser.h" int ContentParser::FetchFileInfoList(FileInfoFetchOptionsStruct* FileInfoFetchOptions){ @@ -9,15 +9,12 @@ int ContentParser::FetchFileInfoList(FileInfoFetchOptionsStruct* FileInfoFetchOp delete CurlVar; //Clean up return -1; } + delete CurlVar; FileInfoListStr = new char[strContent.size() + 1]; FileInfo = new FileInfoStruct(); strcpy(FileInfoListStr, strContent.c_str()); - - Logs::WriteLine(FileInfoListStr); - Ix = 0; - delete CurlVar; return 0; } diff --git a/ContentParser.h b/ContentParser.h index 472e877..4755f23 100755 --- a/ContentParser.h +++ b/ContentParser.h @@ -1,8 +1,7 @@ #ifndef CONTENTPARSER_H #define CONTENTPARSER_H -#include "includes.h" +#include "includeh.h" #include "CurlWrapper.h" -#include "Logs.h" #include "FileInfo.h" class ContentParser{ @@ -10,7 +9,6 @@ class ContentParser{ char* FileInfoListStr; int Ix; FileInfoStruct* FileInfo; - FileInfoFetchOptionsStruct* FileInfoFetchOptions; public: int FetchFileInfoList(FileInfoFetchOptionsStruct* FileInfoFetchOptions); diff --git a/CurlWrapper.cpp b/CurlWrapper.cpp index 3c7ba08..53b3dc8 100755 --- a/CurlWrapper.cpp +++ b/CurlWrapper.cpp @@ -124,17 +124,17 @@ int CurlWrapper::FetchContentFromWebPage(FileInfoFetchOptionsStruct* FileInfoFet char optstr[11]; if(FileInfoFetchOptions->f){ - sprintf(optstr, "%s", FileInfoFetchOptionsS->FileInfo.FileId); + sprintf(optstr, "%d", FileInfoFetchOptions->FileInfo.FileId); curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "fileid", CURLFORM_COPYCONTENTS, optstr, CURLFORM_END); } if(FileInfoFetchOptions->p){ - sprintf(optstr, "%s", FileInfoFetchOptionsS->FileInfo.ProblemId); + sprintf(optstr, "%s", FileInfoFetchOptions->FileInfo.ProblemId); curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "problemid", CURLFORM_COPYCONTENTS, optstr, CURLFORM_END); } if(FileInfoFetchOptions->l){ - sprintf(optstr, "%s", FileInfoFetchOptionsS->FileInfo.lang); + sprintf(optstr, "%s", FileInfoFetchOptions->FileInfo.lang); curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "lang", CURLFORM_COPYCONTENTS, optstr, CURLFORM_END); } @@ -163,14 +163,13 @@ int CurlWrapper::FetchContentFromWebPage(FileInfoFetchOptionsStruct* FileInfoFet sprintf(logs, "Failure to fetch File Ids. Curl Error code: %d", res); Logs::WriteLine(logs, true); return -1; - } else{ sprintf(logs, "File Ids fetched succesfully."); Logs::WriteLine(logs, true); + Logs::WriteLine(buffer.c_str()); return 0; } - } return -1; // Control should not reach here in normal circumstances } @@ -193,6 +192,9 @@ void CurlWrapper::SendResultsToWebpage(const char* fileid, const char* status, c curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "detailstatus", CURLFORM_COPYCONTENTS, detailstatus, CURLFORM_END); curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "time", CURLFORM_COPYCONTENTS, time, CURLFORM_END); curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "memory", CURLFORM_COPYCONTENTS, memory, CURLFORM_END); + if(ForcePushResult) + curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "force", CURLFORM_COPYCONTENTS, "true", CURLFORM_END); + curl = curl_easy_init(); /* initalize custom header list (stating that Expect: 100-continue is not wanted */ headerlist = curl_slist_append(headerlist, buf); @@ -223,3 +225,5 @@ void CurlWrapper::SendResultsToWebpage(const char* fileid, const char* status, c } } + +bool CurlWrapper::ForcePushResult=true; diff --git a/CurlWrapper.h b/CurlWrapper.h index 4809b98..02211b1 100755 --- a/CurlWrapper.h +++ b/CurlWrapper.h @@ -1,14 +1,24 @@ #ifndef CURLWRAPPER #define CURLWRAPPER -#include "includes.h" -#include "Logs.h" +#include "includeh.h" +#include "FileInfo.h" + +#include +#include +#include +#include "config.h" class CurlWrapper{ -public: + CURL *curl; CURLcode res; char logs[1000]; - + struct FtpFile { + const char *filename; + FILE *stream; + }; + +public: CurlWrapper(){ curl_global_init(CURL_GLOBAL_DEFAULT); Logs::OpenLogFile(); @@ -18,20 +28,14 @@ class CurlWrapper{ curl_global_cleanup(); } - struct FtpFile { - const char *filename; - FILE *stream; - }; - static size_t ContentInFileFTP(void *buffer, size_t size, size_t nmemb, void *stream); static size_t ContentInVar(void* ptr, size_t size, size_t nmemb, string *stream); static size_t ContentInFileHTTP(void *ptr, size_t size, size_t nmemb, FILE *stream); - + static bool ForcePushResult; int GetFileFromFTP(int FileId); int GetFileFromHTTP(int FileId); int FetchContentFromWebPage(FileInfoFetchOptionsStruct* FileInfoFetchOptions, string *content); void SendResultsToWebpage(const char* fileid, const char* status, const char* detailstatus, const char* time, const char* memory); - }; #endif diff --git a/FileHandle.cpp b/FileHandle.cpp index 0e8dd1f..b31fbcd 100755 --- a/FileHandle.cpp +++ b/FileHandle.cpp @@ -158,10 +158,10 @@ int FileHandle::PrepareToExecute(){ void FileHandle::PipeExecute(){ FILE *fpipe; if(strcmp(FileInfo->lang,"cpp")==0 || strcmp(FileInfo->lang,"c")==0){ - sprintf(command, "./Execution %d %d %d %d %s", FileInfo->FileId, TestCaseId, FileInfo->TimeLimit, MemoryLimit, FileInfo->lang); + sprintf(command, "./cpp_execution %d %d %d %d %s", FileInfo->FileId, TestCaseId, FileInfo->TimeLimit, MemoryLimit, FileInfo->lang); } else if(strcmp(FileInfo->lang, "java")==0){ - sprintf(command, "./java_Execution %d %d %d %d %s", FileInfo->FileId, TestCaseId, FileInfo->TimeLimit, FileInfo->MemoryLimit, FileInfo->lang); + sprintf(command, "./java_execution %d %d %d %d %s", FileInfo->FileId, TestCaseId, FileInfo->TimeLimit, FileInfo->MemoryLimit, FileInfo->lang); } char line[1024]; @@ -300,5 +300,7 @@ void FileHandle::Action(){ } FileHandle::~FileHandle(){ - ;//CleanUp(); + if(Clean) CleanUp(); } + +bool FileHandle::Clean=true; diff --git a/FileHandle.h b/FileHandle.h index 95c408e..68a9f54 100755 --- a/FileHandle.h +++ b/FileHandle.h @@ -1,16 +1,20 @@ #ifndef FILEHANDLE_H #define FILEHANDLE_H -#include "includes.h" +#include "includeh.h" #include "CurlWrapper.h" -#include "Logs.h" #include "FileInfo.h" class FileHandle{ private: int FileId, MemoryUsed, NoOfTestCases, TestCaseId, TimeLimit, MemoryLimit; float TimeUsed; - char systemString[100], status[10], logs[10000], detailstatus[10000], str[100], *token, tmp[10], logString[100], TestCaseExecutionTime[10]; - char FileAddr[10], timeused[10], memoryused[10], fileid[10], command[1000]; + char systemString[100]; + char status[10], logs[10000], detailstatus[10000]; + char str[100], *token, tmp[10]; + char logString[100]; + char TestCaseExecutionTime[10]; + char FileAddr[10], timeused[10], memoryused[10], fileid[10]; + char command[1000]; const char* lang, *ProblemId; string CompileOutput; CurlWrapper FileCurl; @@ -33,6 +37,7 @@ class FileHandle{ void pipeMatch(); void SendResults(); void CleanUp(); + static bool Clean; bool getResult(); void FileOperations(); diff --git a/FileInfo.h b/FileInfo.h index 204f776..9b298e7 100644 --- a/FileInfo.h +++ b/FileInfo.h @@ -10,8 +10,8 @@ struct FileInfoStruct{ }; struct FileInfoFetchOptionsStruct{ - bool f=false, p=false, l=false, b=false; - FileInfoSturct FileInfo; + bool f, p, l, b; + FileInfoStruct FileInfo; void Init(){ f=p=l=b=false; } diff --git a/Logs.h b/Logs.h index 39df402..859cafa 100755 --- a/Logs.h +++ b/Logs.h @@ -1,6 +1,6 @@ #ifndef LOGS_H #define LOGS_H -#include "includes.h" +#include "includeh.h" class Logs{ private: diff --git a/Makefile b/Makefile index f3b45c9..d3417c0 100755 --- a/Makefile +++ b/Makefile @@ -1,21 +1,26 @@ -main : main.o FileHandle.o CurlWrapper.o Logs.o ContentParser.o includes.h config.h -lcurl +VAR=includeh.h includes.h config.h Logs.h +main : main.o FileHandle.o CurlWrapper.o Logs.o ContentParser.o *_execution -lcurl g++ -o main main.o FileHandle.o CurlWrapper.o ContentParser.o Logs.o -lcurl -main.o : main.cpp includes.h ContentParser.h FileHandle.h Logs.h config.h +main.o : main.cpp ContentParser.h FileHandle.h $(VAR) g++ -c main.cpp -FileHandle.o : FileHandle.cpp FileHandle.h CurlWrapper.h Logs.h includes.h config.h +FileHandle.o : FileHandle.cpp FileHandle.h CurlWrapper.h $(VAR) g++ -c FileHandle.cpp -CurlWrapper.o : CurlWrapper.cpp CurlWrapper.h Logs.h includes.h config.h +CurlWrapper.o : CurlWrapper.cpp CurlWrapper.h $(VAR) g++ -c CurlWrapper.cpp -ContentParser.o : ContentParser.cpp ContentParser.h CurlWrapper.h includes.h config.h Logs.h +ContentParser.o : ContentParser.cpp ContentParser.h CurlWrapper.h $(VAR) g++ -c ContentParser.cpp -Logs.o : Logs.cpp Logs.h includes.h config.h +Logs.o : Logs.cpp $(VAR) g++ -c Logs.cpp .PHONY: clean clean: - rm *.o main + rm *.o main *_execution + +*_execution : cpp_execution.cpp java_execution.cpp + g++ cpp_execution.cpp -o cpp_execution + g++ java_execution.cpp -o java_execution diff --git a/Execution.cpp b/cpp_execution.cpp similarity index 98% rename from Execution.cpp rename to cpp_execution.cpp index 5cb1254..a48b856 100755 --- a/Execution.cpp +++ b/cpp_execution.cpp @@ -1,4 +1,4 @@ -#include "includex.h" +#include "includes.h" #include "resources.h" pid_t cpid; @@ -6,11 +6,13 @@ void ToPipe(const char* str){ printf("%s\n", str); return; } + void signalHandler(int signum){ if(cpid!=0){ killpg(cpid,SIGKILL); } } + int main(int args, char *argv[]){ if(args<4){ @@ -112,7 +114,7 @@ int main(int args, char *argv[]){ else { /* Code executed by parent */ struct rusage resourceUsage; - w = wait4 (cpid, &status, NULL, &resourceUsage); + w = wait4 (cpid, &status, 0, &resourceUsage); gettimeofday(&finish,NULL); t_sec = finish.tv_sec-start.tv_sec; @@ -170,4 +172,3 @@ int main(int args, char *argv[]){ else if(sigalrm) printf("SIGALRM"); } } - diff --git a/includeh.h b/includeh.h new file mode 100644 index 0000000..5f92b3c --- /dev/null +++ b/includeh.h @@ -0,0 +1,6 @@ +#ifndef INCLUDEH_H +#define INCLUDEH_H +#include "includes.h" +#include "config.h" +#include "Logs.h" +#endif diff --git a/includes.h b/includes.h index bd763a7..983113f 100755 --- a/includes.h +++ b/includes.h @@ -20,10 +20,4 @@ #include #include -#include -#include -#include - -#include "config.h" - using namespace std; diff --git a/Java_Execution.cpp b/java_execution.cpp similarity index 98% rename from Java_Execution.cpp rename to java_execution.cpp index b48d7df..e61750a 100755 --- a/Java_Execution.cpp +++ b/java_execution.cpp @@ -1,4 +1,4 @@ -#include "includex.h" +#include "includes.h" #include "resources.h" pid_t cpid; @@ -113,7 +113,7 @@ int main(int args, char *argv[]){ else { /* Code executed by parent */ struct rusage resourceUsage; - w = wait4 (cpid, &status, NULL, &resourceUsage); + w = wait4 (cpid, &status, 0, &resourceUsage); gettimeofday(&finish,NULL); t_sec = finish.tv_sec-start.tv_sec; diff --git a/main.cpp b/main.cpp index fa174a5..f4908dc 100755 --- a/main.cpp +++ b/main.cpp @@ -18,11 +18,10 @@ You may contact the author of CodeRunner by e-mail at: shashankkumar.me@gmail.com ****************************************************************************/ -#include "includes.h" +#include "includeh.h" #include "FileInfo.h" #include "ContentParser.h" #include "FileHandle.h" -#include "Logs.h" int main(int argc, char* argv[]) { @@ -37,22 +36,25 @@ int main(int argc, char* argv[]) int opt; FileInfoFetchOptionsStruct* FileInfoFetchOptions = new FileInfoFetchOptionsStruct(); FileInfoFetchOptions->Init(); - while((opt = getopt(argc, argv, "bf:p:l:")) != -1){ + while((opt = getopt(argc, argv, "cbf:p:l:")) != -1){ switch(opt){ case 'f': FileInfoFetchOptions->f=true; FileInfoFetchOptions->FileInfo.FileId = atoi(optarg); break; case 'p': - FileInfoFetchOptions->p=true + FileInfoFetchOptions->p=true; strcpy(FileInfoFetchOptions->FileInfo.ProblemId, optarg); break; case 'l': - FileInfoFetchOptions->l=true + FileInfoFetchOptions->l=true; strcpy(FileInfoFetchOptions->FileInfo.lang, optarg); break; case 'b': - FileInfoFetchOptions->b=true + CurlWrapper::ForcePushResult=true; + break; + case 'c': + FileHandle::Clean=true; break; default: /* '?' */ fprintf(stderr, "Usage: %s [-f fileid | [-p problemcode] [-l language]] [-b]", argv[0]); @@ -71,8 +73,8 @@ int main(int argc, char* argv[]) do{ Logs::OpenLogFile(); bool CurrentIteration = true; - ContentParser *ContentVar = new ContentParser(FileInfoFetchOptions); - if(ContentVar->FetchFileInfoList()==-1){ + ContentParser *ContentVar = new ContentParser(); + if(ContentVar->FetchFileInfoList(FileInfoFetchOptions)==-1){ CurrentIteration = false; }