printfC.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <errno.h>
  2. #include <string.h>
  3. #include "ft_printf_internal.h"
  4. int padString(struct printf_data* data, int len)
  5. {
  6. int padLen = 0;
  7. int sysCallRet;
  8. while (len > 0)
  9. {
  10. sysCallRet = printfWrite(data, " ", 1);
  11. if (sysCallRet < 0)
  12. return sysCallRet;
  13. padLen += sysCallRet;
  14. --len;
  15. }
  16. return padLen;
  17. }
  18. int printf_c(struct printf_data* data, struct printf_format_params* format, va_list args)
  19. {
  20. char c = (char) va_arg(args, int);
  21. int len = format->width -1;
  22. int padLen = 0;
  23. int sysCallRet;
  24. padLen = padString(data, len);
  25. if (padLen < 0)
  26. return padLen;
  27. sysCallRet = printfWrite(data, &c, 1);
  28. if (sysCallRet < 0)
  29. return sysCallRet;
  30. return sysCallRet + padLen;
  31. }
  32. int printfString(struct printf_data* data, struct printf_format_params* format, const char* str)
  33. {
  34. int len = strlen(str);
  35. int pad = format->width;
  36. if (format->precision >= 0 && len > format->precision)
  37. len = format->precision;
  38. if (pad >= 0)
  39. pad = pad - len;
  40. pad = padString(data, pad);
  41. if (pad < 0)
  42. return pad;
  43. len = printfWrite(data, str, len);
  44. if (len < 0)
  45. return len;
  46. return pad + len;
  47. }
  48. int printf_s(struct printf_data* data, struct printf_format_params* format, va_list args)
  49. {
  50. const char* str = va_arg(args, const char*);
  51. return printfString(data, format, str == NULL ? "(null)" : str);
  52. }
  53. int printf_m(struct printf_data* data, struct printf_format_params* format, va_list args)
  54. {
  55. (void) args;
  56. return printfString(data, format, strerror(errno));
  57. }