1
0
Fork 0
mirror of https://github.com/tailix/libkernaux.git synced 2026-08-15 11:00:07 -04:00

Main: include/kernaux/printf_fmt.h: Change API

This commit is contained in:
Alex Kotov 2022-05-28 12:08:48 +03:00
parent 81b6109031
commit 11e9c24784
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08
7 changed files with 73 additions and 54 deletions

View file

@ -1,6 +1,6 @@
2022-05-28 Alex Kotov <kotovalexarian@gmail.com> 2022-05-28 Alex Kotov <kotovalexarian@gmail.com>
* include/kernaux/printf_fmt.h: Rename functions * include/kernaux/printf_fmt.h: Change API
2022-05-24 Alex Kotov <kotovalexarian@gmail.com> 2022-05-24 Alex Kotov <kotovalexarian@gmail.com>

View file

@ -8,17 +8,21 @@ int main()
const char *format = "s"; const char *format = "s";
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
if (KernAux_PrintfFmt_Spec_parse_width(&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);
if (spec.set_width) {
// Actually this line won't be executed. // Actually this line won't be executed.
KernAux_PrintfFmt_Spec_set_width(&spec, 0); KernAux_PrintfFmt_Spec_set_width(&spec, 0);
} }
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) { if (spec.set_precision) {
// Actually this line won't be executed. // Actually this line won't be executed.
KernAux_PrintfFmt_Spec_set_precision(&spec, 0); KernAux_PrintfFmt_Spec_set_precision(&spec, 0);
} }
KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
assert(spec.flags == 0); assert(spec.flags == 0);
assert(spec.width == 0); assert(spec.width == 0);
@ -31,17 +35,21 @@ int main()
const char *format = "012.34f"; const char *format = "012.34f";
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
if (KernAux_PrintfFmt_Spec_parse_width(&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);
if (spec.set_width) {
// Actually this line won't be executed. // Actually this line won't be executed.
KernAux_PrintfFmt_Spec_set_width(&spec, 0); KernAux_PrintfFmt_Spec_set_width(&spec, 0);
} }
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) { if (spec.set_precision) {
// Actually this line won't be executed. // Actually this line won't be executed.
KernAux_PrintfFmt_Spec_set_precision(&spec, 0); KernAux_PrintfFmt_Spec_set_precision(&spec, 0);
} }
KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
assert( assert(
spec.flags == spec.flags ==
@ -60,16 +68,20 @@ int main()
const char *format = " *.*ld"; const char *format = " *.*ld";
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
if (KernAux_PrintfFmt_Spec_parse_width(&spec, &format)) { KernAux_PrintfFmt_Spec_parse_width(&spec, &format);
KernAux_PrintfFmt_Spec_set_width(&spec, 12); KernAux_PrintfFmt_Spec_parse_precision(&spec, &format);
}
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
KernAux_PrintfFmt_Spec_set_precision(&spec, 34);
}
KernAux_PrintfFmt_Spec_parse_length(&spec, &format); KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
KernAux_PrintfFmt_Spec_parse_type(&spec, &format); KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
if (spec.set_width) {
KernAux_PrintfFmt_Spec_set_width(&spec, 12);
}
if (spec.set_precision) {
KernAux_PrintfFmt_Spec_set_precision(&spec, 34);
}
assert( assert(
spec.flags == spec.flags ==
( (

View file

@ -39,16 +39,18 @@ struct KernAux_PrintfFmt_Spec {
unsigned int width; unsigned int width;
unsigned int precision; unsigned int precision;
enum KernAux_PrintfFmt_Type type; enum KernAux_PrintfFmt_Type type;
unsigned int base; unsigned int base;
bool set_width;
bool set_precision;
}; };
struct KernAux_PrintfFmt_Spec KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec KernAux_PrintfFmt_Spec_create();
void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *spec); void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *spec);
void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *spec, const char **format);
bool KernAux_PrintfFmt_Spec_parse_width(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_width(struct KernAux_PrintfFmt_Spec *spec, const char **format);
bool KernAux_PrintfFmt_Spec_parse_precision(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_precision(struct KernAux_PrintfFmt_Spec *spec, const char **format);
void KernAux_PrintfFmt_Spec_parse_length(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_length(struct KernAux_PrintfFmt_Spec *spec, const char **format);
void KernAux_PrintfFmt_Spec_parse_type(struct KernAux_PrintfFmt_Spec *spec, const char **format); void KernAux_PrintfFmt_Spec_parse_type(struct KernAux_PrintfFmt_Spec *spec, const char **format);

View file

@ -43,8 +43,8 @@ VALUE rb_KernAux_snprintf1(
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &fmt); KernAux_PrintfFmt_Spec_parse_flags(&spec, &fmt);
const bool has_width = KernAux_PrintfFmt_Spec_parse_width(&spec, &fmt); KernAux_PrintfFmt_Spec_parse_width(&spec, &fmt);
const bool has_precision = KernAux_PrintfFmt_Spec_parse_precision(&spec, &fmt); KernAux_PrintfFmt_Spec_parse_precision(&spec, &fmt);
KernAux_PrintfFmt_Spec_parse_length(&spec, &fmt); KernAux_PrintfFmt_Spec_parse_length(&spec, &fmt);
KernAux_PrintfFmt_Spec_parse_type(&spec, &fmt); KernAux_PrintfFmt_Spec_parse_type(&spec, &fmt);
@ -53,10 +53,10 @@ VALUE rb_KernAux_snprintf1(
} }
int arg_index = 2; int arg_index = 2;
if (has_width && argc > arg_index) { if (spec.set_width && argc > arg_index) {
KernAux_PrintfFmt_Spec_set_width(&spec, NUM2INT(argv_rb[arg_index++])); KernAux_PrintfFmt_Spec_set_width(&spec, NUM2INT(argv_rb[arg_index++]));
} }
if (has_precision && argc > arg_index) { if (spec.set_precision && argc > arg_index) {
KernAux_PrintfFmt_Spec_set_precision(&spec, NUM2INT(argv_rb[arg_index++])); KernAux_PrintfFmt_Spec_set_precision(&spec, NUM2INT(argv_rb[arg_index++]));
} }
@ -88,8 +88,8 @@ VALUE rb_KernAux_snprintf1(
if (!str) rb_raise(rb_eNoMemError, "snprintf1 buffer malloc"); if (!str) rb_raise(rb_eNoMemError, "snprintf1 buffer malloc");
int slen; int slen;
if (has_width) { if (spec.set_width) {
if (has_precision) { if (spec.set_precision) {
slen = dynarg.use_dbl slen = dynarg.use_dbl
? kernaux_snprintf(str, size, format, spec.width, spec.precision, dynarg.dbl) ? kernaux_snprintf(str, size, format, spec.width, spec.precision, dynarg.dbl)
: kernaux_snprintf(str, size, format, spec.width, spec.precision, dynarg.arg); : kernaux_snprintf(str, size, format, spec.width, spec.precision, dynarg.arg);
@ -99,7 +99,7 @@ VALUE rb_KernAux_snprintf1(
: kernaux_snprintf(str, size, format, spec.width, dynarg.arg); : kernaux_snprintf(str, size, format, spec.width, dynarg.arg);
} }
} else { } else {
if (has_precision) { if (spec.set_precision) {
slen = dynarg.use_dbl slen = dynarg.use_dbl
? kernaux_snprintf(str, size, format, spec.precision, dynarg.dbl) ? kernaux_snprintf(str, size, format, spec.precision, dynarg.dbl)
: kernaux_snprintf(str, size, format, spec.precision, dynarg.arg); : kernaux_snprintf(str, size, format, spec.precision, dynarg.arg);

View file

@ -154,19 +154,18 @@ int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char*
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); 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);
if (KernAux_PrintfFmt_Spec_parse_width(&spec, &format)) { if (spec.set_width) {
KernAux_PrintfFmt_Spec_set_width(&spec, va_arg(va, int)); KernAux_PrintfFmt_Spec_set_width(&spec, va_arg(va, int));
} }
if (spec.set_precision) {
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
KernAux_PrintfFmt_Spec_set_precision(&spec, va_arg(va, int)); KernAux_PrintfFmt_Spec_set_precision(&spec, va_arg(va, int));
} }
KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
// evaluate specifier // evaluate specifier
switch (spec.type) { switch (spec.type) {
case KERNAUX_PRINTF_FMT_TYPE_INT: case KERNAUX_PRINTF_FMT_TYPE_INT:

View file

@ -31,8 +31,10 @@ void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *const spec)
spec->width = 0u; spec->width = 0u;
spec->precision = 0u; spec->precision = 0u;
spec->type = KERNAUX_PRINTF_FMT_TYPE_NONE; spec->type = KERNAUX_PRINTF_FMT_TYPE_NONE;
spec->base = 0; spec->base = 0;
spec->set_width = false;
spec->set_precision = false;
} }
void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *const spec, const char **const format) void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *const spec, const char **const format)
@ -54,43 +56,43 @@ void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *const spe
} while (running); } while (running);
} }
bool KernAux_PrintfFmt_Spec_parse_width(struct KernAux_PrintfFmt_Spec *const spec, const char **const format) void KernAux_PrintfFmt_Spec_parse_width(struct KernAux_PrintfFmt_Spec *const spec, const char **const format)
{ {
KERNAUX_NOTNULL_RETVAL(spec, false); KERNAUX_NOTNULL_RETURN(spec);
KERNAUX_NOTNULL_RETVAL(format, false); KERNAUX_NOTNULL_RETURN(format);
KERNAUX_NOTNULL_RETVAL(*format, false); KERNAUX_NOTNULL_RETURN(*format);
if (isdigit(**format)) { if (isdigit(**format)) {
spec->width = _atoi(format); spec->width = _atoi(format);
return false; spec->set_width = false;
} else if (**format == '*') { } else if (**format == '*') {
++(*format); ++(*format);
return true; spec->set_width = true;
} else { } else {
return false; spec->set_width = false;
} }
} }
bool KernAux_PrintfFmt_Spec_parse_precision(struct KernAux_PrintfFmt_Spec *const spec, const char **const format) void KernAux_PrintfFmt_Spec_parse_precision(struct KernAux_PrintfFmt_Spec *const spec, const char **const format)
{ {
KERNAUX_NOTNULL_RETVAL(spec, false); KERNAUX_NOTNULL_RETURN(spec);
KERNAUX_NOTNULL_RETVAL(format, false); KERNAUX_NOTNULL_RETURN(format);
KERNAUX_NOTNULL_RETVAL(*format, false); KERNAUX_NOTNULL_RETURN(*format);
if (**format == '.') { if (**format == '.') {
spec->flags |= KERNAUX_PRINTF_FMT_FLAGS_PRECISION; spec->flags |= KERNAUX_PRINTF_FMT_FLAGS_PRECISION;
++(*format); ++(*format);
if (isdigit(**format)) { if (isdigit(**format)) {
spec->precision = _atoi(format); spec->precision = _atoi(format);
return false; spec->set_precision = false;
} else if (**format == '*') { } else if (**format == '*') {
++(*format); ++(*format);
return true; spec->set_precision = true;
} else { } else {
return false; spec->set_precision = false;
} }
} else { } else {
return false; spec->set_precision = false;
} }
} }

View file

@ -13,16 +13,20 @@ int main()
const char *format = {{ escape_str(case.in.format) }}; const char *format = {{ escape_str(case.in.format) }};
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create(); struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format); KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
if (KernAux_PrintfFmt_Spec_parse_width(&spec, &format)) { KernAux_PrintfFmt_Spec_parse_width(&spec, &format);
KernAux_PrintfFmt_Spec_set_width(&spec, {{ none_to_zero(case.in.width) }}); KernAux_PrintfFmt_Spec_parse_precision(&spec, &format);
}
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
KernAux_PrintfFmt_Spec_set_precision(&spec, {{ none_to_zero(case.in.precision) }});
}
KernAux_PrintfFmt_Spec_parse_length(&spec, &format); KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
KernAux_PrintfFmt_Spec_parse_type(&spec, &format); KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
if (spec.set_width) {
KernAux_PrintfFmt_Spec_set_width(&spec, {{ none_to_zero(case.in.width) }});
}
if (spec.set_precision) {
KernAux_PrintfFmt_Spec_set_precision(&spec, {{ none_to_zero(case.in.precision) }});
}
assert(spec.flags == {{ escape_flags(case.out.flags) }}); assert(spec.flags == {{ escape_flags(case.out.flags) }});
assert(spec.width == {{ case.out.width }}); assert(spec.width == {{ case.out.width }});
assert(spec.precision == {{ case.out.precision }}); assert(spec.precision == {{ case.out.precision }});