
*****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 l = 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");
}

