| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include <sys/param.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include "ft_printf_internal.h"
- int expandBuffer(struct printf_data* data, int size)
- {
- if (!data->realloc)
- return -1;
- int finalSize = ((size / PRINTF_OUTPUT_BUFFER_INCREMENT) +1) * PRINTF_OUTPUT_BUFFER_INCREMENT;
- char* newBuffer = (char*) malloc(sizeof(*newBuffer) * finalSize);
- if (!newBuffer)
- return -1;
- if (data->outputBuffer)
- {
- memcpy(newBuffer, data->outputBuffer, data->bufferMaxSize);
- free(data->outputBuffer);
- }
- data->outputBuffer = newBuffer;
- data->bufferMaxSize = finalSize;
- return 0;
- }
- int appendToBuffer(struct printf_data* data, const char* buf, size_t len)
- {
- int sizeToWrite = MIN(len, data->bufferMaxSize - data->written);
- int totalWritten = data->written;
- if (!data->outputBuffer && !data->realloc)
- return -1;
- if (data->outputBuffer)
- {
- memcpy(&data->outputBuffer[data->written], buf, sizeToWrite);
- data->written += sizeToWrite;
- len -= sizeToWrite;
- buf += sizeToWrite;
- }
- if (len > 0)
- {
- if (expandBuffer(data, data->bufferMaxSize + len) == -1)
- return -1;
- sizeToWrite = MIN(len, data->bufferMaxSize - data->written);
- memcpy(&data->outputBuffer[data->written], buf, sizeToWrite);
- data->written += sizeToWrite;
- }
- return data->written - totalWritten;
- }
- void flushBuffer(struct printf_data* data)
- {
- if (data->outputBuffer)
- {
- appendToBuffer(data, "", 1);
- if (data->realloc && data->written != data->bufferMaxSize)
- {
- char* newBuf = (char*) malloc(sizeof(*newBuf) * data->written);
- memcpy(newBuf, data->outputBuffer, data->written);
- free(data->outputBuffer);
- data->outputBuffer = newBuf;
- }
- }
- if (data->fdBuffer && data->bufferPos)
- {
- write(data->fd, data->fdBuffer, data->bufferPos);
- }
- }
- int printfWrite(struct printf_data* data, const char* buf, size_t len)
- {
- if (data->outputBuffer || data->realloc)
- return appendToBuffer(data, buf, len);
- if (data->fdBuffer)
- {
- int totalLen = len;
- while (len > 0)
- {
- int result = appendToFdBuffer(data, buf, len);
- if (result < 0)
- return result;
- len -= result;
- }
- data->written += totalLen;
- return totalLen;
- }
- int written = write(data->fd, buf, len);
- data->written += written;
- return written;
- }
|