1
0
Fork 0
mirror of https://github.com/tailix/libkernaux.git synced 2025-04-07 17:32:45 -04:00

Main: include/kernaux/printf_fmt.h: Add function to parse everything at once

This commit is contained in:
Alex Kotov 2022-05-28 12:16:38 +03:00
parent 11e9c24784
commit 67b60b5406
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08
7 changed files with 27 additions and 32 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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'

View file

@ -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");

View file

@ -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));

View file

@ -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);

View file

@ -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) }});