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.

167 lines
2.7 KiB

5 years ago
  1. #pragma once
  2. #include "tool.h"
  3. #include <iostream>
  4. #include <fstream>
  5. #include <sstream>
  6. #include <array>
  7. #include <string_view>
  8. #include <string>
  9. class file_lines : public tool
  10. {
  11. std::optional<std::shared_ptr<tool>> n;
  12. tool_env me;
  13. std::ifstream source;
  14. bool has_buffered = false;
  15. std::string next;
  16. std::stringstream buffer;
  17. public:
  18. file_lines(std::ifstream&& stream, tool_env t)
  19. : me{t}
  20. {
  21. source = std::move(stream);
  22. }
  23. file_lines(tool_env t)
  24. : me{t}
  25. {
  26. source.open(t["file"]);
  27. }
  28. virtual void init(std::optional<std::shared_ptr<tool>> next)
  29. {
  30. n = next;
  31. }
  32. /*
  33. virtual void execute()
  34. {
  35. if(has_queue())
  36. {
  37. if(n.has_value() && next!="\0")
  38. n.value()->enqueue(next);
  39. has_buffered = false;
  40. }
  41. }
  42. virtual void enqueue(std::string v)
  43. {}
  44. virtual bool has_queue()
  45. {
  46. if(has_buffered)
  47. {
  48. return true;
  49. }
  50. else
  51. {
  52. next = "";
  53. std::array<char, 4096> buff;
  54. if(source.good() && buffer.rdbuf()->in_avail() <= buff.size())
  55. {
  56. if(me["reload"]!="true")
  57. {
  58. source.readsome(&buff.front(), buff.size());
  59. size_t sz = source.gcount();
  60. std::string_view data{&buff.front(),sz};
  61. buffer<<data;
  62. }
  63. else if(buffer.rdbuf()->in_avail()==0)
  64. {
  65. source.clear();
  66. source.seekg(0, std::ios::beg);
  67. while(source >> buffer.rdbuf());
  68. }
  69. }
  70. {
  71. std::string_view data;
  72. do{
  73. buffer.getline(&buff.front(), buff.size());
  74. size_t sz = buffer.gcount();
  75. data = std::string_view{&buff.front(),sz};
  76. next+=data.size();
  77. }
  78. while(data.size() == buff.size());
  79. if(next.empty())
  80. {
  81. return false;
  82. }
  83. has_buffered = true;
  84. return true;
  85. }
  86. }
  87. }*/
  88. virtual void execute()
  89. {
  90. if(has_queue())
  91. {
  92. if(n.has_value())
  93. n.value()->enqueue(next);
  94. has_buffered = false;
  95. }
  96. }
  97. virtual void enqueue(std::string v)
  98. {}
  99. virtual bool has_queue()
  100. {
  101. if(has_buffered) return true;
  102. if(source.good() && !source.eof())
  103. {
  104. std::getline(source, next);
  105. has_buffered=true;
  106. return true;
  107. }else if(me["reload"]=="true"){
  108. source.clear();
  109. source.seekg(0, std::ios::beg);
  110. std::getline(source, next);
  111. has_buffered=true;
  112. return true;
  113. }
  114. return false;
  115. }
  116. };
  117. class stdin_lines : public tool
  118. {
  119. std::optional<std::shared_ptr<tool>> n;
  120. tool_env me;
  121. bool has_buffered = false;
  122. std::string next;
  123. public:
  124. stdin_lines(tool_env t)
  125. : me{t}
  126. {}
  127. virtual void init(std::optional<std::shared_ptr<tool>> next)
  128. {
  129. n = next;
  130. }
  131. virtual void execute()
  132. {
  133. if(has_queue())
  134. {
  135. if(n.has_value())
  136. n.value()->enqueue(next);
  137. has_buffered = false;
  138. }
  139. }
  140. virtual void enqueue(std::string v)
  141. {}
  142. virtual bool has_queue()
  143. {
  144. if(!has_buffered)
  145. {
  146. std::getline(std::cin, next);
  147. has_buffered=true;
  148. }
  149. return true;
  150. }
  151. };