mirror of git://sourceware.org/git/glibc.git
				
				
				
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
| /* Printf Extension Example
 | |
|    Copyright (C) 1991-2020 Free Software Foundation, Inc.
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; either version 2
 | |
|    of the License, or (at your option) any later version.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, see <https://www.gnu.org/licenses/>.
 | |
| */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <printf.h>
 | |
| 
 | |
| /*@group*/
 | |
| typedef struct
 | |
| {
 | |
|   char *name;
 | |
| }
 | |
| Widget;
 | |
| /*@end group*/
 | |
| 
 | |
| int
 | |
| print_widget (FILE *stream,
 | |
| 	      const struct printf_info *info,
 | |
| 	      const void *const *args)
 | |
| {
 | |
|   const Widget *w;
 | |
|   char *buffer;
 | |
|   int len;
 | |
| 
 | |
|   /* Format the output into a string. */
 | |
|   w = *((const Widget **) (args[0]));
 | |
|   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
 | |
| print_widget_arginfo (const struct printf_info *info, size_t n,
 | |
|                       int *argtypes)
 | |
| {
 | |
|   /* 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)
 | |
| {
 | |
|   /* Make a widget to print. */
 | |
|   Widget mywidget;
 | |
|   mywidget.name = "mywidget";
 | |
| 
 | |
|   /* Register the print function for widgets. */
 | |
|   register_printf_function ('W', print_widget, print_widget_arginfo);
 | |
| 
 | |
|   /* Now print the widget. */
 | |
|   printf ("|%W|\n", &mywidget);
 | |
|   printf ("|%35W|\n", &mywidget);
 | |
|   printf ("|%-35W|\n", &mywidget);
 | |
| 
 | |
|   return 0;
 | |
| }
 |