| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #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);
- }
|