pf_take_inf.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* pf_take_inf.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/02/27 00:23:20 by bchanot #+# #+# */
  9. /* Updated: 2016/08/21 04:20:17 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "libftprintf.h"
  13. static char g_type[] = {
  14. '%', 's', 'S', 'p', 'd', 'D', 'i', 'o', 'O', 'u', 'U',
  15. 'x', 'X', 'c', 'C', 'b', 0};
  16. static void take_flag(char **s, t_inf *inf)
  17. {
  18. while (**s == '#' || **s == '0' || **s == '-' || **s == '+' || **s == ' ' \
  19. || **s == 'l' || **s == 'h' || **s == 'j' || **s == 'z')
  20. {
  21. if (**s == '+')
  22. inf->plus = 1;
  23. if (**s == '0')
  24. inf->zero = 1;
  25. if (**s == '#')
  26. inf->di = 1;
  27. if (**s == ' ')
  28. inf->space = 1;
  29. if (**s == '-')
  30. inf->min = 1;
  31. if (!pf_more_flag(s, inf))
  32. *s += 1;
  33. inf->flag++;
  34. }
  35. }
  36. static int take_width(char **s, t_inf *inf, va_list ap)
  37. {
  38. if (**s == '*')
  39. {
  40. inf->width = va_arg(ap, int);
  41. if (inf->width < 0)
  42. {
  43. inf->min = 1;
  44. inf->width = -inf->width;
  45. }
  46. *s += 1;
  47. }
  48. else if (**s >= '0' && **s <= '9')
  49. {
  50. inf->width = 0;
  51. while (ft_isdigit(**s))
  52. {
  53. inf->width = inf->width * 10 + **s - '0';
  54. *s += 1;
  55. }
  56. }
  57. return (1);
  58. }
  59. static int take_type(char *s, t_inf *inf)
  60. {
  61. int i;
  62. i = -1;
  63. while (g_type[++i])
  64. {
  65. if (g_type[i] == *s)
  66. {
  67. inf->type = i;
  68. return (1);
  69. }
  70. }
  71. inf->type = -1;
  72. return (0);
  73. }
  74. t_inf pf_take_inf(char **s, va_list ap, int fd)
  75. {
  76. t_inf inf;
  77. ft_bzero(&inf, sizeof(inf));
  78. inf.fd = fd;
  79. take_flag(s, &inf);
  80. if (**s == '*' || (ft_isdigit(**s) && **s != '0'))
  81. take_width(s, &inf, ap);
  82. if (**s == '.')
  83. take_prec(s, &inf, ap, 0);
  84. if (take_type(*s, &inf))
  85. *s += 1;
  86. return (inf);
  87. }