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:
parent
11e9c24784
commit
67b60b5406
7 changed files with 27 additions and 32 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) }});
|
||||
|
|
Loading…
Add table
Reference in a new issue