#include #include "ft_printf_internal.h" int doPrintf(struct printf_data* params, va_list args) { int to; int syscallReturn; to = 0; while (params->inputBuffer[to] && params->inputBuffer[to] != '%') { ++to; } if (to) { syscallReturn = printfWrite(params, params->inputBuffer, to); if (syscallReturn < 0) return syscallReturn; params->inputBuffer += to; } if (*params->inputBuffer == '%') { params->inputBuffer++; syscallReturn = expandParams(params, args); if (syscallReturn < 0) return syscallReturn; return 0; } return 0; } int ft_vdprintf(int fd, char* format, va_list args) { struct printf_data params; params.fd = fd; params.written = 0; params.inputBuffer = format; params.outputBuffer = NULL; params.realloc = 0; params.fdBuffer = (char*) malloc(sizeof(*params.fdBuffer) * PRINTF_FD_BUFFER_LEN); params.bufferMaxSize = PRINTF_FD_BUFFER_LEN; params.bufferPos = 0; while (*params.inputBuffer) { if (doPrintf(¶ms, args) < 0) return -1; } flushBuffer(¶ms); free(params.fdBuffer); return params.written; }