12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #include <cctype>
- #include <chrono>
- #include <cstdlib>
- #include <iostream>
- #include <set>
- #include <sstream>
- #include <string>
- #include <thread>
- #include "cmsys/SystemTools.hxx"
- #ifdef _WIN32
- # include <windows.h>
- #endif
- static std::string getStdin()
- {
- char buffer[1024];
- std::ostringstream str;
- do {
- std::cin.read(buffer, 1024);
- str.write(buffer, std::cin.gcount());
- } while (std::cin.gcount() > 0);
- return str.str();
- }
- int main(int argc, char** argv)
- {
- if (argc < 2) {
- return -1;
- }
- std::string command = argv[1];
- if (command == "echo") {
- std::this_thread::sleep_for(std::chrono::milliseconds(6000));
- std::cout << "HELLO world!" << std::flush;
- std::cerr << "1" << std::flush;
- return 0;
- }
- if (command == "capitalize") {
- std::this_thread::sleep_for(std::chrono::milliseconds(12000));
- std::string input = getStdin();
- for (auto& c : input) {
- c = static_cast<char>(std::toupper(c));
- }
- std::cout << input << std::flush;
- std::cerr << "2" << std::flush;
- return 1;
- }
- if (command == "dedup") {
- // Use a nested scope to free all resources before aborting below.
- try {
- std::string input = getStdin();
- std::set<char> seen;
- std::string output;
- for (auto c : input) {
- if (!seen.count(c)) {
- seen.insert(c);
- output += c;
- }
- }
- std::cout << output << std::flush;
- std::cerr << "3" << std::flush;
- } catch (...) {
- }
- // On Windows, the exit code of abort() is different between debug and
- // release builds. Instead, simulate an access violation.
- #ifdef _WIN32
- return STATUS_ACCESS_VIOLATION;
- #else
- std::abort();
- #endif
- }
- if (command == "pwd") {
- std::string cwd = cmsys::SystemTools::GetCurrentWorkingDirectory();
- std::cout << cwd << std::flush;
- return 0;
- }
- return -1;
- }
|