4 #ifdef _MSC_VER // Visual Studio 
    7 #pragma comment(lib, "Ws2_32.lib") 
    8 #define pipe(fds) _pipe(fds, 1048575, _O_BINARY) 
   12 #define STDIN_FILENO 0 
   13 #define STDOUT_FILENO 1 
   14 #define STDERR_FILENO 2 
   22 bool JupyROOTExecutorImpl(
const char *code);
 
   23 bool JupyROOTDeclarerImpl(
const char *code);
 
   25 class JupyROOTExecutorHandler {
 
   27    bool fCapturing = 
false;
 
   28    std::string fStdoutpipe;
 
   29    std::string fStderrpipe;
 
   30    int fStdout_pipe[2] = {0,0};
 
   31    int fStderr_pipe[2] = {0,0};
 
   32    int fSaved_stderr = 0;
 
   33    int fSaved_stdout = 0;
 
   35    JupyROOTExecutorHandler();
 
   40    std::string &GetStdout();
 
   41    std::string &GetStderr();
 
   45 #ifndef F_LINUX_SPECIFIC_BASE 
   46 #define F_LINUX_SPECIFIC_BASE       1024 
   49 #define F_SETPIPE_SZ    (F_LINUX_SPECIFIC_BASE + 7) 
   52 constexpr 
long MAX_PIPE_SIZE = 1048575;
 
   54 JupyROOTExecutorHandler::JupyROOTExecutorHandler() {}
 
   57 static void PollImpl(FILE *stdStream, 
int *pipeHandle, std::string &pipeContent)
 
   63       buf_read = read(pipeHandle[0], &ch, 1);
 
   70 void JupyROOTExecutorHandler::Poll()
 
   72    PollImpl(stdout, fStdout_pipe, fStdoutpipe);
 
   73    PollImpl(stderr, fStderr_pipe, fStderrpipe);
 
   76 static void InitCaptureImpl(
int &savedStdStream, 
int *pipeHandle, 
int FILENO)
 
   78    savedStdStream = dup(FILENO);
 
   79    if (pipe(pipeHandle) != 0) {
 
   82 #ifdef _MSC_VER // Visual Studio 
   83    unsigned long mode = 1;
 
   84    ioctlsocket(pipeHandle[0], FIONBIO, &mode);
 
   86    long flags_stdout = fcntl(pipeHandle[0], F_GETFL);
 
   87    if (flags_stdout == -1) 
return;
 
   88    flags_stdout |= O_NONBLOCK;
 
   89    fcntl(pipeHandle[0], F_SETFL, flags_stdout);
 
   90    fcntl(pipeHandle[0], F_SETPIPE_SZ, MAX_PIPE_SIZE);
 
   92    dup2(pipeHandle[1], FILENO);
 
   96 void JupyROOTExecutorHandler::InitCapture()
 
   99       InitCaptureImpl(fSaved_stdout, fStdout_pipe, STDOUT_FILENO);
 
  100       InitCaptureImpl(fSaved_stderr, fStderr_pipe, STDERR_FILENO);
 
  105 void JupyROOTExecutorHandler::EndCapture()
 
  109       dup2(fSaved_stdout, STDOUT_FILENO);
 
  110       dup2(fSaved_stderr, STDERR_FILENO);
 
  115 void JupyROOTExecutorHandler::Clear()
 
  121 std::string &JupyROOTExecutorHandler::GetStdout()
 
  126 std::string &JupyROOTExecutorHandler::GetStderr()
 
  131 JupyROOTExecutorHandler *JupyROOTExecutorHandler_ptr = 
nullptr;
 
  134 bool JupyROOTExecutorImpl(
const char *code)
 
  138       auto err = TInterpreter::kNoError;
 
  139       if (gInterpreter->ProcessLine(code, &err)) {
 
  143       if (err == TInterpreter::kProcessing) {
 
  144          gInterpreter->ProcessLine(
".@");
 
  145          gInterpreter->ProcessLine(
"cerr << \"Unbalanced braces. This cell was not processed.\" << endl;");
 
  154 bool JupyROOTDeclarerImpl(
const char *code)
 
  158       if (gInterpreter->Declare(code)) {
 
  169    int JupyROOTExecutor(
const char *code)
 
  171       return JupyROOTExecutorImpl(code);
 
  173    int JupyROOTDeclarer(
const char *code)
 
  175       return JupyROOTDeclarerImpl(code);
 
  178    void JupyROOTExecutorHandler_Clear()
 
  180       JupyROOTExecutorHandler_ptr->Clear();
 
  183    void JupyROOTExecutorHandler_Ctor()
 
  185       if (!JupyROOTExecutorHandler_ptr) {
 
  186          JupyROOTExecutorHandler_ptr = 
new JupyROOTExecutorHandler();
 
  188          gInterpreter->ProcessLine(
"SetErrorHandler((ErrorHandlerFunc_t)&DefaultErrorHandler);");
 
  192    void JupyROOTExecutorHandler_Poll()
 
  194       JupyROOTExecutorHandler_ptr->Poll();
 
  197    void JupyROOTExecutorHandler_EndCapture()
 
  199       JupyROOTExecutorHandler_ptr->EndCapture();
 
  202    void JupyROOTExecutorHandler_InitCapture()
 
  204       JupyROOTExecutorHandler_ptr->InitCapture();
 
  207    const char *JupyROOTExecutorHandler_GetStdout()
 
  209       return JupyROOTExecutorHandler_ptr->GetStdout().c_str();
 
  212    const char *JupyROOTExecutorHandler_GetStderr()
 
  214       return JupyROOTExecutorHandler_ptr->GetStderr().c_str();
 
  217    void JupyROOTExecutorHandler_Dtor()
 
  219       if (!JupyROOTExecutorHandler_ptr) 
return;
 
  220       delete JupyROOTExecutorHandler_ptr;
 
  221       JupyROOTExecutorHandler_ptr = 
nullptr;