From 90fe4c5124e3fd335f05804d3cc47ba996e62b14 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 3 Jan 2013 10:16:05 +0100 Subject: TextFile: convert to a class --- src/TextFile.hxx | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) (limited to 'src/TextFile.hxx') diff --git a/src/TextFile.hxx b/src/TextFile.hxx index 5bd6dbd3..25f6ea7a 100644 --- a/src/TextFile.hxx +++ b/src/TextFile.hxx @@ -20,20 +20,47 @@ #ifndef MPD_TEXT_FILE_HXX #define MPD_TEXT_FILE_HXX +#include "gcc.h" + #include #include -/** - * Reads a line from the input file, and strips trailing space. There - * is a reasonable maximum line length, only to prevent denial of - * service. - * - * @param file the source file, opened in text mode - * @param buffer an allocator for the buffer - * @return a pointer to the line, or NULL on end-of-file or error - */ -char * -read_text_line(FILE *file, GString *buffer); +class TextFile { + static constexpr size_t max_length = 512 * 1024; + static constexpr size_t step = 1024; + + FILE *const file; + + GString *const buffer; + +public: + TextFile(const char *path_fs) + :file(fopen(path_fs, "r")), buffer(g_string_sized_new(step)) {} + + TextFile(const TextFile &other) = delete; + + ~TextFile() { + if (file != nullptr) + fclose(file); + + g_string_free(buffer, true); + } + + bool HasFailed() const { + return gcc_unlikely(file == nullptr); + } + + /** + * Reads a line from the input file, and strips trailing + * space. There is a reasonable maximum line length, only to + * prevent denial of service. + * + * @param file the source file, opened in text mode + * @param buffer an allocator for the buffer + * @return a pointer to the line, or NULL on end-of-file or error + */ + char *ReadLine(); +}; #endif -- cgit v1.2.3