pf_di.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* pf_di.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/02/27 01:52:57 by bchanot #+# #+# */
  9. /* Updated: 2018/10/14 03:43:59 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "libftprintf.h"
  13. void pf_do_if(t_inf *inf, long long int nb, int min)
  14. {
  15. if (inf->plus && inf->prec == -1 && nb > 0 && inf->width && inf->zero)
  16. {
  17. inf->zero = 0;
  18. inf->prec = 0;
  19. }
  20. if (inf->space && inf->plus)
  21. inf->space = 0;
  22. if (inf->zero == 1 && (inf->plus || inf->space) && nb >= 0 &&
  23. min == 0 && inf->prec <= 0)
  24. {
  25. ft_putchar_fd((inf->space ? ' ' : '+'), inf->fd);
  26. inf->done = 1;
  27. }
  28. }
  29. static int pf_width_di(long int nb, t_inf inf, int len)
  30. {
  31. int i;
  32. i = nb == 0 && inf.prec == -1 ? 0 : ft_nbrlen(nb);
  33. if (nb < 0)
  34. {
  35. if (len < inf.width - (inf.prec >= i ? inf.prec + 1 : i))
  36. return (true);
  37. }
  38. else if (len < inf.width - (inf.prec >= i ? inf.prec : i))
  39. return (true);
  40. return (false);
  41. }
  42. static int pf_di2(long int nb, int len, int min, t_inf inf)
  43. {
  44. int i;
  45. i = -1;
  46. if (inf.width > 0 && inf.min == 0)
  47. while (pf_width_di(nb, inf, len) && len++ >= 0)
  48. ft_putchar_fd((inf.zero == 1 && inf.prec == 0 ? '0' : ' '), inf.fd);
  49. if (inf.plus && nb >= 0 && !min && inf.prec >= 0 && inf.done == 0)
  50. ft_putchar_fd('+', inf.fd);
  51. else if (inf.space == 1 && nb >= 0 && !min && inf.done == 0)
  52. ft_putchar_fd(' ', inf.fd);
  53. if (nb < 0 && len++ >= 0)
  54. {
  55. ft_putchar_fd('-', inf.fd);
  56. nb = -nb;
  57. }
  58. while (++i < inf.prec - (int)ft_nbrlen(nb) && len++ >= 0)
  59. ft_putchar_fd('0', inf.fd);
  60. ft_putnbr_fd(nb, inf.fd);
  61. len += ft_nbrlen(nb);
  62. if (inf.width > 0 && inf.min == 1)
  63. while (len < inf.width && len++ >= 0)
  64. ft_putchar_fd(' ', inf.fd);
  65. return (len);
  66. }
  67. int pf_di(va_list ap, t_inf inf)
  68. {
  69. long int nb;
  70. int len;
  71. int min;
  72. if (inf.l || inf.ll || inf.z || inf.j)
  73. return (pf_d_up(ap, inf));
  74. if (inf.hh)
  75. nb = (char)va_arg(ap, int);
  76. else
  77. nb = inf.h ? (short)va_arg(ap, int) : va_arg(ap, int);
  78. min = 0;
  79. len = (inf.plus || inf.space) && nb >= 0 ? 1 : 0;
  80. if (inf.zero == 1 && nb < 0 && inf.prec == 0)
  81. {
  82. ft_putchar_fd('-', inf.fd);
  83. nb = -nb;
  84. min = 1;
  85. len++;
  86. }
  87. pf_do_if(&inf, nb, min);
  88. return (pf_di2(nb, len, min, inf));
  89. }