The GNU C Library - Example of Parsing

Node: Example of Parsing Prev: Parsing a Template String Up: Formatted Output

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


Up: Formatted Output