printfWrite.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <sys/param.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include "ft_printf_internal.h"
  6. int expandBuffer(struct printf_data* data, int size)
  7. {
  8. if (!data->realloc)
  9. return -1;
  10. int finalSize = ((size / PRINTF_OUTPUT_BUFFER_INCREMENT) +1) * PRINTF_OUTPUT_BUFFER_INCREMENT;
  11. char* newBuffer = (char*) malloc(sizeof(*newBuffer) * finalSize);
  12. if (!newBuffer)
  13. return -1;
  14. if (data->outputBuffer)
  15. {
  16. memcpy(newBuffer, data->outputBuffer, data->bufferMaxSize);
  17. free(data->outputBuffer);
  18. }
  19. data->outputBuffer = newBuffer;
  20. data->bufferMaxSize = finalSize;
  21. return 0;
  22. }
  23. int appendToBuffer(struct printf_data* data, const char* buf, size_t len)
  24. {
  25. int sizeToWrite = MIN(len, data->bufferMaxSize - data->written);
  26. int totalWritten = data->written;
  27. if (!data->outputBuffer && !data->realloc)
  28. return -1;
  29. if (data->outputBuffer)
  30. {
  31. memcpy(&data->outputBuffer[data->written], buf, sizeToWrite);
  32. data->written += sizeToWrite;
  33. len -= sizeToWrite;
  34. buf += sizeToWrite;
  35. }
  36. if (len > 0)
  37. {
  38. if (expandBuffer(data, data->bufferMaxSize + len) == -1)
  39. return -1;
  40. sizeToWrite = MIN(len, data->bufferMaxSize - data->written);
  41. memcpy(&data->outputBuffer[data->written], buf, sizeToWrite);
  42. data->written += sizeToWrite;
  43. }
  44. return data->written - totalWritten;
  45. }
  46. void flushBuffer(struct printf_data* data)
  47. {
  48. if (data->outputBuffer)
  49. {
  50. appendToBuffer(data, "", 1);
  51. if (data->realloc && data->written != data->bufferMaxSize)
  52. {
  53. char* newBuf = (char*) malloc(sizeof(*newBuf) * data->written);
  54. memcpy(newBuf, data->outputBuffer, data->written);
  55. free(data->outputBuffer);
  56. data->outputBuffer = newBuf;
  57. }
  58. }
  59. if (data->fdBuffer && data->bufferPos)
  60. {
  61. write(data->fd, data->fdBuffer, data->bufferPos);
  62. }
  63. }
  64. int printfWrite(struct printf_data* data, const char* buf, size_t len)
  65. {
  66. if (data->outputBuffer || data->realloc)
  67. return appendToBuffer(data, buf, len);
  68. if (data->fdBuffer)
  69. {
  70. int totalLen = len;
  71. while (len > 0)
  72. {
  73. int result = appendToFdBuffer(data, buf, len);
  74. if (result < 0)
  75. return result;
  76. len -= result;
  77. }
  78. data->written += totalLen;
  79. return totalLen;
  80. }
  81. int written = write(data->fd, buf, len);
  82. data->written += written;
  83. return written;
  84. }