1999-02-05 06:10:49 +00:00
|
|
|
/* See if we have a broken register_printf function (e.g. an old version of glibc) */
|
2005-07-15 22:51:23 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 2005 Free Software Foundation
|
|
|
|
|
|
|
|
Copying and distribution of this file, with or without modification,
|
|
|
|
are permitted in any medium without royalty provided the copyright
|
|
|
|
notice and this notice are preserved.
|
|
|
|
*/
|
1999-02-05 06:10:49 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <printf.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
|
|
/* <sattler@volker.cs.Uni-Magdeburg.DE>, with libc-5.3.9 thinks this
|
|
|
|
flag PRINTF_ATSIGN_VA_LIST should be 0, but for me, with libc-5.0.9,
|
|
|
|
it crashes. -mccallum
|
|
|
|
|
|
|
|
Apparently GNU libc 2.xx needs this to be 0 also, along with Linux
|
|
|
|
libc versions 5.2.xx and higher (including libc6, which is just GNU
|
|
|
|
libc). -chung */
|
|
|
|
#define PRINTF_ATSIGN_VA_LIST \
|
|
|
|
(defined(_LINUX_C_LIB_VERSION_MINOR) \
|
|
|
|
&& _LINUX_C_LIB_VERSION_MAJOR <= 5 \
|
|
|
|
&& _LINUX_C_LIB_VERSION_MINOR < 2)
|
|
|
|
|
|
|
|
#if ! PRINTF_ATSIGN_VA_LIST
|
|
|
|
static int
|
|
|
|
arginfo_func (const struct printf_info *info, size_t n, int *argtypes)
|
|
|
|
{
|
|
|
|
*argtypes = PA_POINTER;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
#endif /* !PRINTF_ATSIGN_VA_LIST */
|
|
|
|
|
|
|
|
static int
|
|
|
|
handle_printf_atsign (FILE *stream,
|
|
|
|
const struct printf_info *info,
|
|
|
|
#if PRINTF_ATSIGN_VA_LIST
|
|
|
|
va_list *ap_pointer)
|
|
|
|
#elif defined(_LINUX_C_LIB_VERSION_MAJOR) \
|
|
|
|
&& _LINUX_C_LIB_VERSION_MAJOR < 6
|
|
|
|
const void **const args)
|
|
|
|
#else /* GNU libc needs the following. */
|
|
|
|
const void *const *args)
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
#if ! PRINTF_ATSIGN_VA_LIST
|
|
|
|
const void *ptr = *args;
|
|
|
|
#endif
|
|
|
|
char * string_object;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
/* xxx This implementation may not pay pay attention to as much
|
|
|
|
of printf_info as it should. */
|
|
|
|
|
|
|
|
#if PRINTF_ATSIGN_VA_LIST
|
|
|
|
string_object = va_arg (*ap_pointer, char *);
|
|
|
|
#else
|
|
|
|
string_object = *((char **) ptr);
|
|
|
|
#endif
|
|
|
|
len = fprintf(stream, "%s", string_object);
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
char *d = "hi there";
|
|
|
|
|
|
|
|
register_printf_function ('@',
|
|
|
|
handle_printf_atsign,
|
|
|
|
#if PRINTF_ATSIGN_VA_LIST
|
|
|
|
0);
|
|
|
|
#else
|
|
|
|
arginfo_func);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
printf("test %s = %@\n", d, d);
|
|
|
|
return 0;
|
|
|
|
}
|