Commit 36ff9919 authored by Max Kellermann's avatar Max Kellermann

TextInputStream: move code to ReadBufferedLine()

Look at the buffer first, before trying to read from the file. This reduces overhead because we don't refill the buffer after every line.
parent 59d38f87
......@@ -28,51 +28,59 @@
#include <string.h>
char *
TextInputStream::ReadLine()
TextInputStream::ReadBufferedLine()
{
char *src, *p;
do {
size_t nbytes;
auto dest = buffer.Write();
if (dest.size >= 2) {
/* reserve one byte for the null terminator if
the last line is not terminated by a
newline character */
--dest.size;
auto r = buffer.Read();
char *newline = reinterpret_cast<char*>(memchr(r.data, '\n', r.size));
if (newline == nullptr)
return nullptr;
Error error;
nbytes = is.LockRead(dest.data, dest.size, error);
if (nbytes > 0)
buffer.Append(nbytes);
else if (error.IsDefined()) {
LogError(error);
return nullptr;
}
} else
nbytes = 0;
buffer.Consume(newline + 1 - r.data);
auto src_p = buffer.Read();
if (src_p.IsEmpty())
return nullptr;
char *end = StripRight(r.data, newline);
*end = 0;
return r.data;
}
src = src_p.data;
char *
TextInputStream::ReadLine()
{
char *line = ReadBufferedLine();
if (line != nullptr)
return line;
p = reinterpret_cast<char*>(memchr(src, '\n', src_p.size));
if (p == nullptr && nbytes == 0) {
while (true) {
auto dest = buffer.Write();
if (dest.size < 2) {
/* end of file (or line too long): terminate
the current line */
dest = buffer.Write();
assert(!dest.IsEmpty());
dest[0] = 0;
line = buffer.Read().data;
buffer.Clear();
return src;
return line;
}
} while (p == nullptr);
buffer.Consume(p - src + 1);
/* reserve one byte for the null terminator if the
last line is not terminated by a newline
character */
--dest.size;
char *end = StripRight(src, p);
*end = 0;
return src;
Error error;
size_t nbytes = is.LockRead(dest.data, dest.size, error);
if (nbytes > 0)
buffer.Append(nbytes);
else if (error.IsDefined()) {
LogError(error);
return nullptr;
}
line = ReadBufferedLine();
if (line != nullptr)
return line;
if (nbytes == 0)
return nullptr;
}
}
......@@ -47,6 +47,9 @@ public:
* @return a pointer to the line, or nullptr on end-of-file or error
*/
char *ReadLine();
private:
char *ReadBufferedLine();
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment