summaryrefslogtreecommitdiff
path: root/libs/IO/src/LineReader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/IO/src/LineReader.cc')
-rw-r--r--libs/IO/src/LineReader.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/libs/IO/src/LineReader.cc b/libs/IO/src/LineReader.cc
new file mode 100644
index 0000000..bf4bcc2
--- /dev/null
+++ b/libs/IO/src/LineReader.cc
@@ -0,0 +1,100 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: LineReader.cc
+ * Created: 28. Juli 2012, 06
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: libIO: classes for files, filesystem and input/output
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <LineReader.h>
+#include <FileReader.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <iostream>
+
+cLineReader::cLineReader(cFileReader *FileReader)
+ : reader(FileReader)
+ , bytesRead(0)
+ , off(0)
+ , bufSize(1024)
+ , buf(NULL)
+ , lastLine(NULL)
+{
+ buf = (char *) malloc(bufSize + 1);
+ if (buf) {
+ buf[bufSize] = 0;
+ *buf = 0;
+ }
+}
+
+cLineReader::~cLineReader()
+{
+ Close();
+}
+
+void cLineReader::Close()
+{
+ if (reader) {
+ delete reader;
+ reader = NULL;
+ }
+ free(buf);
+ buf = NULL;
+ off = NULL;
+}
+
+const char *cLineReader::ReadLine(void)
+{
+ const char *rv = NULL;
+ char *p;
+
+ if (lastLine) lastLine += strlen(lastLine) + 1;
+ else lastLine = buf;
+ if (bytesRead && lastLine - buf >= bytesRead) return NULL;
+ p = strchr(lastLine, '\n');
+
+ if (!p && strlen(lastLine)) {
+ memmove(buf, lastLine, strlen(lastLine));
+ buf[strlen(lastLine)] = 0;
+ lastLine = buf;
+ }
+
+ if (!p && (!bytesRead || bytesRead == bufSize)) {
+ bytesRead = strlen(buf);
+ int br = reader->Read(buf + bytesRead, bufSize - bytesRead);
+
+ if (br > 0) bytesRead += br;
+ if (bytesRead < bufSize) memset(buf + bytesRead, 0, bufSize - bytesRead);
+ }
+
+ if (!p) p = strchr(lastLine, '\n');
+
+ if (p) {
+ if (p - buf <= bytesRead) {
+ *p = 0;
+ rv = lastLine;
+ }
+ }
+ else {
+ if (strlen(lastLine)) rv = lastLine;
+ }
+ return rv;
+}