Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Mail Systems
Eclipse Documentation

How To Guides
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Problem Solutions
Privacy Policy




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.  */
     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;
             switch (argtypes[i] & ~PA_FLAG_MASK)
               case PA_INT:
               case PA_FLOAT:
               case PA_DOUBLE:
                 wanted = NUMBER;
               case PA_CHAR:
                 wanted = CHAR;
               case PA_STRING:
                 wanted = STRING;
               case PA_POINTER:
                 wanted = STRUCTURE;
           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