aboutsummaryrefslogtreecommitdiff
path: root/src/TextFile.hxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-01-03 10:16:05 +0100
committerMax Kellermann <max@duempel.org>2013-01-03 10:16:05 +0100
commit90fe4c5124e3fd335f05804d3cc47ba996e62b14 (patch)
treeef7fb6b3cb2edbe4898431db611f04fb281129fc /src/TextFile.hxx
parent2452447c814048ed72e95a459c76b4be65962b5c (diff)
TextFile: convert to a class
Diffstat (limited to 'src/TextFile.hxx')
-rw-r--r--src/TextFile.hxx49
1 files changed, 38 insertions, 11 deletions
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 <glib.h>
#include <stdio.h>
-/**
- * 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