A programming language for manipulation of streams.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

168 lignes
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;
}
};