6#ifndef GEMMI_INPUT_HPP_
7#define GEMMI_INPUT_HPP_
25 int getc() {
return std::fgetc(
f); }
27 bool read(
void* buf,
size_t len) {
return std::fread(buf, len, 1,
f) == 1; }
32 int c = std::fgetc(
f);
37 size_t n = std::fread(buf, 1,
sizeof(buf),
f);
49#elif defined(__MINGW32__)
59 : start(start_), end(start_ + size), cur(start_) {}
66 size =
int(end - cur);
67 const char*
nl = (
const char*) std::memchr(cur,
'\n', size);
68 size_t len =
nl ?
nl - cur + 1 : size;
69 std::memcpy(
line, cur, len);
74 int getc() {
return cur < end ? *cur++ :
EOF; }
76 bool read(
void* buf,
size_t len) {
79 std::memcpy(buf, cur, len);
85 const char*
last = cur;
87 return std::string(
last, end);
96 const char*
const start;
97 const char*
const end;
102 std::unique_ptr<
char,
decltype(&std::free)> ptr_;
107 explicit operator bool()
const {
return (
bool)ptr_; }
108 char*
data() {
return ptr_.get(); }
109 const char*
data()
const {
return ptr_.get(); }
110 size_t size()
const {
return size_; }
116 char*
new_ptr = (
char*) std::realloc(ptr_.get(), n);
118 fail(
"Out of memory.");
119 (
void) ptr_.release();
127 std::memmove(
data(),
data() + n, n);
136 const std::string&
path()
const {
return path_; };
137 const std::string&
basepath()
const {
return path_; };
154template<
typename Input>
158 size_t len = std::strlen(
line);
160 if (len > 0 &&
line[len-1] !=
'\n')
161 for (
int c =
in.getc(); c > 0 && c !=
'\n'; c =
in.getc())
const char * data() const
MemoryStream stream() const
size_t copy_line_from_stream(char *line, int size, Input &&in)
void fail(const std::string &msg)
bool read(void *buf, size_t len)
char * gets(char *line, int size)
bool seek(std::ptrdiff_t offset)
bool read(void *buf, size_t len)
char * gets(char *line, int size)
int seek(std::ptrdiff_t offset)
MemoryStream(const char *start_, size_t size)