diff --git a/examples/printf_fmt.c b/examples/printf_fmt.c index 25b590c..fca399e 100644 --- a/examples/printf_fmt.c +++ b/examples/printf_fmt.c @@ -9,11 +9,7 @@ int main() struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); - KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); - KernAux_PrintfFmt_Spec_parse_width(&spec, &format); - KernAux_PrintfFmt_Spec_parse_precision(&spec, &format); - KernAux_PrintfFmt_Spec_parse_length(&spec, &format); - KernAux_PrintfFmt_Spec_parse_type(&spec, &format); + format = KernAux_PrintfFmt_Spec_parse(&spec, format); if (spec.set_width) { // Actually this line won't be executed. @@ -36,6 +32,7 @@ int main() struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); + // Parsing of each part may be done separately. KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); KernAux_PrintfFmt_Spec_parse_width(&spec, &format); KernAux_PrintfFmt_Spec_parse_precision(&spec, &format); @@ -65,15 +62,12 @@ int main() } { - const char *format = " *.*ld"; + const char *const format = " *.*ld"; struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); - KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); - KernAux_PrintfFmt_Spec_parse_width(&spec, &format); - KernAux_PrintfFmt_Spec_parse_precision(&spec, &format); - KernAux_PrintfFmt_Spec_parse_length(&spec, &format); - KernAux_PrintfFmt_Spec_parse_type(&spec, &format); + // Returning value may be ignored. + KernAux_PrintfFmt_Spec_parse(&spec, format); if (spec.set_width) { KernAux_PrintfFmt_Spec_set_width(&spec, 12); diff --git a/include/kernaux/printf_fmt.h b/include/kernaux/printf_fmt.h index 5c65f7f..7a48c7c 100644 --- a/include/kernaux/printf_fmt.h +++ b/include/kernaux/printf_fmt.h @@ -48,6 +48,8 @@ struct KernAux_PrintfFmt_Spec { struct KernAux_PrintfFmt_Spec KernAux_PrintfFmt_Spec_create(); void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *spec); +const char *KernAux_PrintfFmt_Spec_parse(struct KernAux_PrintfFmt_Spec *spec, const char *format); + void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_width(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_precision(struct KernAux_PrintfFmt_Spec *spec, const char **format); diff --git a/pkgs/ruby/ext/default/extconf.rb b/pkgs/ruby/ext/default/extconf.rb index 08ee336..710cbf7 100644 --- a/pkgs/ruby/ext/default/extconf.rb +++ b/pkgs/ruby/ext/default/extconf.rb @@ -22,11 +22,7 @@ have_func 'kernaux_snprintf' # TODO: do something if not found? have_func 'KernAux_PrintfFmt_Spec_create' -have_func 'KernAux_PrintfFmt_Spec_parse_flags' -have_func 'KernAux_PrintfFmt_Spec_parse_width' -have_func 'KernAux_PrintfFmt_Spec_parse_precision' -have_func 'KernAux_PrintfFmt_Spec_parse_length' -have_func 'KernAux_PrintfFmt_Spec_parse_type' +have_func 'KernAux_PrintfFmt_Spec_parse' have_func 'KernAux_PrintfFmt_Spec_set_width' have_func 'KernAux_PrintfFmt_Spec_set_precision' diff --git a/pkgs/ruby/ext/default/printf.c b/pkgs/ruby/ext/default/printf.c index 78f4114..314bf04 100644 --- a/pkgs/ruby/ext/default/printf.c +++ b/pkgs/ruby/ext/default/printf.c @@ -42,11 +42,8 @@ VALUE rb_KernAux_snprintf1( if (*(fmt++) != '%') rb_raise(rb_eArgError, "invalid format"); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); - KernAux_PrintfFmt_Spec_parse_flags(&spec, &fmt); - KernAux_PrintfFmt_Spec_parse_width(&spec, &fmt); - KernAux_PrintfFmt_Spec_parse_precision(&spec, &fmt); - KernAux_PrintfFmt_Spec_parse_length(&spec, &fmt); - KernAux_PrintfFmt_Spec_parse_type(&spec, &fmt); + + fmt = KernAux_PrintfFmt_Spec_parse(&spec, fmt); while (*fmt) { if (*(fmt++) == '%') rb_raise(rb_eArgError, "invalid format"); diff --git a/src/printf.c b/src/printf.c index 423321b..677b62e 100644 --- a/src/printf.c +++ b/src/printf.c @@ -153,11 +153,7 @@ int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); - KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); - KernAux_PrintfFmt_Spec_parse_width(&spec, &format); - KernAux_PrintfFmt_Spec_parse_precision(&spec, &format); - KernAux_PrintfFmt_Spec_parse_length(&spec, &format); - KernAux_PrintfFmt_Spec_parse_type(&spec, &format); + format = KernAux_PrintfFmt_Spec_parse(&spec, format); if (spec.set_width) { KernAux_PrintfFmt_Spec_set_width(&spec, va_arg(va, int)); diff --git a/src/printf_fmt.c b/src/printf_fmt.c index 3ab2746..8e95fbd 100644 --- a/src/printf_fmt.c +++ b/src/printf_fmt.c @@ -37,6 +37,20 @@ void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *const spec) spec->set_precision = false; } +const char *KernAux_PrintfFmt_Spec_parse(struct KernAux_PrintfFmt_Spec *spec, const char *format) +{ + KERNAUX_NOTNULL_RETVAL(spec, NULL); + KERNAUX_NOTNULL_RETVAL(format, NULL); + + KernAux_PrintfFmt_Spec_parse_flags(spec, &format); + KernAux_PrintfFmt_Spec_parse_width(spec, &format); + KernAux_PrintfFmt_Spec_parse_precision(spec, &format); + KernAux_PrintfFmt_Spec_parse_length(spec, &format); + KernAux_PrintfFmt_Spec_parse_type(spec, &format); + + return format; +} + void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *const spec, const char **const format) { KERNAUX_NOTNULL_RETURN(spec); diff --git a/tests/printf_fmt_gen.jinja b/tests/printf_fmt_gen.jinja index f1f2777..90cc611 100644 --- a/tests/printf_fmt_gen.jinja +++ b/tests/printf_fmt_gen.jinja @@ -10,15 +10,11 @@ int main() { {% for case in cases %} { - const char *format = {{ escape_str(case.in.format) }}; + const char *const format = {{ escape_str(case.in.format) }}; struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); - KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); - KernAux_PrintfFmt_Spec_parse_width(&spec, &format); - KernAux_PrintfFmt_Spec_parse_precision(&spec, &format); - KernAux_PrintfFmt_Spec_parse_length(&spec, &format); - KernAux_PrintfFmt_Spec_parse_type(&spec, &format); + KernAux_PrintfFmt_Spec_parse(&spec, format); if (spec.set_width) { KernAux_PrintfFmt_Spec_set_width(&spec, {{ none_to_zero(case.in.width) }});