handle last line without line break better
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 5 Jul 2008 21:00:01 +0000 (23:00 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 5 Jul 2008 21:00:01 +0000 (23:00 +0200)
CollectionReader.cpp

index 10cd9dc..4aa5173 100644 (file)
@@ -23,13 +23,13 @@ bool CollectionReader::isLineBreakPresent() {
 }
 
 ED2KLink* CollectionReader::getNextLink() {
-       if (readerInput->isEOF()) {
+       if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
                GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
                return NULL;
        }
        if (firstLink) {
                identifyCollectionType();
-               if (readerInput->isEOF()) {
+               if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
                        GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
                        return NULL;
                }
@@ -39,16 +39,27 @@ ED2KLink* CollectionReader::getNextLink() {
                while (!readerInput->isEOF() && !isLineBreakPresent()) {
                        readMoreBytes();
                }
-               if (readerInput->isEOF()) {
+               if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
                        GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
                        return NULL;
                }
                size_t indexOfLineBreak = growingBuffer.indexOf('\n');
-               char* line = (char*) calloc(indexOfLineBreak + 1, 1);
-               growingBuffer.read(line, indexOfLineBreak + 1);
-               line[indexOfLineBreak] = '\0';
-               if (line[indexOfLineBreak - 1] == '\r') {
-                       line[indexOfLineBreak - 1] = '\0';
+               char* line;
+               if (indexOfLineBreak == (size_t) -1) {
+                       GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not find line break, using remainder of file.\n", __FILE__, __LINE__);
+                       indexOfLineBreak = growingBuffer.getRemaining();
+                       line = (char*) malloc(indexOfLineBreak + 1);
+                       growingBuffer.read(line, indexOfLineBreak);
+                       line[indexOfLineBreak] = '\0';
+               } else {
+                       line = (char*) malloc(indexOfLineBreak + 1);
+                       growingBuffer.read(line, indexOfLineBreak + 1);
+                       if (line[indexOfLineBreak] == '\n') {
+                               line[indexOfLineBreak] = '\0';
+                       }
+                       if (line[indexOfLineBreak - 1] == '\r') {
+                               line[indexOfLineBreak - 1] = '\0';
+                       }
                }
                growingBuffer.cut();
                GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] got line: %s\n", __FILE__, __LINE__, line);