#include "ft_printf_internal.h" int consumeFlags(struct printf_data* params) { int flags; int status; status = 1; flags = 0; while (*params->inputBuffer && status) { if (*params->inputBuffer == '#') flags |= PRINTF_FLAG_ALTERNATE_FORM; else if (*params->inputBuffer == '0') flags |= PRINTF_FLAG_ZERO_PAD; else if (*params->inputBuffer == '-') flags |= PRINTF_FLAG_LEFT_PADDING; else if (*params->inputBuffer == ' ') flags |= PRINTF_FLAG_SIGNED_PAD; else if (*params->inputBuffer == '+') flags |= PRINTF_FLAG_SIGNED_SIGN; else if (*params->inputBuffer == '\'') flags |= PRINTF_FLAG_THD_GROUP; else status = 0; if (status) params->inputBuffer++; } return flags; } int consumeNumber(struct printf_data* params) { int result; result = 0; while (*params->inputBuffer >= '0' && *params->inputBuffer <= '9') { result = result * 10 + (*params->inputBuffer - '0'); params->inputBuffer++; } return result; } printf_typeName consumeTypename(struct printf_data* data) { if (*data->inputBuffer == '%') return printf_percent; if (*data->inputBuffer == 'd' || *data->inputBuffer == 'i') return printf_di; if (*data->inputBuffer == 'u') return printf_u; if (*data->inputBuffer == 'o') return printf_o; if (*data->inputBuffer == 'x') return printf_x; if (*data->inputBuffer == 'X') return printf_X; if (*data->inputBuffer == 'c') return printf_c; if (*data->inputBuffer == 'p') return printf_p; if (*data->inputBuffer == 'n') return printf_n; if (*data->inputBuffer == 'm') return printf_m; if (*data->inputBuffer == 's') return printf_s; if (*data->inputBuffer == 'f') return printf_f; if (*data->inputBuffer == 'F') return printf_F; if (*data->inputBuffer == 'a') return printf_a; if (*data->inputBuffer == 'A') return printf_A; return NULL; } int expandParams(struct printf_data* params, va_list args) { struct printf_format_params format; char* buffer = params->inputBuffer; format.flags = consumeFlags(params); format.width = -1; format.precision = -1; if (*params->inputBuffer >= '0' && *params->inputBuffer <= '9') format.width = consumeNumber(params); if (*params->inputBuffer == '.') { ++params->inputBuffer; format.precision = consumeNumber(params); } /* LENGTH MODIFIERS NOT SUPPORTED */ format.typeName = consumeTypename(params); if (format.typeName) { params->inputBuffer++; return format.typeName(params, &format, args); } params->inputBuffer = buffer; return printf_percent(params, &format, args); }