diff --git a/ChangeLog b/ChangeLog index 0d753b8..73a6786 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * include/kernaux/printf_fmt.h: Auxiliary API moved to a separate module * include/kernaux/printf_fmt.h: Add function to parse type + * include/kernaux/printf_fmt.h: Don't pass unnecessary format param 2022-05-24 Alex Kotov diff --git a/examples/printf_fmt.c b/examples/printf_fmt.c index 252abbb..a19502c 100644 --- a/examples/printf_fmt.c +++ b/examples/printf_fmt.c @@ -10,10 +10,10 @@ int main() struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); KernAux_PrintfFmt_Spec_eval_flags(&spec, &format); if (KernAux_PrintfFmt_Spec_eval_width1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_width2(&spec, &format, 0); + KernAux_PrintfFmt_Spec_eval_width2(&spec, 0); } if (KernAux_PrintfFmt_Spec_eval_precision1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_precision2(&spec, &format, 0); + KernAux_PrintfFmt_Spec_eval_precision2(&spec, 0); } KernAux_PrintfFmt_Spec_eval_length(&spec, &format); KernAux_PrintfFmt_Spec_eval_type(&spec, &format); @@ -37,10 +37,10 @@ int main() struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); KernAux_PrintfFmt_Spec_eval_flags(&spec, &format); if (KernAux_PrintfFmt_Spec_eval_width1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_width2(&spec, &format, 12); + KernAux_PrintfFmt_Spec_eval_width2(&spec, 12); } if (KernAux_PrintfFmt_Spec_eval_precision1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_precision2(&spec, &format, 34); + KernAux_PrintfFmt_Spec_eval_precision2(&spec, 34); } KernAux_PrintfFmt_Spec_eval_length(&spec, &format); KernAux_PrintfFmt_Spec_eval_type(&spec, &format); diff --git a/include/kernaux/printf_fmt.h b/include/kernaux/printf_fmt.h index d3cc761..e1a01fd 100644 --- a/include/kernaux/printf_fmt.h +++ b/include/kernaux/printf_fmt.h @@ -48,9 +48,9 @@ void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *spec); void KernAux_PrintfFmt_Spec_eval_flags(struct KernAux_PrintfFmt_Spec *spec, const char **format); bool KernAux_PrintfFmt_Spec_eval_width1(struct KernAux_PrintfFmt_Spec *spec, const char **format); -void KernAux_PrintfFmt_Spec_eval_width2(struct KernAux_PrintfFmt_Spec *spec, const char **format, int width); +void KernAux_PrintfFmt_Spec_eval_width2(struct KernAux_PrintfFmt_Spec *spec, int width); bool KernAux_PrintfFmt_Spec_eval_precision1(struct KernAux_PrintfFmt_Spec *spec, const char **format); -void KernAux_PrintfFmt_Spec_eval_precision2(struct KernAux_PrintfFmt_Spec *spec, const char **format, int precision); +void KernAux_PrintfFmt_Spec_eval_precision2(struct KernAux_PrintfFmt_Spec *spec, int precision); void KernAux_PrintfFmt_Spec_eval_length(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_eval_type(struct KernAux_PrintfFmt_Spec *spec, const char **format); diff --git a/src/printf.c b/src/printf.c index fbf3646..e2a3fa0 100644 --- a/src/printf.c +++ b/src/printf.c @@ -156,11 +156,11 @@ int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* KernAux_PrintfFmt_Spec_eval_flags(&spec, &format); if (KernAux_PrintfFmt_Spec_eval_width1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_width2(&spec, &format, va_arg(va, int)); + KernAux_PrintfFmt_Spec_eval_width2(&spec, va_arg(va, int)); } if (KernAux_PrintfFmt_Spec_eval_precision1(&spec, &format)) { - KernAux_PrintfFmt_Spec_eval_precision2(&spec, &format, va_arg(va, int)); + KernAux_PrintfFmt_Spec_eval_precision2(&spec, va_arg(va, int)); } KernAux_PrintfFmt_Spec_eval_length(&spec, &format); diff --git a/src/printf_fmt.c b/src/printf_fmt.c index f23be06..fc4a88b 100644 --- a/src/printf_fmt.c +++ b/src/printf_fmt.c @@ -63,16 +63,17 @@ bool KernAux_PrintfFmt_Spec_eval_width1(struct KernAux_PrintfFmt_Spec *const spe if (isdigit(**format)) { spec->width = _atoi(format); return false; + } else if (**format == '*') { + ++(*format); + return true; } else { - return **format == '*'; + return false; } } -void KernAux_PrintfFmt_Spec_eval_width2(struct KernAux_PrintfFmt_Spec *const spec, const char **const format, const int width) +void KernAux_PrintfFmt_Spec_eval_width2(struct KernAux_PrintfFmt_Spec *const spec, const int width) { KERNAUX_NOTNULL_RETURN(spec); - KERNAUX_NOTNULL_RETURN(format); - KERNAUX_NOTNULL_RETURN(*format); if (width < 0) { spec->flags |= KERNAUX_PRINTF_FMT_FLAGS_LEFT; // reverse padding @@ -80,8 +81,6 @@ void KernAux_PrintfFmt_Spec_eval_width2(struct KernAux_PrintfFmt_Spec *const spe } else { spec->width = (unsigned int)width; } - - ++(*format); } bool KernAux_PrintfFmt_Spec_eval_precision1(struct KernAux_PrintfFmt_Spec *const spec, const char **const format) @@ -96,22 +95,22 @@ bool KernAux_PrintfFmt_Spec_eval_precision1(struct KernAux_PrintfFmt_Spec *const if (isdigit(**format)) { spec->precision = _atoi(format); return false; + } else if (**format == '*') { + ++(*format); + return true; } else { - return **format == '*'; + return false; } } else { return false; } } -void KernAux_PrintfFmt_Spec_eval_precision2(struct KernAux_PrintfFmt_Spec *const spec, const char **const format, const int precision) +void KernAux_PrintfFmt_Spec_eval_precision2(struct KernAux_PrintfFmt_Spec *const spec, const int precision) { KERNAUX_NOTNULL_RETURN(spec); - KERNAUX_NOTNULL_RETURN(format); - KERNAUX_NOTNULL_RETURN(*format); spec->precision = precision > 0 ? (unsigned int)precision : 0u; - ++(*format); } void KernAux_PrintfFmt_Spec_eval_length(struct KernAux_PrintfFmt_Spec *const spec, const char **const format)