pennmush-1.8.3p3/game/data/
pennmush-1.8.3p3/game/log/
pennmush-1.8.3p3/game/save/
pennmush-1.8.3p3/game/txt/evt/
pennmush-1.8.3p3/game/txt/nws/
pennmush-1.8.3p3/po/
pennmush-1.8.3p3/win32/msvc.net/
pennmush-1.8.3p3/win32/msvc6/
#ifndef _FUNCTIONS_H_
#define _FUNCTIONS_H_

#include "copyrite.h"

#define FN_REG 0x0
/* Function arguments aren't parsed */
#define FN_NOPARSE      0x1
#define FN_LITERAL      0x2
#define FN_ARG_MASK     0x3
/* Function is disabled */
#define FN_DISABLED     0x4
/* Function will fail if object is gagged */
#define FN_NOGAGGED  0x8
/* Function will fail if object is a guest */
#define FN_NOGUEST   0x10
/* Function will fail if object is fixed */
#define FN_NOFIXED   0x20
/* Function is wizard-only */
#define FN_WIZARD 0x40
/* Function is royalty or wizard */
#define FN_ADMIN  0x80
/* Function is god-only */
#define FN_GOD    0x100
/* Function is builtin */
#define FN_BUILTIN 0x200
/* Function can be overridden with a @function */
#define FN_OVERRIDE 0x400
/* Side-effect version of function no workie */
#define FN_NOSIDEFX 0x800
/* Log function name */
#define FN_LOGNAME 0x1000
/* Log function name and args */
#define FN_LOGARGS 0x2000
/* Localize function registers */
#define FN_LOCALIZE     0x4000
/* Allowed in @function only */
#define FN_USERFN     0x8000

#ifndef HAVE_FUN_DEFINED
typedef struct fun FUN;
#define HAVE_FUN_DEFINED
#endif

typedef void (*function_func) (FUN *, char *, char **, int, char *[], int[],
                               dbref, dbref, dbref, const char *, PE_Info *);

/** A calling pointer to a function.
 * This union holds either a pointer to a function's code or
 * the offset of the function in the user-defined function table.
 */
union fun_call {
  function_func fun;    /**< Pointer to compiled function code */
  size_t offset;        /**< Offset into user-defined function table */
};

/** A function.
 * This structure represents a mushcode function.
 */
struct fun {
  const char *name;     /**< Function name */
  union fun_call where; /**< Where to find the function to call it */
  int minargs;          /**< Minimum arguments required, or 0 */
  /** Maximum arguments allowed.
   * Maximum arguments allowed. If there is no limit, this is INT_MAX.
   * If this is negatve, the final argument to the function can contain
   * commas that won't be parsed, and the maximum number of arguments
   * is the absolute value of this variable.
   */
  int maxargs;
  unsigned int flags;   /**< Bitflags of function */
};

typedef struct userfn_entry USERFN_ENTRY;

/** A user-defined function
 * This structure represents an entry in the user-defined function table.
 */
struct userfn_entry {
  char *fn;             /**< Name of the function */
  dbref thing;          /**< Dbref of object where the function is defined */
  char *name;           /**< Name of attribute where the function is defined */
  unsigned int flags;   /**< Bitflags of function */
};

extern USERFN_ENTRY *userfn_tab;

extern void do_userfn(char *buff, char **bp,
                      dbref obj, ATTR *attrib,
                      int nargs, char **args,
                      dbref executor, dbref caller, dbref enactor,
                      PE_Info *pe_info, int extra_flags);

extern FUN *func_hash_lookup(const char *name);
extern FUN *builtin_func_hash_lookup(const char *name);
extern int check_func(dbref player, FUN *fp);
extern int restrict_function(const char *name, const char *restrict);
extern int alias_function(const char *function, const char *alias);
extern void do_function_restrict(dbref player, const char *name,
                                 const char *restrict, int builtin);
extern void do_function_restore(dbref player, const char *name);
extern void do_list_functions(dbref player, int lc);
extern char *list_functions(void);
extern void do_function(dbref player, char *name, char **argv, int preserve);
extern void do_function_toggle(dbref player, char *name, int toggle);
extern void do_function_report(dbref player, char *name);
extern void do_function_delete(dbref player, char *name);
extern void function_init_postconfig(void);


#define FUNCTION_PROTO(fun_name) \
  extern void fun_name (FUN *fun, char *buff, char **bp, int nargs, char *args[], \
                   int arglen[], dbref executor, dbref caller, dbref enactor, \
                   char const *called_as, PE_Info *pe_info)
extern void function_add(const char *name, function_func fun, int minargs,
                         int maxargs, int ftype);

#endif