ft_dprintf.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <stdlib.h>
  2. #include "ft_printf_internal.h"
  3. int doPrintf(struct printf_data* params, va_list args)
  4. {
  5. int to;
  6. int syscallReturn;
  7. to = 0;
  8. while (params->inputBuffer[to] && params->inputBuffer[to] != '%')
  9. {
  10. ++to;
  11. }
  12. if (to)
  13. {
  14. syscallReturn = printfWrite(params, params->inputBuffer, to);
  15. if (syscallReturn < 0)
  16. return syscallReturn;
  17. params->inputBuffer += to;
  18. }
  19. if (*params->inputBuffer == '%')
  20. {
  21. params->inputBuffer++;
  22. syscallReturn = expandParams(params, args);
  23. if (syscallReturn < 0)
  24. return syscallReturn;
  25. return 0;
  26. }
  27. return 0;
  28. }
  29. int ft_vdprintf(int fd, char* format, va_list args)
  30. {
  31. struct printf_data params;
  32. params.fd = fd;
  33. params.written = 0;
  34. params.inputBuffer = format;
  35. params.outputBuffer = NULL;
  36. params.realloc = 0;
  37. params.fdBuffer = (char*) malloc(sizeof(*params.fdBuffer) * PRINTF_FD_BUFFER_LEN);
  38. params.bufferMaxSize = PRINTF_FD_BUFFER_LEN;
  39. params.bufferPos = 0;
  40. while (*params.inputBuffer)
  41. {
  42. if (doPrintf(&params, args) < 0)
  43. return -1;
  44. }
  45. flushBuffer(&params);
  46. free(params.fdBuffer);
  47. return params.written;
  48. }