GNU C Library (libc) Programming Guide - Example of Parsing


12.12.11 Example of Parsing a Template String

Here is an example of decoding argument types for a format string. We assume this is part of an interpreter which contains arguments of type NUMBER, CHAR, STRING and STRUCTURE (and perhaps others which are not valid here).

 /* Test whether the nargs specified objects
 in the vector args are valid
 for the format string format:
 if so, return 1.
 If not, return 0 after printing an error message. */
 
 int
 validate_args (char *format, int nargs, OBJECT *args)
 {
 int *argtypes;
 int nwanted;
 
 /* Get the information about the arguments.
 Each conversion specification must be at least two characters
 long, so there cannot be more specifications than half the
 length of the string. */
 
 argtypes = (int *) alloca (strlen (format) / 2 * sizeof (int));
 nwanted = parse_printf_format (string, nelts, argtypes);
 
 /* Check the number of arguments. */
 if (nwanted > nargs)
 {
 error ("too few arguments (at least %d required)", nwanted);
 return 0;
 }
 
 /* Check the C type wanted for each argument
 and see if the object given is suitable. */
 for (i = 0; i < nwanted; i++)
 {
 int wanted;
 
 if (argtypes[i] & PA_FLAG_PTR)
 wanted = STRUCTURE;
 else
 switch (argtypes[i] & ~PA_FLAG_MASK)
 {
 case PA_INT:
 case PA_FLOAT:
 case PA_DOUBLE:
 wanted = NUMBER;
 break;
 case PA_CHAR:
 wanted = CHAR;
 break;
 case PA_STRING:
 wanted = STRING;
 break;
 case PA_POINTER:
 wanted = STRUCTURE;
 break;
 }
 if (TYPE (args[i]) != wanted)
 {
 error ("type mismatch for arg number %d", i);
 return 0;
 }
 }
 return 1;
 }

Published under the terms of the GNU General Public License Design by Interspire

AltStyle によって変換されたページ (->オリジナル) /