A programming language for manipulation of streams.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
1.4 KiB

5 years ago
  1. #include "tool.h"
  2. #include <deque>
  3. #include <iostream>
  4. #include <fstream>
  5. class identity : public tool
  6. {
  7. std::optional<std::shared_ptr<tool>> n;
  8. tool_env me;
  9. std::deque<std::string> queue;
  10. public:
  11. identity(tool_env t)
  12. : me{t}
  13. {}
  14. virtual void init(std::optional<std::shared_ptr<tool>> next)
  15. {
  16. n = next;
  17. }
  18. virtual void execute()
  19. {
  20. if(has_queue())
  21. {
  22. if(n.has_value())
  23. n.value()->enqueue(queue.front());
  24. queue.pop_front();
  25. }
  26. }
  27. virtual void enqueue(std::string v)
  28. {
  29. queue.push_back(v);
  30. }
  31. virtual bool has_queue()
  32. {
  33. return queue.size()!=0;
  34. }
  35. };
  36. class echo : public tool
  37. {
  38. std::optional<std::shared_ptr<tool>> n;
  39. tool_env me;
  40. std::deque<std::string> queue;
  41. std::optional<std::unique_ptr<std::ofstream> > outlet = std::nullopt;
  42. public:
  43. echo(tool_env t)
  44. : me{t}
  45. {}
  46. virtual void init(std::optional<std::shared_ptr<tool>> next)
  47. {
  48. n = next;
  49. if(me.find("file")!=me.end())
  50. {
  51. outlet = std::make_unique<std::ofstream>(me["file"]);
  52. }
  53. }
  54. virtual void execute()
  55. {
  56. if(has_queue())
  57. {
  58. if(outlet.has_value())
  59. {
  60. (*outlet.value())<<escape(queue.front()) << std::endl;
  61. }
  62. else
  63. {
  64. std::cout << escape(queue.front()) << std::endl;
  65. }
  66. if(n.has_value())
  67. n.value()->enqueue(queue.front());
  68. queue.pop_front();
  69. }
  70. }
  71. virtual void enqueue(std::string v)
  72. {
  73. queue.push_back(v);
  74. }
  75. virtual bool has_queue()
  76. {
  77. return queue.size()!=0;
  78. }
  79. };