diff --git a/.gitignore b/.gitignore index f1ce322..d9cd26d 100644 --- a/.gitignore +++ b/.gitignore @@ -96,6 +96,7 @@ /examples/panic_simple /examples/pfa /examples/printf +/examples/printf_fmt /examples/printf_va /examples/snprintf /examples/snprintf_va diff --git a/Makefile.am b/Makefile.am index 8fe212a..11ff0de 100644 --- a/Makefile.am +++ b/Makefile.am @@ -140,6 +140,9 @@ endif if WITH_PRINTF_FMT libkernaux_a_SOURCES += src/printf_fmt.c +if ENABLE_TESTS +TESTS += examples/printf_fmt +endif endif if WITH_UNITS @@ -179,6 +182,10 @@ examples_printf_SOURCES = \ $(libkernaux_a_SOURCES) \ examples/printf.c +examples_printf_fmt_SOURCES = \ + $(libkernaux_a_SOURCES) \ + examples/printf_fmt.c + examples_printf_va_SOURCES = \ $(libkernaux_a_SOURCES) \ examples/printf_va.c diff --git a/README.md b/README.md index be235cd..63fe73f 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ zero). Work-in-progress APIs can change at any time. * [To human](/examples/units_human.c) * [printf format parser](/include/kernaux/printf_fmt.h) * Code from [https://github.com/mpaland/printf](https://github.com/mpaland/printf). Thank you! + * [Example](/examples/printf_fmt.c) * Usual functions * [libc replacement](/include/kernaux/libc.h) (*stable since* **0.1.0**) * [itoa/ftoa replacement](/include/kernaux/ntoa.h) (*stable since* **0.1.0**) diff --git a/examples/printf_fmt.c b/examples/printf_fmt.c new file mode 100644 index 0000000..252abbb --- /dev/null +++ b/examples/printf_fmt.c @@ -0,0 +1,63 @@ +#include + +#include + +int main() +{ + { + const char *format = "012.34f"; + + 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); + } + if (KernAux_PrintfFmt_Spec_eval_precision1(&spec, &format)) { + KernAux_PrintfFmt_Spec_eval_precision2(&spec, &format, 0); + } + KernAux_PrintfFmt_Spec_eval_length(&spec, &format); + KernAux_PrintfFmt_Spec_eval_type(&spec, &format); + + assert( + spec.flags == + ( + KERNAUX_PRINTF_FMT_FLAGS_ZEROPAD | + KERNAUX_PRINTF_FMT_FLAGS_PRECISION + ) + ); + assert(spec.width == 12); + assert(spec.precision == 34); + assert(spec.type == KERNAUX_PRINTF_FMT_TYPE_FLOAT); + assert(spec.base == 0); + } + + { + const char *format = " *.*ld"; + + 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); + } + if (KernAux_PrintfFmt_Spec_eval_precision1(&spec, &format)) { + KernAux_PrintfFmt_Spec_eval_precision2(&spec, &format, 34); + } + KernAux_PrintfFmt_Spec_eval_length(&spec, &format); + KernAux_PrintfFmt_Spec_eval_type(&spec, &format); + + assert( + spec.flags == + ( + KERNAUX_PRINTF_FMT_FLAGS_SPACE | + KERNAUX_PRINTF_FMT_FLAGS_LONG | + KERNAUX_PRINTF_FMT_FLAGS_PRECISION + ) + ); + assert(spec.width == 12); + assert(spec.precision == 34); + assert(spec.type == KERNAUX_PRINTF_FMT_TYPE_INT); + assert(spec.base == 10); + } + + return 0; +}