summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client.c7
-rw-r--r--cmd-attach-session.c2
-rw-r--r--cmd-bind-key.c2
-rw-r--r--cmd-break-pane.c4
-rw-r--r--cmd-capture-pane.c4
-rw-r--r--cmd-choose-tree.c6
-rw-r--r--cmd-command-prompt.c2
-rw-r--r--cmd-confirm-before.c2
-rw-r--r--cmd-copy-mode.c6
-rw-r--r--cmd-detach-client.c4
-rw-r--r--cmd-display-menu.c4
-rw-r--r--cmd-display-message.c6
-rw-r--r--cmd-display-panes.c2
-rw-r--r--cmd-find-window.c2
-rw-r--r--cmd-if-shell.c14
-rw-r--r--cmd-join-pane.c4
-rw-r--r--cmd-kill-pane.c3
-rw-r--r--cmd-kill-server.c2
-rw-r--r--cmd-kill-session.c2
-rw-r--r--cmd-kill-window.c6
-rw-r--r--cmd-list-buffers.c2
-rw-r--r--cmd-list-clients.c2
-rw-r--r--cmd-list-keys.c6
-rw-r--r--cmd-list-panes.c4
-rw-r--r--cmd-list-sessions.c2
-rw-r--r--cmd-list-windows.c4
-rw-r--r--cmd-load-buffer.c2
-rw-r--r--cmd-lock-server.c6
-rw-r--r--cmd-move-window.c12
-rw-r--r--cmd-new-session.c4
-rw-r--r--cmd-new-window.c2
-rw-r--r--cmd-paste-buffer.c2
-rw-r--r--cmd-pipe-pane.c8
-rw-r--r--cmd-queue.c33
-rw-r--r--cmd-refresh-client.c2
-rw-r--r--cmd-rename-session.c2
-rw-r--r--cmd-rename-window.c2
-rw-r--r--cmd-resize-pane.c2
-rw-r--r--cmd-resize-window.c2
-rw-r--r--cmd-respawn-pane.c2
-rw-r--r--cmd-respawn-window.c2
-rw-r--r--cmd-rotate-window.c5
-rw-r--r--cmd-run-shell.c2
-rw-r--r--cmd-save-buffer.c6
-rw-r--r--cmd-select-layout.c6
-rw-r--r--cmd-select-pane.c33
-rw-r--r--cmd-select-window.c17
-rw-r--r--cmd-send-keys.c4
-rw-r--r--cmd-set-buffer.c4
-rw-r--r--cmd-set-environment.c8
-rw-r--r--cmd-set-option.c8
-rw-r--r--cmd-show-environment.c8
-rw-r--r--cmd-show-messages.c2
-rw-r--r--cmd-show-options.c20
-rw-r--r--cmd-source-file.c2
-rw-r--r--cmd-split-window.c2
-rw-r--r--cmd-swap-pane.c2
-rw-r--r--cmd-swap-window.c3
-rw-r--r--cmd-switch-client.c4
-rw-r--r--cmd-unbind-key.c44
-rw-r--r--cmd-wait-for.c2
-rw-r--r--cmd.c127
-rw-r--r--format.c6
-rw-r--r--key-bindings.c10
-rw-r--r--tmux.h49
65 files changed, 314 insertions, 247 deletions
diff --git a/client.c b/client.c
index 5aae8d0d..c1d6e1b5 100644
--- a/client.c
+++ b/client.c
@@ -236,7 +236,6 @@ int
client_main(struct event_base *base, int argc, char **argv, int flags)
{
struct cmd_parse_result *pr;
- struct cmd *cmd;
struct msg_command *data;
int fd, i;
const char *ttynam, *cwd;
@@ -265,10 +264,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
*/
pr = cmd_parse_from_arguments(argc, argv, NULL);
if (pr->status == CMD_PARSE_SUCCESS) {
- TAILQ_FOREACH(cmd, &pr->cmdlist->list, qentry) {
- if (cmd->entry->flags & CMD_STARTSERVER)
- flags |= CLIENT_STARTSERVER;
- }
+ if (cmd_list_any_have(pr->cmdlist, CMD_STARTSERVER))
+ flags |= CLIENT_STARTSERVER;
cmd_list_free(pr->cmdlist);
} else
free(pr->error);
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 477d3517..23a321bd 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -177,7 +177,7 @@ cmd_attach_session(struct cmdq_item *item, const char *tflag, int dflag,
static enum cmd_retval
cmd_attach_session_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
return (cmd_attach_session(item, args_get(args, 't'),
args_has(args, 'd'), args_has(args, 'x'), args_has(args, 'r'),
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index bc6a3d40..dcb56c06 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -44,7 +44,7 @@ const struct cmd_entry cmd_bind_key_entry = {
static enum cmd_retval
cmd_bind_key_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
key_code key;
const char *tablename, *note;
struct cmd_parse_result *pr;
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index 6c638103..b4997f91 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -48,7 +48,7 @@ const struct cmd_entry cmd_break_pane_entry = {
static enum cmd_retval
cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct cmd_find_state *current = &item->shared->current;
struct client *c = cmd_find_client(item, NULL, 1);
struct winlink *wl = item->source.wl;
@@ -98,7 +98,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
if (idx == -1)
idx = -1 - options_get_number(dst_s->options, "base-index");
wl = session_attach(dst_s, w, idx, &cause); /* can't fail */
- if (!args_has(self->args, 'd')) {
+ if (!args_has(args, 'd')) {
session_select(dst_s, wl->idx);
cmd_find_from_session(current, dst_s, 0);
}
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index ad6755ba..3510142e 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -192,14 +192,14 @@ cmd_capture_pane_history(struct args *args, struct cmdq_item *item,
static enum cmd_retval
cmd_capture_pane_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c = item->client;
struct window_pane *wp = item->target.wp;
char *buf, *cause;
const char *bufname;
size_t len;
- if (self->entry == &cmd_clear_history_entry) {
+ if (cmd_get_entry(self) == &cmd_clear_history_entry) {
window_pane_reset_mode_all(wp);
grid_clear_history(wp->base.grid);
return (CMD_RETURN_NORMAL);
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index e4cc754e..8b667ec5 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -71,15 +71,15 @@ const struct cmd_entry cmd_choose_buffer_entry = {
static enum cmd_retval
cmd_choose_tree_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct window_pane *wp = item->target.wp;
const struct window_mode *mode;
- if (self->entry == &cmd_choose_buffer_entry) {
+ if (cmd_get_entry(self) == &cmd_choose_buffer_entry) {
if (paste_get_top(NULL) == NULL)
return (CMD_RETURN_NORMAL);
mode = &window_buffer_mode;
- } else if (self->entry == &cmd_choose_client_entry) {
+ } else if (cmd_get_entry(self) == &cmd_choose_client_entry) {
if (server_client_how_many() == 0)
return (CMD_RETURN_NORMAL);
mode = &window_client_mode;
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index 9f0ea19f..31a1ae78 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -64,7 +64,7 @@ struct cmd_command_prompt_cdata {
static enum cmd_retval
cmd_command_prompt_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
const char *inputs, *prompts;
struct cmd_command_prompt_cdata *cdata;
struct client *c;
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index be21a78b..419efda5 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -53,7 +53,7 @@ struct cmd_confirm_before_data {
static enum cmd_retval
cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct cmd_confirm_before_data *cdata;
struct client *c;
char *cmd, *copy, *new_prompt, *ptr;
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index 5ce7a2c4..3b20689c 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -56,7 +56,7 @@ const struct cmd_entry cmd_clock_mode_entry = {
static enum cmd_retval
cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct cmdq_shared *shared = item->shared;
struct client *c = item->client;
struct session *s;
@@ -74,7 +74,7 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_NORMAL);
}
- if (self->entry == &cmd_clock_mode_entry) {
+ if (cmd_get_entry(self) == &cmd_clock_mode_entry) {
window_pane_set_mode(wp, NULL, &window_clock_mode, NULL, NULL);
return (CMD_RETURN_NORMAL);
}
@@ -87,7 +87,7 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
if (args_has(args, 'M'))
window_copy_start_drag(c, &shared->mouse);
}
- if (args_has(self->args, 'u'))
+ if (args_has(args, 'u'))
window_copy_pageup(wp, 0);
return (CMD_RETURN_NORMAL);
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index 85b9a4ed..34682459 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -57,7 +57,7 @@ const struct cmd_entry cmd_suspend_client_entry = {
static enum cmd_retval
cmd_detach_client_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c, *cloop;
struct session *s;
enum msgtype msgtype;
@@ -66,7 +66,7 @@ cmd_detach_client_exec(struct cmd *self, struct cmdq_item *item)
if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL)
return (CMD_RETURN_ERROR);
- if (self->entry == &cmd_suspend_client_entry) {
+ if (cmd_get_entry(self) == &cmd_suspend_client_entry) {
server_client_suspend(c);
return (CMD_RETURN_NORMAL);
}
diff --git a/cmd-display-menu.c b/cmd-display-menu.c
index b4db7331..74637ceb 100644
--- a/cmd-display-menu.c
+++ b/cmd-display-menu.c
@@ -171,7 +171,7 @@ cmd_display_menu_get_position(struct client *c, struct cmdq_item *item,
static enum cmd_retval
cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c;
struct session *s = item->target.s;
struct winlink *wl = item->target.wl;
@@ -239,7 +239,7 @@ cmd_display_menu_exec(struct cmd *self, struct cmdq_item *item)
static enum cmd_retval
cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c;
struct cmd_find_state *fs = &item->target;
const char *value, *cmd = NULL, **lines = NULL;
diff --git a/cmd-display-message.c b/cmd-display-message.c
index 4d9bccb6..d4d4ad25 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -60,7 +60,7 @@ cmd_display_message_each(const char *key, const char *value, void *arg)
static enum cmd_retval
cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c, *target_c;
struct session *s = item->target.s;
struct winlink *wl = item->target.wl;
@@ -101,7 +101,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
target_c = c;
else
target_c = cmd_find_best_client(s);
- if (args_has(self->args, 'v'))
+ if (args_has(args, 'v'))
flags = FORMAT_VERBOSE;
else
flags = 0;
@@ -114,7 +114,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
}
msg = format_expand_time(ft, template);
- if (args_has(self->args, 'p'))
+ if (args_has(args, 'p'))
cmdq_print(item, "%s", msg);
else if (c != NULL)
status_message_set(c, "%s", msg);
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index d8d351c2..41fe50da 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -239,7 +239,7 @@ cmd_display_panes_key(struct client *c, struct key_event *event)
static enum cmd_retval
cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c;
struct session *s;
u_int delay;
diff --git a/cmd-find-window.c b/cmd-find-window.c
index 774c0bb9..798754d1 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -44,7 +44,7 @@ const struct cmd_entry cmd_find_window_entry = {
static enum cmd_retval
cmd_find_window_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args, *new_args;
+ struct args *args = cmd_get_args(self), *new_args;
struct window_pane *wp = item->target.wp;
const char *s = args->argv[0];
char *filter, *argv = { NULL };
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index b008241d..a678cf40 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -62,10 +62,11 @@ struct cmd_if_shell_data {
static enum cmd_retval
cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct mouse_event *m = &item->shared->mouse;
struct cmd_if_shell_data *cdata;
char *shellcmd, *cmd;
+ const char *file;
struct cmdq_item *new_item;
struct cmd_find_state *fs = &item->target;
struct client *c = cmd_find_client(item, NULL, 1);
@@ -88,9 +89,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_NORMAL);
memset(&pi, 0, sizeof pi);
- if (self->file != NULL)
- pi.file = self->file;
- pi.line = self->line;
+ cmd_get_source(self, &pi.file, &pi.line);
pi.item = item;
pi.c = c;
cmd_find_copy_state(&pi.fs, fs);
@@ -134,10 +133,9 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
cdata->item = NULL;
memset(&cdata->input, 0, sizeof cdata->input);
- if (self->file != NULL)
- cdata->input.file = xstrdup(self->file);
- cdata->input.line = self->line;
- cdata->input.item = cdata->item;
+ cmd_get_source(self, &file, &cdata->input.line);
+ if (file != NULL)
+ cdata->input.file = xstrdup(file);
cdata->input.c = c;
if (cdata->input.c != NULL)
cdata->input.c->references++;
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index 108eab3a..2d26d82b 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -63,7 +63,7 @@ const struct cmd_entry cmd_move_pane_entry = {
static enum cmd_retval
cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct cmd_find_state *current = &item->shared->current;
struct session *dst_s;
struct winlink *src_wl, *dst_wl;
@@ -75,7 +75,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
enum layout_type type;
struct layout_cell *lc;
- if (self->entry == &cmd_join_pane_entry)
+ if (cmd_get_entry(self) == &cmd_join_pane_entry)
not_same_window = 1;
else
not_same_window = 0;
diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index f0aacb2a..301b9fa6 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -44,10 +44,11 @@ const struct cmd_entry cmd_kill_pane_entry = {
static enum cmd_retval
cmd_kill_pane_exec(struct cmd *self, struct cmdq_item *item)
{
+ struct args *args = cmd_get_args(self);
struct winlink *wl = item->target.wl;
struct window_pane *loopwp, *tmpwp, *wp = item->target.wp;
- if (args_has(self->args, 'a')) {
+ if (args_has(args, 'a')) {
server_unzoom_window(wl->window);
TAILQ_FOREACH_SAFE(loopwp, &wl->window->panes, entry, tmpwp) {
if (loopwp == wp)
diff --git a/cmd-kill-server.c b/cmd-kill-server.c
index d7eba692..76bcf267 100644
--- a/cmd-kill-server.c
+++ b/cmd-kill-server.c
@@ -54,7 +54,7 @@ const struct cmd_entry cmd_start_server_entry = {
static enum cmd_retval
cmd_kill_server_exec(struct cmd *self, __unused struct cmdq_item *item)
{
- if (self->entry == &cmd_kill_server_entry)
+ if (cmd_get_entry(self) == &cmd_kill_server_entry)
kill(getpid(), SIGTERM);
return (CMD_RETURN_NORMAL);
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index dcef8097..978d1b9c 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -45,7 +45,7 @@ const struct cmd_entry cmd_kill_session_entry = {
static enum cmd_retval
cmd_kill_session_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct session *s, *sloop, *stmp;
struct winlink *wl;
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 50df83ee..c788ff38 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -55,13 +55,13 @@ const struct cmd_entry cmd_unlink_window_entry = {
static enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct winlink *wl = item->target.wl, *wl2, *wl3;
struct window *w = wl->window;
struct session *s = item->target.s;
- if (self->entry == &cmd_unlink_window_entry) {
- if (!args_has(self->args, 'k') && !session_is_linked(s, w)) {
+ if (cmd_get_entry(self) == &cmd_unlink_window_entry) {
+ if (!args_has(args, 'k') && !session_is_linked(s, w)) {
cmdq_error(item, "window only linked to one session");
return (CMD_RETURN_ERROR);
}
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index 2da8a518..784289d8 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -46,7 +46,7 @@ const struct cmd_entry cmd_list_buffers_entry = {
static enum cmd_retval
cmd_list_buffers_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct paste_buffer *pb;
struct format_tree *ft;
const char *template, *filter;
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 9fab8f84..9cec5199 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -51,7 +51,7 @@ const struct cmd_entry cmd_list_clients_entry = {
static enum cmd_retval
cmd_list_clients_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct client *c;
struct session *s;
struct format_tree *ft;
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index e1ec4d3c..d6c261d8 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -144,7 +144,7 @@ cmd_list_keys_get_prefix(struct args *args, key_code *prefix)
static enum cmd_retval
cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct key_table *table;
struct key_binding *bd;
const char *tablename, *r;
@@ -153,7 +153,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
int repeat, width, tablewidth, keywidth, found = 0;
size_t tmpsize, tmpused, cplen;
- if (self->entry == &cmd_list_commands_entry)
+ if (cmd_get_entry(self) == &cmd_list_commands_entry)
return (cmd_list_keys_commands(self, item));
if (args->argc != 0) {
@@ -313,7 +313,7 @@ out:
static enum cmd_retval
cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
const struct cmd_entry **entryp;
const struct cmd_entry *entry;
struct format_tree *ft;
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 10789460..ac97558e 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -50,7 +50,7 @@ const struct cmd_entry cmd_list_panes_entry = {
static enum cmd_retval
cmd_list_panes_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct session *s = item->target.s;
struct winlink *wl = item->target.wl;
@@ -87,7 +87,7 @@ static void
cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
struct cmdq_item *item, int type)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct window_pane *wp;
u_int n;
struct format_tree *ft;
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index 36d6dd78..1c6e1e9c 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -52,7 +52,7 @@ const struct cmd_entry cmd_list_sessions_entry = {
static enum cmd_retval
cmd_list_sessions_exec(struct cmd *self, struct cmdq_item *item)
{
- struct args *args = self->args;
+ struct args *args = cmd_get_args(self);
struct session *s;
u_int n;
struct format_tree *ft;
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index 32b7b8f5..905e9eaf 100644
--- a/cmd-list-windows.c
+++ b/