Enhance C code execution by adding a wrapper to disable stdout buffering
This commit is contained in:
@@ -316,6 +316,62 @@ func (e *CodeExecutor) executeC(submission *models.CodeSubmission, tempDir strin
|
||||
return
|
||||
}
|
||||
|
||||
// Create a wrapper script that will include setbuf to disable buffering
|
||||
wrapperCode := `#include <stdio.h>
|
||||
|
||||
// Forward declaration of user's main function
|
||||
int user_main();
|
||||
|
||||
int main() {
|
||||
// Disable buffering completely for stdout
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
// Call the user's code
|
||||
return user_main();
|
||||
}
|
||||
|
||||
// User's code begins here
|
||||
`
|
||||
|
||||
// Modify the user's code to be a function called from our wrapper
|
||||
modifiedCode := submission.Code
|
||||
// Replace main function with our wrapper
|
||||
mainRegex := regexp.MustCompile(`int\s+main\s*\([^)]*\)\s*{`)
|
||||
if mainRegex.MatchString(modifiedCode) {
|
||||
// Rename user's main to user_main
|
||||
modifiedCode = mainRegex.ReplaceAllString(modifiedCode, "int user_main() {")
|
||||
|
||||
// Combine wrapper with modified user code
|
||||
finalCode := wrapperCode + modifiedCode
|
||||
|
||||
// Write the final code with wrapper to file
|
||||
if err := os.WriteFile(codeFile, []byte(finalCode), 0644); err != nil {
|
||||
submission.Status = "failed"
|
||||
submission.Output = "Failed to write code file: " + err.Error()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// If no main function found, create a minimal program that includes the user code
|
||||
finalCode := `#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
// Disable buffering completely for stdout
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
// Execute the user's code
|
||||
` + submission.Code + `
|
||||
|
||||
return 0;
|
||||
}
|
||||
`
|
||||
// Write the final code to file
|
||||
if err := os.WriteFile(codeFile, []byte(finalCode), 0644); err != nil {
|
||||
submission.Status = "failed"
|
||||
submission.Output = "Failed to write code file: " + err.Error()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Compile C code
|
||||
compileCmd := exec.Command(
|
||||
"docker", "run", "--rm",
|
||||
|
||||
Reference in New Issue
Block a user