[comp.sys.mac.programmer] Passing the address of a TCL method?

minow@mountn.dec.com (Martin Minow) (10/09/90)

One of my standard programming methods for dealing with keyword-selected
functions is to define a table such as

	typedef struct {
	    char	*name;
	    void	(*function)(void);
	} TABLE;
	TABLE	table[] = {
	    { "up",	go_up },
	    { "down",	go_down },
	    { NULL,	NULL }
	};
This is accessed by code such as

	for (tp = table; tp->name != NULL; tp++) {
	    if (strcmp(tp->name, request) == 0) {
		(*tp->function)();
		goto found;
	    }
	}
	error("Not found\n");

Suppose the function is really a Think C class method.  I.e., I have

	struct MyObject : CObject {
		void		go_up(void);
	 	void		go_down(void);
	};

How do I declare the TABLE and function call?  The compiler rejects the
obvious declarations.

It's not an emergency, I built an ugly work-around using some new capabilities
of the ANSI-C pre-processor:

	#define EXPAND_NAMES	\
	   DEF(up)		\
	   DEF(down)

	#define DEF(what)	\
	  k ## what,
	enum {
	    EXPAND_NAMES
	    kDummyNameWithoutTrailingComma
	};
	#undef DEF
...
	struct MyObject : CObject {
...
		#define DEF(what) void what ## Handler(void);
		EXPAND_NAMES
		#undef DEF
	};
...
	char *commands[] {
		#define DEF(what)	#what,
		EXPAND_NAMES
		#undef DEF
		NULL
	};
Now, the selection is just a switch statement:
	for (i = 0; commands[i] != NULL; i++) {
	    if (strcmp(commands[i], request) == 0) {
		switch (i) {
		#define DEF(what) \
		case k##what: MyObject->what ## Handler(); break;
		EXPAND_NAMES
		#undef DEF
		}
		goto found;
	    }
	}

Any better ideas?

Martin Minow
minow@bolt.enet.dec.com