}
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;
}
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);
ED2KLink* ed2kLink = ED2KLink::parseED2KLink(line);
+ free(line);
return ed2kLink;
} else {
}
return NULL;
}
+bool CollectionReader::ensureBufferCapacity(size_t byteCount) {
+ while (!readerInput->isEOF() && (growingBuffer.getRemaining() < byteCount)) {
+ GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] only %d bytes remaning, need at least %d, reading more bytes.\n", __FILE__, __LINE__, growingBuffer.getRemaining(), byteCount);
+ readMoreBytes();
+ }
+ if (readerInput->isEOF() && (growingBuffer.getRemaining() < byteCount)) {
+ GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] need %d more bytes, but file is EOF.\n", __FILE__, __LINE__, (byteCount - growingBuffer.getRemaining()));
+ return false;
+ }
+ return true;
+}
+
void CollectionReader::readMoreBytes() {
char buffer[1024];
size_t readBytes;