Listing 2

#include <stdio.h>
#include <stdlib.h>

void prochar(void *parg);
void proint(void *parg);
void prolong(void *parg);
void prodouble(void *parg);
void pronone(void *parg);

/* structure type flag values */

#define TYPENONE   0    /* Not pointing at an object */
#define TYPECHAR   1    /* char */
#define TYPEINT    2    /* int */
#define TYPELONG   3    /* long */
#define TYPEDOUBLE 4    /* double */

struct node {
   struct node *pfwd;  /* forward ptr */
   struct node *pbwd;  /* backward ptr */
   void *pobject;      /* ptr to object */
   unsigned int objtype;   /* indicate object type */
};

main()
{
   char c = 'A';
   int i = 10;
   long int 1 = 123456;
   double d = 123.45;
   static void (*funtable[])(void *parg) = {
      pronone,
      prochar,
      proint,
      prolong,
      prodouble
   };
   struct node *pnode;

   pnode = malloc(sizeof(struct node));

/* let's point to a double */

   pnode->pobject = &d;
   pnode->objtype = TYPEDOUBLE;
   pnode->pfwd = NULL;
   pnode->pbwd = NULL;

/* at a later point, let's process the object to which we point */

   (*funtable[pnode->objtype])(pnode->pobject);
}

/* processing functions */
void prochar(void *parg)
{
   printf("char: %c\n", *(char *)parg);
}

void proint(void *parg)
{
   printf("int: %d\n", *(int *)parg);
}

void prolong(void *parg)
{
   printf("long: %ld\n"; *(long *)parg);
}

void prodouble(void *parg)
{
   printf("double: %f\n", *(double *)parg);
}

void pronone(void *parg)
{
   printf("none:\n");
}