#include #include #include #include "get_next_line.h" #define GETNEXTLINE_BUF_LENGTH 3 char* flushBuffer(char* buffer, size_t* bufferSize, char readBuffer[GETNEXTLINE_BUF_LENGTH], size_t readBufLength) { char* result; if (*bufferSize == 0 && readBufLength == 0) return NULL; result = (char*) malloc(sizeof(*buffer) * (*bufferSize + readBufLength +1)); if (*bufferSize) memcpy(result, buffer, *bufferSize); memcpy(&result[*bufferSize], readBuffer, readBufLength); result[readBufLength + *bufferSize] = '\0'; if (result[readBufLength + *bufferSize -1] == '\n') result[readBufLength + *bufferSize -1] = '\0'; if (buffer) free(buffer); *bufferSize = *bufferSize + readBufLength; return result; } char* get_next_line(int fd) { char* result; size_t resultSize; char buf[GETNEXTLINE_BUF_LENGTH]; size_t bufPos; int rdResult; result = NULL; resultSize = 0; bufPos = 0; while (1) { rdResult = read(fd, &buf[bufPos], 1); if (rdResult < 0) { if (result != NULL) free(result); return NULL; } bufPos += rdResult; if (rdResult == 0 || buf[bufPos-rdResult] == '\n') break; if (bufPos == GETNEXTLINE_BUF_LENGTH) { result = flushBuffer(result, &resultSize, buf, bufPos); bufPos = 0; } } return flushBuffer(result, &resultSize, buf, bufPos); }