#include
#include
#include
#ifdef _WIN32
# include
# define fileno _fileno
# define dup _dup
# define dup2 _dup2
# define close _close
# include
#else
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace nl = nlohmann;
namespace LFortran
{
class RedirectStdout
{
public:
RedirectStdout(std::string &out) : _out{out} {
stdout_fileno = fileno(stdout);
std::cout 0) {
publish_stream("stdout", std_out);
}
switch (r.type) {
case (LFortran::FortranEvaluator::EvalResult::integer4) : {
nl::json pub_data;
pub_data["text/plain"] = std::to_string(r.i32);
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::integer8) : {
nl::json pub_data;
pub_data["text/plain"] = std::to_string(r.i64);
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::real4) : {
nl::json pub_data;
pub_data["text/plain"] = std::to_string(r.f32);
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::real8) : {
nl::json pub_data;
pub_data["text/plain"] = std::to_string(r.f64);
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::complex4) : {
nl::json pub_data;
pub_data["text/plain"] = "(" + std::to_string(r.c32.re) + ", " + std::to_string(r.c32.im) + ")";
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::complex8) : {
nl::json pub_data;
pub_data["text/plain"] = "(" + std::to_string(r.c64.re) + ", " + std::to_string(r.c64.im) + ")";
publish_execution_result(execution_counter, std::move(pub_data), nl::json::object());
break;
}
case (LFortran::FortranEvaluator::EvalResult::statement) : {
break;
}
case (LFortran::FortranEvaluator::EvalResult::none) : {
break;
}
default : throw LFortranException("Return type not supported");
}
nl::json result;
result["status"] = "ok";
result["payload"] = nl::json::array();
result["user_expressions"] = nl::json::object();
return result;
}
void custom_interpreter::configure_impl()
{
// Perform some operations
}
nl::json custom_interpreter::complete_request_impl(const std::string& code,
int cursor_pos)
{
nl::json result;
// Code starts with 'H', it could be the following completion
if (code[0] == 'H')
{
result["status"] = "ok";
result["matches"] = {"Hello", "Hey", "Howdy"};
result["cursor_start"] = 5;
result["cursor_end"] = cursor_pos;
}
// No completion result
else
{
result["status"] = "ok";
result["matches"] = nl::json::array();
result["cursor_start"] = cursor_pos;
result["cursor_end"] = cursor_pos;
}
return result;
}
nl::json custom_interpreter::inspect_request_impl(const std::string& code,
int /*cursor_pos*/,
int /*detail_level*/)
{
nl::json result;
if (code.compare("print") == 0)
{
result["found"] = true;
result["text/plain"] = "Print objects to the text stream file, [...]";
}
else
{
result["found"] = false;
}
result["status"] = "ok";
return result;
}
nl::json custom_interpreter::is_complete_request_impl(const std::string& /*code*/)
{
nl::json result;
// if (is_complete(code))
// {
result["status"] = "complete";
// }
// else
// {
// result["status"] = "incomplete";
// result["indent"] = 4;
//}
return result;
}
nl::json custom_interpreter::kernel_info_request_impl()
{
nl::json result;
std::string version = LFORTRAN_VERSION;
std::string banner = ""
"LFortran " + version + "\n"
"Jupyter kernel for Fortran";
result["banner"] = banner;
result["implementation"] = "LFortran";
result["implementation_version"] = version;
result["language_info"]["name"] = "fortran";
result["language_info"]["version"] = "2018";
result["language_info"]["mimetype"] = "text/x-fortran";
result["language_info"]["file_extension"] = ".f90";
return result;
}
void custom_interpreter::shutdown_request_impl() {
std::cout