#ifndef __COMMAND_H
#define __COMMAND_H
#define NUM_BYTES 20
typedef unsigned char switch_mask[NUM_BYTES];
#define SW_SET(m,n) (m[(n) >> 3] |= (1 << ((n) & 0x7)))
#define SW_CLR(m,n) (m[(n) >> 3] &= ~(1 << ((n) & 0x7)))
#define SW_ISSET(m,n) (m[(n) >> 3] & (1 << ((n) & 0x7)))
#define SW_ZERO(m) memset(m, 0, NUM_BYTES)
/* These are type restrictors */
#define CMD_T_ROOM 0x80000000
#define CMD_T_THING 0x40000000
#define CMD_T_EXIT 0x20000000
#define CMD_T_PLAYER 0x10000000
#define CMD_T_ANY 0xF0000000
#define CMD_T_GOD 0x08000000
/* Any unknown or undefined switches will be passed in switches, instead of causing error */
#define CMD_T_SWITCHES 0x02000000
/* Command is disabled, set with @command */
#define CMD_T_DISABLED 0x01000000
/* Command will fail if object is gagged */
#define CMD_T_NOGAGGED 0x00800000
/* Command will fail if object is a guest */
#define CMD_T_NOGUEST 0x00400000
/* Command will fail if object is fixed */
#define CMD_T_NOFIXED 0x00200000
/* INTERNAL : Command is listed in @list commands */
#define CMD_T_LISTED 0x00080000
/* INTERNAL : Command is an internal command, and shouldn't be matched
* or aliased
*/
#define CMD_T_INTERNAL 0x00040000
/* Logging for commands */
#define CMD_T_LOGNAME 0x00020000
#define CMD_T_LOGARGS 0x00010000
/* Split arguments at =, but don't abort if there's no = */
#define CMD_T_EQSPLIT 0x0001
/* Split into argv[] at ,s */
#define CMD_T_ARGS 0x0010
/* Split at spaces instead of commas. CMD_T_ARGS MUST also be defined */
#define CMD_T_ARG_SPACE 0x0020
/* Do NOT parse arguments */
#define CMD_T_NOPARSE 0x0040
#define CMD_T_LS_ARGS CMD_T_ARGS
#define CMD_T_LS_SPACE CMD_T_ARG_SPACE
#define CMD_T_LS_NOPARSE CMD_T_NOPARSE
#define CMD_T_RS_ARGS CMD_T_ARGS<<4
#define CMD_T_RS_SPACE CMD_T_ARG_SPACE<<4
#define CMD_T_RS_NOPARSE CMD_T_NOPARSE<<4
/** COMMAND prototype.
* \verbatim
Passed arguments:
executor : Object issuing command.
sw : switch_mask, check with the SW_ macros.
raw : *FULL* unparsed, untouched command.
switches : Any unhandled switches, or NULL if none.
args_raw : Full argument, untouched. null-string if none.
arg_left : Left-side arguments, unparsed if CMD_T_NOPARSE.
args_left : Parsed arguments, if CMD_T_ARGS is defined.
args_right : Parsed right-side arguments, if CMD_T_RSARGS is defined.
Note that if you don't specify EQSPLIT, left is still the data you want. If you define EQSPLIT,
there are also right_XX values.
Special case:
If the NOEVAL switch is given, AND EQSPLIT is defined, the right-side will not be parsed.
If NOEVAL is givean the EQSPLIT isn't defined, the left-side won't be parsed.
* \endverbatim
*/
#define COMMAND(command_name) \
void command_name (COMMAND_INFO *cmd, dbref player, dbref cause, \
switch_mask sw,char *raw, char *switches, char *args_raw, \
char *arg_left, char *args_left[MAX_ARG], \
char *arg_right, char *args_right[MAX_ARG]); \
void command_name(COMMAND_INFO *cmd __attribute__ ((__unused__)), \
dbref player __attribute__ ((__unused__)), \
dbref cause __attribute__ ((__unused__)), \
switch_mask sw __attribute__ ((__unused__)), \
char *raw __attribute__ ((__unused__)), \
char *switches __attribute__ ((__unused__)), \
char *args_raw __attribute__ ((__unused__)), \
char *arg_left __attribute__ ((__unused__)), \
char *args_left[MAX_ARG] __attribute__ ((__unused__)), \
char *arg_right __attribute__ ((__unused__)), \
char *args_right[MAX_ARG] __attribute__ ((__unused__)))
/** Common command prototype macro */
#define COMMAND_PROTO(command_name) \
void command_name (COMMAND_INFO *cmd, dbref player, dbref cause, switch_mask sw,char *raw, char *switches, char *args_raw, \
char *arg_left, char *args_left[MAX_ARG], \
char *arg_right, char *args_right[MAX_ARG])
typedef struct command_info COMMAND_INFO;
typedef void (*command_func) (COMMAND_INFO *, dbref, dbref, switch_mask, char *,
char *, char *, char *, char *[MAX_ARG], char *,
char *[MAX_ARG]);
/** A hook specification.
*/
struct hook_data {
dbref obj; /**< Object where the hook attribute is stored. */
char *attrname; /**< Attribute name of the hook attribute */
};
/** A command.
* This structure represents a command in the table of available commands.
*/
struct command_info {
const char *name; /**< Canonical name of the command */
const char *restrict_message; /**< Message sent when command is restricted */
command_func func; /**< Function to call when command is run */
unsigned int type; /**< Types of objects that can use the command */
object_flag_type flagmask; /**< Flags to which the command is restricted */
object_flag_type powers; /**< Powers to which the command is restricted */
switch_mask sw; /**< Bitflags of switches this command can take */
/** Hooks on this command.
*/
struct {
struct hook_data before; /**< Hook to evaluate before command */
struct hook_data after; /**< Hook to evaluate after command */
struct hook_data ignore; /**< Hook to evaluate to decide if we should ignore hardcoded command */
struct hook_data override; /**< Hook to override command with $command */
} hooks;
};
typedef struct command_list COMLIST;
/** A command list entry.
* This structure stores the static array of commands that are
* initially loaded into the command table. Commands can also be
* added dynamically, outside of this array.
*/
struct command_list {
const char *name; /**< Command name */
const char *switches; /**< Space-separated list of switch names */
command_func func; /**< Function to call when command is run */
unsigned int type; /**< Types of objects that can use the command */
const char *flagstr; /**< Space-separated list of flags that can use */
const char *powers; /**< Powers to which the command is restricted */
};
typedef struct switch_value SWITCH_VALUE;
/** The value associated with a switch.
* Command switches are given integral values at compile time when
* the switchinc.c and switches.h files are rebuilt. This structure
* associates switch names with switch numbers
*/
struct switch_value {
const char *name; /**< Name of the switch */
int value; /**< Number of the switch */
};
typedef struct com_sort_struc COMSORTSTRUC;
/** Sorted linked list of commands.
* This structure is used to build a sorted linked list of pointers
* to command data.
*/
struct com_sort_struc {
struct com_sort_struc *next; /**< Pointer to next in list */
COMMAND_INFO *cmd; /**< Command data */
};
/** Permissions for commands.
* This structure is used to associate names for command permissions
* (e.g. "player") with the appropriate bitmask
*/
struct command_perms_t {
const char *name; /**< Permission name */
unsigned int type; /**< Bitmask for this permission */
};
#define SWITCH_NONE 0
#include "switches.h"
extern switch_mask *switchmask(const char *switches);
extern COMMAND_INFO *command_find(const char *name);
extern COMMAND_INFO *command_find_exact(const char *name);
extern COMMAND_INFO *command_add
(const char *name, int type, const char *flagstr, const char *powers,
const char *switchstr, command_func func);
extern COMMAND_INFO *make_command
(const char *name, int type, object_flag_type flagmask,
object_flag_type powers, switch_mask *sw, command_func func);
extern COMMAND_INFO *command_modify(const char *name, int type,
object_flag_type flagmask,
object_flag_type powers, switch_mask *sw,
command_func func);
extern void reserve_alias(const char *a);
extern int alias_command(const char *command, const char *alias);
extern void command_init_preconfig(void);
extern void command_init_postconfig(void);
extern void command_splitup
(dbref player, dbref cause, char *from, char *to, char **args,
COMMAND_INFO *cmd, int side);
extern void command_argparse
(dbref player, dbref cause, char **from, char *to, char **argv,
COMMAND_INFO *cmd, int side, int forcenoparse);
extern char *command_parse
(dbref player, dbref cause, char *string, int fromport);
extern void do_list_commands(dbref player, int lc);
extern char *list_commands(void);
extern int command_check_byname(dbref player, const char *name);
extern int restrict_command(const char *name, const char *restriction);
extern void reserve_aliases(void);
extern void local_commands(void);
extern void do_command_add(dbref player, char *name, int flags);
extern void do_command_delete(dbref player, char *name);
#endif /* __COMMAND_H */