diff --git a/src/libutil/include/nix/util/file-descriptor.hh b/src/libutil/include/nix/util/file-descriptor.hh index da12deb12ef..fcb70c7a989 100644 --- a/src/libutil/include/nix/util/file-descriptor.hh +++ b/src/libutil/include/nix/util/file-descriptor.hh @@ -104,10 +104,11 @@ void writeFull(Descriptor fd, std::string_view s, bool allowInterrupts = true); * * @param fd The file descriptor to read from * @param eofOk If true, return an unterminated line if EOF is reached. (e.g. the empty string) + * @param terminator The chartacter that ends the line * * @return A line of text ending in `\n`, or a string without `\n` if `eofOk` is true and EOF is reached. */ -std::string readLine(Descriptor fd, bool eofOk = false); +std::string readLine(Descriptor fd, bool eofOk = false, char terminator = '\n'); /** * Write a line to a file descriptor. diff --git a/src/libutil/include/nix/util/serialise.hh b/src/libutil/include/nix/util/serialise.hh index e1b5e220fee..916fa9ad32a 100644 --- a/src/libutil/include/nix/util/serialise.hh +++ b/src/libutil/include/nix/util/serialise.hh @@ -121,7 +121,7 @@ struct BufferedSource : virtual Source size_t read(char * data, size_t len) override; - std::string readLine(bool eofOk = false); + std::string readLine(bool eofOk = false, char terminator = '\n'); /** * Return true if the buffer is not empty. diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc index b1ec76f32d5..34fafa4ad03 100644 --- a/src/libutil/serialise.cc +++ b/src/libutil/serialise.cc @@ -138,7 +138,7 @@ size_t BufferedSource::read(char * data, size_t len) return n; } -std::string BufferedSource::readLine(bool eofOk) +std::string BufferedSource::readLine(bool eofOk, char terminator) { if (!buffer) buffer = std::make_unique_for_overwrite(bufSize); @@ -148,7 +148,7 @@ std::string BufferedSource::readLine(bool eofOk) if (bufPosOut < bufPosIn) { auto * start = buffer.get() + bufPosOut; auto * end = buffer.get() + bufPosIn; - if (auto * newline = static_cast(memchr(start, '\n', end - start))) { + if (auto * newline = static_cast(memchr(start, terminator, end - start))) { line.append(start, newline - start); bufPosOut = (newline - buffer.get()) + 1; if (bufPosOut == bufPosIn) diff --git a/src/libutil/unix/file-descriptor.cc b/src/libutil/unix/file-descriptor.cc index cbb4903eab9..c71a6845e3a 100644 --- a/src/libutil/unix/file-descriptor.cc +++ b/src/libutil/unix/file-descriptor.cc @@ -98,7 +98,7 @@ void writeFull(int fd, std::string_view s, bool allowInterrupts) } } -std::string readLine(int fd, bool eofOk) +std::string readLine(int fd, bool eofOk, char terminator) { std::string s; while (1) { @@ -123,7 +123,7 @@ std::string readLine(int fd, bool eofOk) else throw EndOfFile("unexpected EOF reading a line"); } else { - if (ch == '\n') + if (ch == terminator) return s; s += ch; }