printfParams.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "ft_printf_internal.h"
  2. int consumeFlags(struct printf_data* params)
  3. {
  4. int flags;
  5. int status;
  6. status = 1;
  7. flags = 0;
  8. while (*params->inputBuffer && status)
  9. {
  10. if (*params->inputBuffer == '#')
  11. flags |= PRINTF_FLAG_ALTERNATE_FORM;
  12. else if (*params->inputBuffer == '0')
  13. flags |= PRINTF_FLAG_ZERO_PAD;
  14. else if (*params->inputBuffer == '-')
  15. flags |= PRINTF_FLAG_LEFT_PADDING;
  16. else if (*params->inputBuffer == ' ')
  17. flags |= PRINTF_FLAG_SIGNED_PAD;
  18. else if (*params->inputBuffer == '+')
  19. flags |= PRINTF_FLAG_SIGNED_SIGN;
  20. else if (*params->inputBuffer == '\'')
  21. flags |= PRINTF_FLAG_THD_GROUP;
  22. else
  23. status = 0;
  24. if (status)
  25. params->inputBuffer++;
  26. }
  27. return flags;
  28. }
  29. int consumeNumber(struct printf_data* params)
  30. {
  31. int result;
  32. result = 0;
  33. while (*params->inputBuffer >= '0' && *params->inputBuffer <= '9')
  34. {
  35. result = result * 10 + (*params->inputBuffer - '0');
  36. params->inputBuffer++;
  37. }
  38. return result;
  39. }
  40. printf_typeName consumeTypename(struct printf_data* data)
  41. {
  42. if (*data->inputBuffer == '%')
  43. return printf_percent;
  44. if (*data->inputBuffer == 'd' || *data->inputBuffer == 'i')
  45. return printf_di;
  46. if (*data->inputBuffer == 'u')
  47. return printf_u;
  48. if (*data->inputBuffer == 'o')
  49. return printf_o;
  50. if (*data->inputBuffer == 'x')
  51. return printf_x;
  52. if (*data->inputBuffer == 'X')
  53. return printf_X;
  54. if (*data->inputBuffer == 'c')
  55. return printf_c;
  56. if (*data->inputBuffer == 'p')
  57. return printf_p;
  58. if (*data->inputBuffer == 'n')
  59. return printf_n;
  60. if (*data->inputBuffer == 'm')
  61. return printf_m;
  62. if (*data->inputBuffer == 's')
  63. return printf_s;
  64. if (*data->inputBuffer == 'f')
  65. return printf_f;
  66. if (*data->inputBuffer == 'F')
  67. return printf_F;
  68. if (*data->inputBuffer == 'a')
  69. return printf_a;
  70. if (*data->inputBuffer == 'A')
  71. return printf_A;
  72. return NULL;
  73. }
  74. int expandParams(struct printf_data* params, va_list args)
  75. {
  76. struct printf_format_params format;
  77. char* buffer = params->inputBuffer;
  78. format.flags = consumeFlags(params);
  79. format.width = -1;
  80. format.precision = -1;
  81. if (*params->inputBuffer >= '0' && *params->inputBuffer <= '9')
  82. format.width = consumeNumber(params);
  83. if (*params->inputBuffer == '.')
  84. {
  85. ++params->inputBuffer;
  86. format.precision = consumeNumber(params);
  87. }
  88. /* LENGTH MODIFIERS NOT SUPPORTED */
  89. format.typeName = consumeTypename(params);
  90. if (format.typeName)
  91. {
  92. params->inputBuffer++;
  93. return format.typeName(params, &format, args);
  94. }
  95. params->inputBuffer = buffer;
  96. return printf_percent(params, &format, args);
  97. }