Example of Parsing (The GNU C Library)

Previous: , Up: Formatted Output [Contents][Index]


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

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