parrotcode: Parrot sprintf | |
Contents | C |
src/spf_vtable.c - Parrot sprintf
Implements the two families of functions Parrot_sprintf
may use to retrieve arguments.
static STRING *getchr_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
char
out of the va_list
in obj
and returns it as a Parrot STRING
.size
is unused.static HUGEINTVAL getint_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
va_list
in obj
and returns it as a Parrot STRING
.size
is an enum spf_type_t
value which indicates the storage type of the integer.static UHUGEINTVAL getuint_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
va_list
in obj
and returns it as a Parrot STRING
.size
is an enum spf_type_t
value which indicates the storage type of the integer.static HUGEFLOATVAL getfloat_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
va_list
in obj
and returns it as a Parrot STRING
.size
is an enum spf_type_t
value which indicates the storage type of the number.static STRING *getstring_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
va_list
in obj
and returns it as a Parrot STRING
.size
is an enum spf_type_t
value which indicates the storage type of the string.static void *getptr_va(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
void *
out of the va_list
in obj
and returns it.size
is unused.static STRING *getchr_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getchr_va()
except that a vtable is used to get the value from obj
.static HUGEINTVAL getint_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getint_va()
except that a vtable is used to get the value from obj
.static UHUGEINTVAL getuint_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getuint_va()
except that a vtable is used to get the value from obj
.static HUGEFLOATVAL getfloat_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getfloat_va()
except that a vtable is used to get the value from obj
.static STRING *getstring_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getstring_va()
except that a vtable is used to get the value from obj
.static void *getptr_pmc(Interp *interpreter, INTVAL size, SPRINTF_OBJ *obj)
getptr_va()
except that a vtable is used to get the value from obj
.src/misc.h, src/misc.c, src/spf_render.c.
When I was first working on this implementation of sprintf,
I ran into a problem.
I wanted to re-use the implementation for a Parrot bytecode-level sprintf,
but that couldn't be done,
since it used va_*
directly.
For a while I thought about generating two versions of the source with a Perl script,
but that seemed like overkill.
Eventually I came across this idea -- pass in a specialized vtable with methods for extracting things from the arglist,
whatever it happened to be.
This is the result.
In the future,
it may be deemed desirable to similarly vtable-ize appending things to the string,
allowing for faster PIO_printf()
&c,
as well as a version that writes directly to a C string.
However,
at this point neither of those is needed.
|