|
|
@@ -0,0 +1,59 @@
|
|
|
+
|
|
|
+#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);
|
|
|
+}
|
|
|
+
|