Skip to content

Commit 744bc3f

Browse files
authored
Merge pull request #577 from chris-a-talbot/add-readLine-eidos
Add readLine() to Eidos - resolves issue #576
2 parents c24f11f + eb09ff1 commit 744bc3f

3 files changed

Lines changed: 38 additions & 0 deletions

File tree

eidos/eidos_functions.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ const std::vector<EidosFunctionSignature_CSP> &EidosInterpreter::BuiltInFunction
369369
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("fileExists", Eidos_ExecuteFunction_fileExists, kEidosValueMaskLogical | kEidosValueMaskSingleton))->AddString_S(gEidosStr_filePath));
370370
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("flushFile", Eidos_ExecuteFunction_flushFile, kEidosValueMaskLogical | kEidosValueMaskSingleton))->AddString_S(gEidosStr_filePath));
371371
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("readFile", Eidos_ExecuteFunction_readFile, kEidosValueMaskString))->AddString_S(gEidosStr_filePath));
372+
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("readLine", Eidos_ExecuteFunction_readLine, kEidosValueMaskString | kEidosValueMaskSingleton)));
372373
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("setwd", Eidos_ExecuteFunction_setwd, kEidosValueMaskString | kEidosValueMaskSingleton))->AddString_S("path"));
373374
signatures->emplace_back((EidosFunctionSignature *)(new EidosFunctionSignature("tempdir", Eidos_ExecuteFunction_tempdir, kEidosValueMaskString | kEidosValueMaskSingleton)));
374375
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));

eidos/eidos_functions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ EidosValue_SP Eidos_ExecuteFunction_filesAtPath(const std::vector<EidosValue_SP>
250250
EidosValue_SP Eidos_ExecuteFunction_flushFile(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
251251
EidosValue_SP Eidos_ExecuteFunction_getwd(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
252252
EidosValue_SP Eidos_ExecuteFunction_readFile(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
253+
EidosValue_SP Eidos_ExecuteFunction_readLine(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
253254
EidosValue_SP Eidos_ExecuteFunction_setwd(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
254255
EidosValue_SP Eidos_ExecuteFunction_tempdir(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);
255256
EidosValue_SP Eidos_ExecuteFunction_writeFile(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter);

eidos/eidos_functions_files.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
#include <stdio.h>
2828
#include <dirent.h>
2929
#include <fstream>
30+
#include <iostream>
3031
#include <sys/stat.h>
32+
#include <unistd.h>
3133

3234
#include "../eidos_zlib/zlib.h"
3335

@@ -220,6 +222,40 @@ EidosValue_SP Eidos_ExecuteFunction_readFile(const std::vector<EidosValue_SP> &p
220222
return result_SP;
221223
}
222224

225+
// (string$)readLine(void)
226+
EidosValue_SP Eidos_ExecuteFunction_readLine(const std::vector<EidosValue_SP> &p_arguments, EidosInterpreter &p_interpreter)
227+
{
228+
#pragma unused (p_arguments)
229+
230+
#ifdef EIDOS_GUI
231+
EIDOS_TERMINATION << "ERROR (Eidos_ExecuteFunction_readLine): function readLine() is not available in GUI environments (SLiMgui, SLiMguiLegacy, or EidosScribe)." << EidosTerminate(nullptr);
232+
#endif
233+
234+
// This function was implemented by Chris Talbot 11/19/25 for use in reinforcement learning environments.
235+
// Associated with issue #576.
236+
237+
EidosValue_SP result_SP(nullptr);
238+
239+
// Read a single line from stdin (command-line mode with interactive terminal)
240+
std::string line;
241+
242+
if (std::getline(std::cin, line))
243+
{
244+
// Control for CRLF vs. LF line endings
245+
if (!line.empty() && line[line.size() - 1] == '\r')
246+
line.pop_back();
247+
248+
result_SP = EidosValue_SP(new (gEidosValuePool->AllocateChunk()) EidosValue_String(line));
249+
}
250+
else
251+
{
252+
// EOF or error reading from stdin; return empty string
253+
result_SP = EidosValue_SP(new (gEidosValuePool->AllocateChunk()) EidosValue_String(""));
254+
}
255+
256+
return result_SP;
257+
}
258+
223259
// (string$)setwd(string$ path)
224260
EidosValue_SP Eidos_ExecuteFunction_setwd(const std::vector<EidosValue_SP> &p_arguments, __attribute__((unused)) EidosInterpreter &p_interpreter)
225261
{

0 commit comments

Comments
 (0)