ACEDB source code documentation: dynamic function calling

# Dynamic function calls without linktime errors

## *** THIS IS A SPEC, CODE ONLY EXISTS AS A PROTOTYPE ***

    The messsage system allows attempts to call C functions which may
    not exist, without getting an error at link-time.

    Declare such functions as follows:

    #include "message.h"

    MESSAGERETURN myfunc(va_list args)
    {

      return 0;
    }

    and call like this:

    if (call("myfunc", arg1, arg2))
      printf("call to myfunc succeeded");
    else
      printf("myfunc doesn't exist");

    Notes:

    1) call returns a BOOL, true for success, FALSE if function is non-existant.
    2) the return value from the called func is a dummy, and thrown away.
       If you want a return value pass in an address.
    3) This stuff is all done using smoke and mirrors in the makefile,
       it's pretty robust (I hope!) but the special function declarations are
       parsed by a sed script, not a general purpose parser, so don't mess with
       the form too much. In particular:
    	put MESSAGERETURN at the start of a line,
    	keep MESSAGERETURN and the function name on the same line, not

    MESSAGERETURN
    myfunc(va_list args)

    	don't make function prototypes.

    MESSAGERETURN myfunc(va_list arg);

    	or declare variables.

    MESSAGERETURN my_var;

       both of which are useless amd will confuse the system.

    4) Source files are pre-processed before looking for the MESSAGERETURN
       lines, so use of commenting out, macros, include files, and #ifdef around
       code is fine.

    5) See man stdarg for how to get at the arguments of the called function.

    6) There is an additional function,

    BOOL callExists(char *func)

      which returns true if call(func) would, but doesn't make the call.

    7) MESSAGERETURN functions whose name begins with "init" are
       called automatically just after the rest of acedb initialisation.
       This allows optional subssystems to be initialised without insertions
       into xacemain. If more than one such init function exists, the order
       in which they are called is undefined. init functions must still take
       a va_list argument, but its value will be junk.