#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;

  /* @r{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;

  /* @r{Pad to the minimum field width and print to the stream.} */
  len = fprintf (stream, "%*s",
                 (info->left ? - info->width : info->width),
                 buffer);

  /* @r{Clean up and return.} */
  free (buffer);
  return len;
@}


int
print_widget_arginfo (const struct printf_info *info, size_t n,
                      int *argtypes)
@{
  /* @r{We always take exactly one argument and this is a pointer to the
     structure..} */
  if (n > 0)
    argtypes[0] = PA_POINTER;
  return 1;
@}


int
main (void)
@{
  /* @r{Make a widget to print.} */
  Widget mywidget;
  mywidget.name = "mywidget";

  /* @r{Register the print function for widgets.} */
  register_printf_function ('W', print_widget, print_widget_arginfo);

  /* @r{Now print the widget.} */
  printf ("|%W|\n", &mywidget);
  printf ("|%35W|\n", &mywidget);
  printf ("|%-35W|\n", &mywidget);

  return 0;
@}
