The GNU C Library - Printf Extension Example

Node: Printf Extension Example Prev: Defining the Output Handler Up: Customizing Printf

printf Extension Example

Here is an example showing how to define a printf handler function. This program defines a data structure called a Widget and defines the `%W' conversion to print information about Widget * arguments, including the pointer value and the name stored in the data structure. The `%W' conversion supports the minimum field width and left-justification options, but ignores everything else.

	#include <stdio.h>
	#include <printf.h>
	#include <stdarg.h>
	
	typedef struct
	  {
	    char *name;
	  } Widget;
	
	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;
	}

The output produced by this program looks like:

	|<Widget 0xffeffb7c: mywidget>|
	|      <Widget 0xffeffb7c: mywidget>|
	|<Widget 0xffeffb7c: mywidget>      |


Up: Customizing Printf