get_next_line.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "get_next_line.h"
  5. #define GETNEXTLINE_BUF_LENGTH 3
  6. char* flushBuffer(char* buffer, size_t* bufferSize, char readBuffer[GETNEXTLINE_BUF_LENGTH], size_t readBufLength)
  7. {
  8. char* result;
  9. if (*bufferSize == 0 && readBufLength == 0)
  10. return NULL;
  11. result = (char*) malloc(sizeof(*buffer) * (*bufferSize + readBufLength +1));
  12. if (*bufferSize)
  13. memcpy(result, buffer, *bufferSize);
  14. memcpy(&result[*bufferSize], readBuffer, readBufLength);
  15. result[readBufLength + *bufferSize] = '\0';
  16. if (result[readBufLength + *bufferSize -1] == '\n')
  17. result[readBufLength + *bufferSize -1] = '\0';
  18. if (buffer)
  19. free(buffer);
  20. *bufferSize = *bufferSize + readBufLength;
  21. return result;
  22. }
  23. char* get_next_line(int fd)
  24. {
  25. char* result;
  26. size_t resultSize;
  27. char buf[GETNEXTLINE_BUF_LENGTH];
  28. size_t bufPos;
  29. int rdResult;
  30. result = NULL;
  31. resultSize = 0;
  32. bufPos = 0;
  33. while (1)
  34. {
  35. rdResult = read(fd, &buf[bufPos], 1);
  36. if (rdResult < 0)
  37. {
  38. if (result != NULL)
  39. free(result);
  40. return NULL;
  41. }
  42. bufPos += rdResult;
  43. if (rdResult == 0 || buf[bufPos-rdResult] == '\n')
  44. break;
  45. if (bufPos == GETNEXTLINE_BUF_LENGTH)
  46. {
  47. result = flushBuffer(result, &resultSize, buf, bufPos);
  48. bufPos = 0;
  49. }
  50. }
  51. return flushBuffer(result, &resultSize, buf, bufPos);
  52. }