mirror of
https://github.com/tailix/libkernaux.git
synced 2025-02-17 15:45:32 -05:00
Main: include/kernaux/printf_fmt.h: Change API
This commit is contained in:
parent
81b6109031
commit
11e9c24784
7 changed files with 73 additions and 54 deletions
|
@ -1,6 +1,6 @@
|
|||
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>
|
||||
|
||||
|
|
|
@ -8,17 +8,21 @@ int main()
|
|||
const char *format = "s";
|
||||
|
||||
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
|
||||
|
||||
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.
|
||||
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.
|
||||
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.width == 0);
|
||||
|
@ -31,17 +35,21 @@ int main()
|
|||
const char *format = "012.34f";
|
||||
|
||||
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
|
||||
|
||||
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.
|
||||
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.
|
||||
KernAux_PrintfFmt_Spec_set_precision(&spec, 0);
|
||||
}
|
||||
KernAux_PrintfFmt_Spec_parse_length(&spec, &format);
|
||||
KernAux_PrintfFmt_Spec_parse_type(&spec, &format);
|
||||
|
||||
assert(
|
||||
spec.flags ==
|
||||
|
@ -60,16 +68,20 @@ int main()
|
|||
const char *format = " *.*ld";
|
||||
|
||||
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
|
||||
|
||||
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
|
||||
if (KernAux_PrintfFmt_Spec_parse_width(&spec, &format)) {
|
||||
KernAux_PrintfFmt_Spec_set_width(&spec, 12);
|
||||
}
|
||||
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
|
||||
KernAux_PrintfFmt_Spec_set_precision(&spec, 34);
|
||||
}
|
||||
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) {
|
||||
KernAux_PrintfFmt_Spec_set_width(&spec, 12);
|
||||
}
|
||||
if (spec.set_precision) {
|
||||
KernAux_PrintfFmt_Spec_set_precision(&spec, 34);
|
||||
}
|
||||
|
||||
assert(
|
||||
spec.flags ==
|
||||
(
|
||||
|
|
|
@ -39,16 +39,18 @@ struct KernAux_PrintfFmt_Spec {
|
|||
unsigned int width;
|
||||
unsigned int precision;
|
||||
enum KernAux_PrintfFmt_Type type;
|
||||
|
||||
unsigned int base;
|
||||
|
||||
bool set_width;
|
||||
bool set_precision;
|
||||
};
|
||||
|
||||
struct KernAux_PrintfFmt_Spec KernAux_PrintfFmt_Spec_create();
|
||||
void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *spec);
|
||||
|
||||
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);
|
||||
bool KernAux_PrintfFmt_Spec_parse_precision(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);
|
||||
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);
|
||||
|
||||
|
|
|
@ -43,8 +43,8 @@ VALUE rb_KernAux_snprintf1(
|
|||
|
||||
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
|
||||
KernAux_PrintfFmt_Spec_parse_flags(&spec, &fmt);
|
||||
const bool has_width = KernAux_PrintfFmt_Spec_parse_width(&spec, &fmt);
|
||||
const bool has_precision = KernAux_PrintfFmt_Spec_parse_precision(&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);
|
||||
|
||||
|
@ -53,10 +53,10 @@ VALUE rb_KernAux_snprintf1(
|
|||
}
|
||||
|
||||
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++]));
|
||||
}
|
||||
if (has_precision && argc > arg_index) {
|
||||
if (spec.set_precision && argc > 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");
|
||||
|
||||
int slen;
|
||||
if (has_width) {
|
||||
if (has_precision) {
|
||||
if (spec.set_width) {
|
||||
if (spec.set_precision) {
|
||||
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.arg);
|
||||
|
@ -99,7 +99,7 @@ VALUE rb_KernAux_snprintf1(
|
|||
: kernaux_snprintf(str, size, format, spec.width, dynarg.arg);
|
||||
}
|
||||
} else {
|
||||
if (has_precision) {
|
||||
if (spec.set_precision) {
|
||||
slen = dynarg.use_dbl
|
||||
? kernaux_snprintf(str, size, format, spec.precision, dynarg.dbl)
|
||||
: kernaux_snprintf(str, size, format, spec.precision, dynarg.arg);
|
||||
|
|
13
src/printf.c
13
src/printf.c
|
@ -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();
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
|
||||
if (spec.set_precision) {
|
||||
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
|
||||
switch (spec.type) {
|
||||
case KERNAUX_PRINTF_FMT_TYPE_INT:
|
||||
|
|
|
@ -31,8 +31,10 @@ void KernAux_PrintfFmt_Spec_init(struct KernAux_PrintfFmt_Spec *const spec)
|
|||
spec->width = 0u;
|
||||
spec->precision = 0u;
|
||||
spec->type = KERNAUX_PRINTF_FMT_TYPE_NONE;
|
||||
|
||||
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)
|
||||
|
@ -54,43 +56,43 @@ void KernAux_PrintfFmt_Spec_parse_flags(struct KernAux_PrintfFmt_Spec *const spe
|
|||
} 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_RETVAL(format, false);
|
||||
KERNAUX_NOTNULL_RETVAL(*format, false);
|
||||
KERNAUX_NOTNULL_RETURN(spec);
|
||||
KERNAUX_NOTNULL_RETURN(format);
|
||||
KERNAUX_NOTNULL_RETURN(*format);
|
||||
|
||||
if (isdigit(**format)) {
|
||||
spec->width = _atoi(format);
|
||||
return false;
|
||||
spec->set_width = false;
|
||||
} else if (**format == '*') {
|
||||
++(*format);
|
||||
return true;
|
||||
spec->set_width = true;
|
||||
} 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_RETVAL(format, false);
|
||||
KERNAUX_NOTNULL_RETVAL(*format, false);
|
||||
KERNAUX_NOTNULL_RETURN(spec);
|
||||
KERNAUX_NOTNULL_RETURN(format);
|
||||
KERNAUX_NOTNULL_RETURN(*format);
|
||||
|
||||
if (**format == '.') {
|
||||
spec->flags |= KERNAUX_PRINTF_FMT_FLAGS_PRECISION;
|
||||
++(*format);
|
||||
if (isdigit(**format)) {
|
||||
spec->precision = _atoi(format);
|
||||
return false;
|
||||
spec->set_precision = false;
|
||||
} else if (**format == '*') {
|
||||
++(*format);
|
||||
return true;
|
||||
spec->set_precision = true;
|
||||
} else {
|
||||
return false;
|
||||
spec->set_precision = false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
spec->set_precision = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,16 +13,20 @@ int main()
|
|||
const char *format = {{ escape_str(case.in.format) }};
|
||||
|
||||
struct KernAux_PrintfFmt_Spec spec = KernAux_PrintfFmt_Spec_create();
|
||||
|
||||
KernAux_PrintfFmt_Spec_parse_flags(&spec, &format);
|
||||
if (KernAux_PrintfFmt_Spec_parse_width(&spec, &format)) {
|
||||
KernAux_PrintfFmt_Spec_set_width(&spec, {{ none_to_zero(case.in.width) }});
|
||||
}
|
||||
if (KernAux_PrintfFmt_Spec_parse_precision(&spec, &format)) {
|
||||
KernAux_PrintfFmt_Spec_set_precision(&spec, {{ none_to_zero(case.in.precision) }});
|
||||
}
|
||||
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) {
|
||||
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.width == {{ case.out.width }});
|
||||
assert(spec.precision == {{ case.out.precision }});
|
||||
|
|
Loading…
Add table
Reference in a new issue