update from main archive 961114
[kopensolaris-gnu/glibc.git] / manual / examples / rprintf.c
1 #include <stdio.h>
2 #include <printf.h>
3 #include <stdarg.h>
4
5 /*@group*/
6 typedef struct
7   {
8     char *name;
9   } Widget;
10 /*@end group*/
11
12 int
13 print_widget (FILE *stream, const struct printf_info *info, va_list *app)
14 {
15   Widget *w;
16   char *buffer;
17   int len;
18
19   /* Format the output into a string. */
20   w = va_arg (*app, Widget *);
21   len = asprintf (&buffer, "<Widget %p: %s>", w, w->name);
22   if (len == -1)
23     return -1;
24
25   /* Pad to the minimum field width and print to the stream. */
26   len = fprintf (stream, "%*s",
27                  (info->left ? - info->width : info->width),
28                  buffer);
29
30   /* Clean up and return. */
31   free (buffer);
32   return len;
33 }
34
35
36 int
37 print_widget_arginfo (const struct printf_info *info, size_t n,
38                       int *argtypes)
39 {
40   /* We always take exactly one argument and this is a pointer to the
41      structure..  */
42   if (n > 0)
43     argtypes[0] = PA_POINTER;
44   return 1;
45 }
46
47
48 int
49 main (void)
50 {
51   /* Make a widget to print. */
52   Widget mywidget;
53   mywidget.name = "mywidget";
54
55   /* Register the print function for widgets. */
56   register_printf_function ('W', print_widget, print_widget_arginfo);
57
58   /* Now print the widget. */
59   printf ("|%W|\n", &mywidget);
60   printf ("|%35W|\n", &mywidget);
61   printf ("|%-35W|\n", &mywidget);
62
63   return 0;
64 }