diff options
Diffstat (limited to 'manual/examples/rprintf.c')
-rw-r--r-- | manual/examples/rprintf.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/manual/examples/rprintf.c b/manual/examples/rprintf.c new file mode 100644 index 0000000000..eff1d8e7cf --- /dev/null +++ b/manual/examples/rprintf.c @@ -0,0 +1,52 @@ +#include <stdio.h> +#include <printf.h> +#include <stdarg.h> + +/*@group*/ +typedef struct + { + char *name; + } Widget; +/*@end group*/ + +int +print_widget (FILE *stream, const struct printf_info *info, va_list *app) +{ + Widget *w; + char *buffer; + int len; + + /* Format the output into a string. */ + w = va_arg (*app, Widget *); + len = asprintf (&buffer, "<Widget %p: %s>", w, w->name); + if (len == -1) + return -1; + + /* Pad to the minimum field width and print to the stream. */ + len = fprintf (stream, "%*s", + (info->left ? - info->width : info->width), + buffer); + + /* Clean up and return. */ + free (buffer); + return len; +} + + +int +main (void) +{ + /* Make a widget to print. */ + Widget mywidget; + mywidget.name = "mywidget"; + + /* Register the print function for widgets. */ + register_printf_function ('W', print_widget, NULL); /* No arginfo. */ + + /* Now print the widget. */ + printf ("|%W|\n", &mywidget); + printf ("|%35W|\n", &mywidget); + printf ("|%-35W|\n", &mywidget); + + return 0; +} |