A programming language for manipulation of streams.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 

168 рядки
2.7 KiB

#pragma once
#include "tool.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <array>
#include <string_view>
#include <string>
class file_lines : public tool
{
std::optional<std::shared_ptr<tool>> n;
tool_env me;
std::ifstream source;
bool has_buffered = false;
std::string next;
std::stringstream buffer;
public:
file_lines(std::ifstream&& stream, tool_env t)
: me{t}
{
source = std::move(stream);
}
file_lines(tool_env t)
: me{t}
{
source.open(t["file"]);
}
virtual void init(std::optional<std::shared_ptr<tool>> next)
{
n = next;
}
/*
virtual void execute()
{
if(has_queue())
{
if(n.has_value() && next!="\0")
n.value()->enqueue(next);
has_buffered = false;
}
}
virtual void enqueue(std::string v)
{}
virtual bool has_queue()
{
if(has_buffered)
{
return true;
}
else
{
next = "";
std::array<char, 4096> buff;
if(source.good() && buffer.rdbuf()->in_avail() <= buff.size())
{
if(me["reload"]!="true")
{
source.readsome(&buff.front(), buff.size());
size_t sz = source.gcount();
std::string_view data{&buff.front(),sz};
buffer<<data;
}
else if(buffer.rdbuf()->in_avail()==0)
{
source.clear();
source.seekg(0, std::ios::beg);
while(source >> buffer.rdbuf());
}
}
{
std::string_view data;
do{
buffer.getline(&buff.front(), buff.size());
size_t sz = buffer.gcount();
data = std::string_view{&buff.front(),sz};
next+=data.size();
}
while(data.size() == buff.size());
if(next.empty())
{
return false;
}
has_buffered = true;
return true;
}
}
}*/
virtual void execute()
{
if(has_queue())
{
if(n.has_value())
n.value()->enqueue(next);
has_buffered = false;
}
}
virtual void enqueue(std::string v)
{}
virtual bool has_queue()
{
if(has_buffered) return true;
if(source.good() && !source.eof())
{
std::getline(source, next);
has_buffered=true;
return true;
}else if(me["reload"]=="true"){
source.clear();
source.seekg(0, std::ios::beg);
std::getline(source, next);
has_buffered=true;
return true;
}
return false;
}
};
class stdin_lines : public tool
{
std::optional<std::shared_ptr<tool>> n;
tool_env me;
bool has_buffered = false;
std::string next;
public:
stdin_lines(tool_env t)
: me{t}
{}
virtual void init(std::optional<std::shared_ptr<tool>> next)
{
n = next;
}
virtual void execute()
{
if(has_queue())
{
if(n.has_value())
n.value()->enqueue(next);
has_buffered = false;
}
}
virtual void enqueue(std::string v)
{}
virtual bool has_queue()
{
if(!has_buffered)
{
std::getline(std::cin, next);
has_buffered=true;
}
return true;
}
};