pf_d_up.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* pf_d_up.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/02/27 01:52:31 by bchanot #+# #+# */
  9. /* Updated: 2018/10/14 03:44:36 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "libftprintf.h"
  13. static int pf_width_d(long long int nb, t_inf inf, int len)
  14. {
  15. if (nb < 0)
  16. if (len < inf.width - (inf.prec >= (int)ft_nbrlen(nb) ?
  17. inf.prec + 1 : (int)ft_nbrlen(nb)))
  18. return (true);
  19. if (nb >= 0)
  20. if (len < inf.width - (inf.prec >= (int)ft_nbrlen(nb) ?
  21. inf.prec : (int)ft_nbrlen(nb)))
  22. return (true);
  23. return (false);
  24. }
  25. static int pf_d_up2(t_int64 nb, int len, int min, t_inf inf)
  26. {
  27. int i;
  28. i = -1;
  29. if (inf.width > 0 && inf.min == 0)
  30. while (pf_width_d(nb, inf, len) && len++ >= 0)
  31. ft_putchar_fd((inf.zero == 1 && inf.prec == 0 ? '0' : ' '), inf.fd);
  32. if (inf.plus && nb >= 0 && !min && inf.prec >= 0 && inf.done == 0)
  33. ft_putchar_fd('+', inf.fd);
  34. else if (inf.space == 1 && nb >= 0 && !min && inf.done == 0)
  35. ft_putchar_fd(' ', inf.fd);
  36. if (nb < 0 && nb != -9223372036854775807 - 1 && len++ >= 0)
  37. {
  38. ft_putchar_fd('-', inf.fd);
  39. nb = -nb;
  40. }
  41. while (++i < inf.prec - (int)ft_nbrlen(nb) && len++ >= 0)
  42. ft_putchar_fd('0', inf.fd);
  43. ft_putnbr_fd(nb, inf.fd);
  44. len += ft_nbrlen(nb);
  45. if (inf.width > 0 && inf.min == 1)
  46. while (len < inf.width && len++ >= 0)
  47. ft_putchar_fd(' ', inf.fd);
  48. return (len);
  49. }
  50. int pf_d_up(va_list ap, t_inf inf)
  51. {
  52. long long int nb;
  53. int len;
  54. int min;
  55. nb = va_arg(ap, long long int);
  56. min = 0;
  57. len = ((inf.space == 1 || inf.plus == 1) && nb >= 0) ? 1 : 0;
  58. if (inf.zero == 1 && nb < 0 && inf.prec == 0 &&
  59. nb != -9223372036854775807 - 1 && len++ >= 0 && ++min == 1)
  60. {
  61. ft_putchar_fd('-', inf.fd);
  62. nb = -nb;
  63. }
  64. pf_do_if(&inf, nb, min);
  65. return (pf_d_up2(nb, len, min, inf));
  66. }