6#ifndef GEMMI_INPUT_HPP_
7#define GEMMI_INPUT_HPP_
23 virtual bool read(
void* buf,
size_t len) = 0;
27 virtual bool skip(
size_t n) = 0;
33 size_t len = std::strlen(
line);
35 if (len > 0 &&
line[len-1] !=
'\n')
36 for (
int c =
getc(); c > 0 && c !=
'\n'; c =
getc())
46 char*
gets(
char*
line,
int size)
override {
return std::fgets(
line, size, f.get()); }
47 int getc()
override {
return std::fgetc(f.get()); }
48 bool read(
void* buf,
size_t len)
override {
return std::fread(buf, len, 1, f.get()) == 1; }
52 int c = std::fgetc(f.get());
57 size_t n = std::fread(buf, 1,
sizeof(buf), f.get());
67 return std::ftell(f.get());
70 bool skip(
size_t n)
override {
73#elif defined(__MINGW32__)
80 while (n >=
sizeof(buf)) {
81 if (std::fread(buf,
sizeof(buf), 1, f.get()) != 1)
85 if (n > 0 && std::fread(buf, n, 1, f.get()) != 1)
97 : start(start_), end(start_ + size), cur(start_) {}
103 if (size > end - cur)
104 size =
int(end - cur);
105 const char*
nl = (
const char*) std::memchr(cur,
'\n', size);
106 size_t len =
nl ?
nl - cur + 1 : size;
107 std::memcpy(
line, cur, len);
112 int getc()
override {
return cur < end ? *cur++ :
EOF; }
114 bool read(
void* buf,
size_t len)
override {
117 std::memcpy(buf, cur, len);
123 const char*
last = cur;
125 return std::string(
last, end);
137 const char*
const start;
138 const char*
const end;
146 const std::string&
path()
const {
return path_; }
147 const std::string&
basepath()
const {
return path_; }
fileptr_t file_open_or(const char *path, const char *mode, std::FILE *dash_stream)
std::unique_ptr< std::FILE, needs_fclose > fileptr_t
virtual std::string read_rest()
virtual char * gets(char *line, int size)=0
virtual bool skip(size_t n)=0
virtual bool read(void *buf, size_t len)=0
size_t copy_line(char *line, int size)
virtual ~AnyStream()=default
FileStream(std::FILE *f_)
char * gets(char *line, int size) override
bool skip(size_t n) override
std::string read_rest() override
FileStream(const char *path, const char *mode)
bool read(void *buf, size_t len) override
bool read(void *buf, size_t len) override
bool skip(size_t n) override
std::string read_rest() override
char * gets(char *line, int size) override
MemoryStream(const char *start_, size_t size)