#include #include #include #include #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; }