Add string input interrupt from STDIN
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <cstdio>
|
||||
#include <execute/error.hpp>
|
||||
#include <execute/interrupts.hpp>
|
||||
|
||||
namespace Execute
|
||||
@@ -18,6 +19,11 @@ namespace Execute
|
||||
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory)
|
||||
{
|
||||
unsigned const end = registers.A + registers.B;
|
||||
if (end >= memory.size())
|
||||
{
|
||||
throw OutOfMemory(registers.A, registers.B);
|
||||
}
|
||||
|
||||
for(unsigned i = registers.A; i < end; ++i)
|
||||
{
|
||||
std::putc(memory[i], stdout);
|
||||
@@ -29,7 +35,49 @@ namespace Execute
|
||||
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory)
|
||||
{
|
||||
registers.A = std::getchar();
|
||||
}
|
||||
if (registers.A == '\n')
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while(std::getchar() != '\n');
|
||||
},
|
||||
// 11 get string from STDIN
|
||||
[](Execute::Registers & registers, std::vector<std::uint8_t> & memory)
|
||||
{
|
||||
if (registers.B <= 0)
|
||||
{
|
||||
registers.B = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (registers.A < 0 || static_cast<unsigned>(registers.A + registers.B) >= memory.size())
|
||||
{
|
||||
throw OutOfMemory(registers.A, registers.B);
|
||||
}
|
||||
|
||||
int charactersRead = 0;
|
||||
bool newlineRead = false;
|
||||
while(charactersRead < registers.B)
|
||||
{
|
||||
char result = std::getchar();
|
||||
if (result == '\n')
|
||||
{
|
||||
newlineRead = true;
|
||||
break;
|
||||
}
|
||||
|
||||
memory[registers.A + charactersRead] = result;
|
||||
++charactersRead;
|
||||
}
|
||||
|
||||
registers.B = charactersRead;
|
||||
|
||||
if (!newlineRead)
|
||||
{
|
||||
while(std::getchar() != '\n');
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user