blob: ad5077c7fc5d687826c03538290fe0eecadc093a [file] [edit]
/*
* Copyright 2026 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <thread>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#else
#include <unistd.h>
#endif
using namespace std;
void main_loop() {
static bool first_line = true;
string str;
errno = 0;
while (errno != EAGAIN) {
if (first_line) {
char c;
if (std::cin.get(c)) {
std::cout.put(c);
if (c == '\n') {
first_line = false;
}
}
} else {
if (getline(std::cin, str)) {
std::cout << str << "\n";
}
}
if (std::cin.fail() && !std::cin.eof()) {
if (errno != EAGAIN) {
cerr << "error " << strerror(errno) << "\n";
exit(EXIT_FAILURE);
}
std::cin.clear();
}
if (std::cin.eof()) {
std::cout << "eof\n";
exit(EXIT_SUCCESS);
}
}
}
int main(int argc, char const *argv[]) {
// SM shell doesn't implement an event loop and therefore doesn't support
// emscripten_set_main_loop. However, its stdin reads are sync so it
// should exit out after calling main_loop once.
main_loop();
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(main_loop, 60, 0);
#else
while (1) main_loop(); sleep(1);
#endif
return 0;
}