static ioctl_fn lookup_dev_ioctl(unsigned int cmd) { static ioctl_fn _ioctls[] = { autofs_dev_ioctl_version, autofs_dev_ioctl_protover, autofs_dev_ioctl_protosubver, autofs_dev_ioctl_openmount, autofs_dev_ioctl_closemount, autofs_dev_ioctl_ready, autofs_dev_ioctl_fail, autofs_dev_ioctl_setpipefd, autofs_dev_ioctl_catatonic, autofs_dev_ioctl_timeout, autofs_dev_ioctl_requester, autofs_dev_ioctl_expire, autofs_dev_ioctl_askumount, autofs_dev_ioctl_ismountpoint, }; unsigned int idx = cmd_idx(cmd); return (idx >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[idx]; }
static ioctl_fn lookup_dev_ioctl(unsigned int cmd) { static struct { int cmd; ioctl_fn fn; } _ioctls[] = { {cmd_idx(AUTOFS_DEV_IOCTL_VERSION_CMD), NULL}, {cmd_idx(AUTOFS_DEV_IOCTL_PROTOVER_CMD), autofs_dev_ioctl_protover}, {cmd_idx(AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD), autofs_dev_ioctl_protosubver}, {cmd_idx(AUTOFS_DEV_IOCTL_OPENMOUNT_CMD), autofs_dev_ioctl_openmount}, {cmd_idx(AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD), autofs_dev_ioctl_closemount}, {cmd_idx(AUTOFS_DEV_IOCTL_READY_CMD), autofs_dev_ioctl_ready}, {cmd_idx(AUTOFS_DEV_IOCTL_FAIL_CMD), autofs_dev_ioctl_fail}, {cmd_idx(AUTOFS_DEV_IOCTL_SETPIPEFD_CMD), autofs_dev_ioctl_setpipefd}, {cmd_idx(AUTOFS_DEV_IOCTL_CATATONIC_CMD), autofs_dev_ioctl_catatonic}, {cmd_idx(AUTOFS_DEV_IOCTL_TIMEOUT_CMD), autofs_dev_ioctl_timeout}, {cmd_idx(AUTOFS_DEV_IOCTL_REQUESTER_CMD), autofs_dev_ioctl_requester}, {cmd_idx(AUTOFS_DEV_IOCTL_EXPIRE_CMD), autofs_dev_ioctl_expire}, {cmd_idx(AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD), autofs_dev_ioctl_askumount}, {cmd_idx(AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD), autofs_dev_ioctl_ismountpoint} }; unsigned int idx = cmd_idx(cmd); return (idx >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[idx].fn; }
/* * Request a game command from the uI and carry out whatever actions * go along with it. */ void process_command(cmd_context ctx, bool no_request) { int idx; game_command cmd; /* If we've got a command to process, do it. */ if (cmd_get(ctx, &cmd, !no_request) == 0) { idx = cmd_idx(cmd.command); if (idx == -1) return; /* Do some sanity checking on those arguments that might have been declared as "unknown", such as directions and targets. */ switch (cmd.command) { case CMD_WALK: case CMD_RUN: case CMD_JUMP: case CMD_OPEN: case CMD_CLOSE: case CMD_TUNNEL: case CMD_DISARM: case CMD_BASH: case CMD_ALTER: case CMD_JAM: case CMD_MAKE_TRAP: { /* Direction hasn't been specified, so we ask for one. */ if (cmd.args[0].direction == DIR_UNKNOWN) { if (!get_rep_dir(&cmd.args[0].direction)) return; } break; } /* * These take an item number and a "target" as arguments, * though a target isn't always actually needed, so we'll * only prompt for it via callback if the item being used needs it. */ case CMD_USE_WAND: case CMD_USE_ROD: case CMD_QUAFF: case CMD_ACTIVATE: case CMD_READ_SCROLL: case CMD_FIRE: case CMD_THROW: case CMD_STEAL: { bool get_target = FALSE; if (cmd.command == CMD_FIRE || cmd.command == CMD_THROW || obj_needs_aim(object_from_item_idx(cmd.args[0].choice))) { if (cmd.args[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd.args[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd.args[1].direction, FALSE)) return; break; } /* This takes a choice and a direction. */ case CMD_CAST: { bool get_target = FALSE; if (spell_needs_aim(cp_ptr->spell_book, cmd.args[0].choice)) { if (cmd.args[1].direction == DIR_UNKNOWN) get_target = TRUE; if (cmd.args[1].direction == DIR_TARGET && !target_okay()) get_target = TRUE; } if (get_target && !get_aim_dir(&cmd.args[1].direction, FALSE)) return; break; } default: { /* I can see the point of the compiler warning, but still... */ break; } } /* Command repetition */ if (game_cmds[idx].repeat_allowed) { /* Auto-repeat */ if (game_cmds[idx].auto_repeat_n > 0 && p_ptr->command_arg == 0 && p_ptr->command_rep == 0) p_ptr->command_arg = game_cmds[idx].auto_repeat_n; allow_repeated_command(); } repeat_prev_allowed = TRUE; if (game_cmds[idx].fn) game_cmds[idx].fn(cmd.command, cmd.args); } }
/* * Inserts a command in the queue to be carried out. */ errr cmd_insert(cmd_code c, ...) { game_command cmd = {CMD_NULL, 0, {{0}} }; va_list vp; size_t j = 0; int idx = cmd_idx(c); if (idx == -1) return 1; /* Begin the Varargs Stuff */ va_start(vp, c); cmd.command = c; for (j = 0; (game_cmds[idx].arg_type[j] != arg_END && j < N_ELEMENTS(game_cmds[idx].arg_type)); j++) { switch (game_cmds[idx].arg_type[j]) { case arg_CHOICE: { cmd.args[j].choice = va_arg(vp, int); break; } case arg_STRING: { cmd.args[j].string = string_make(va_arg(vp, const char *)); break; } case arg_DIRECTION: case arg_TARGET: { cmd.args[j].direction = va_arg(vp, int); break; } case arg_POINT: { cmd.args[j].point.y = va_arg(vp, int); cmd.args[j].point.x = va_arg(vp, int); break; } case arg_ITEM: { cmd.args[j].item = va_arg(vp, int); break; } case arg_NUMBER: { cmd.args[j].number = va_arg(vp, int); break; } case arg_END: { break; } } } /* End the Varargs Stuff */ va_end(vp); return cmd_insert_s(&cmd); }
f_describe() { register char *cp; register int i, c; char str[10]; struct buffer *savbuf, *b, *make_buf(); chroff bdot; saynow("Help for command: "); i = cmd_idx(c = cmd_read()); /* Get function idx for cmd */ if(c&CB_META) sayntoo("M-"); if(i == FN_PFXMETA) { sayntoo("M-"); i = cmd_idx(c = (cmd_read() | CB_META)); } else if(i == FN_PFXEXT) { sayntoo("^X-"); i = cmd_idx(c = (cmd_read() | CB_EXT)); } str[0] = c&0177; str[1] = 0; sayntoo(str); /* Now read in the help file, if necessary */ savbuf = cur_buf; if(help_buf) chg_buf(help_buf); else { saynow("Loading "); sayntoo(ev_helpfile); sayntoo("..."); chg_buf(help_buf = make_buf(" **HELP**")); if(read_file(ev_helpfile) == 0) { chg_buf(savbuf); kill_buf(help_buf); help_buf = 0; return; } } /* Find function index in current buffer */ cp = str; *cp++ = '<'; *cp++ = 'F'; cp = dottoa(cp, (chroff)i); *cp++ = '>'; e_gobob(); if(e_search(str, cp-str, 0) == 0) sayntoo(" No help found"); else { bdot = e_dot(); while(!e_lblankp()) e_gonl(); /* Move past 1st blank line */ b = make_buf(" *SHOW*"); sb_sins((SBBUF *)b, e_copyn(bdot - e_dot())); mk_showin(b); /* Show the stuff */ kill_buf(b); sayclr(); } chg_buf(savbuf); }