diff --git a/eidos/eidos_functions.cpp b/eidos/eidos_functions.cpp index 42d8085c..b0c1740c 100644 --- a/eidos/eidos_functions.cpp +++ b/eidos/eidos_functions.cpp @@ -369,6 +369,7 @@ const std::vector &EidosInterpreter::BuiltInFunction signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("fileExists", Eidos_ExecuteFunction_fileExists, kEidosValueMaskLogical | kEidosValueMaskSingleton))->AddString_S(gEidosStr_filePath)); signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("flushFile", Eidos_ExecuteFunction_flushFile, kEidosValueMaskLogical | kEidosValueMaskSingleton))->AddString_S(gEidosStr_filePath)); signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("readFile", Eidos_ExecuteFunction_readFile, kEidosValueMaskString))->AddString_S(gEidosStr_filePath)); + signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("readLine", Eidos_ExecuteFunction_readLine, kEidosValueMaskString | kEidosValueMaskSingleton))); signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("setwd", Eidos_ExecuteFunction_setwd, kEidosValueMaskString | kEidosValueMaskSingleton))->AddString_S("path")); signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("tempdir", Eidos_ExecuteFunction_tempdir, kEidosValueMaskString | kEidosValueMaskSingleton))); signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("writeFile", Eidos_ExecuteFunction_writeFile, kEidosValueMaskLogical | kEidosValueMaskSingleton))->AddString_S(gEidosStr_filePath)->AddString("contents")->AddLogical_OS("append", gStaticEidosValue_LogicalF)->AddLogical_OS("compress", gStaticEidosValue_LogicalF)); diff --git a/eidos/eidos_functions.h b/eidos/eidos_functions.h index 3a5c0096..f57f1c64 100644 --- a/eidos/eidos_functions.h +++ b/eidos/eidos_functions.h @@ -250,6 +250,7 @@ EidosValue_SP Eidos_ExecuteFunction_filesAtPath(const std::vector EidosValue_SP Eidos_ExecuteFunction_flushFile(const std::vector &p_arguments, EidosInterpreter &p_interpreter); EidosValue_SP Eidos_ExecuteFunction_getwd(const std::vector &p_arguments, EidosInterpreter &p_interpreter); EidosValue_SP Eidos_ExecuteFunction_readFile(const std::vector &p_arguments, EidosInterpreter &p_interpreter); +EidosValue_SP Eidos_ExecuteFunction_readLine(const std::vector &p_arguments, EidosInterpreter &p_interpreter); EidosValue_SP Eidos_ExecuteFunction_setwd(const std::vector &p_arguments, EidosInterpreter &p_interpreter); EidosValue_SP Eidos_ExecuteFunction_tempdir(const std::vector &p_arguments, EidosInterpreter &p_interpreter); EidosValue_SP Eidos_ExecuteFunction_writeFile(const std::vector &p_arguments, EidosInterpreter &p_interpreter); diff --git a/eidos/eidos_functions_files.cpp b/eidos/eidos_functions_files.cpp index 46ae41ca..f8747877 100644 --- a/eidos/eidos_functions_files.cpp +++ b/eidos/eidos_functions_files.cpp @@ -27,7 +27,9 @@ #include #include #include +#include #include +#include #include "../eidos_zlib/zlib.h" @@ -220,6 +222,40 @@ EidosValue_SP Eidos_ExecuteFunction_readFile(const std::vector &p return result_SP; } +// (string$)readLine(void) +EidosValue_SP Eidos_ExecuteFunction_readLine(const std::vector &p_arguments, EidosInterpreter &p_interpreter) +{ +#pragma unused (p_arguments) + +#ifdef EIDOS_GUI + EIDOS_TERMINATION << "ERROR (Eidos_ExecuteFunction_readLine): function readLine() is not available in GUI environments (SLiMgui, SLiMguiLegacy, or EidosScribe)." << EidosTerminate(nullptr); +#endif + + // This function was implemented by Chris Talbot 11/19/25 for use in reinforcement learning environments. + // Associated with issue #576. + + EidosValue_SP result_SP(nullptr); + + // Read a single line from stdin (command-line mode with interactive terminal) + std::string line; + + if (std::getline(std::cin, line)) + { + // Control for CRLF vs. LF line endings + if (!line.empty() && line[line.size() - 1] == '\r') + line.pop_back(); + + result_SP = EidosValue_SP(new (gEidosValuePool->AllocateChunk()) EidosValue_String(line)); + } + else + { + // EOF or error reading from stdin; return empty string + result_SP = EidosValue_SP(new (gEidosValuePool->AllocateChunk()) EidosValue_String("")); + } + + return result_SP; +} + // (string$)setwd(string$ path) EidosValue_SP Eidos_ExecuteFunction_setwd(const std::vector &p_arguments, __attribute__((unused)) EidosInterpreter &p_interpreter) {