usr/src/cmd/mdb/common/mdb/mdb_tab.c
author Henrik Mattsson <henrik.mattsson@delphix.com>
Mon, 11 Mar 2013 10:48:46 -0800
changeset 13981 e0b637c317fa
parent 13688 32dde9989090
child 14006 09f0146de94b
permissions -rw-r--r--
3602 mdb should tab complete global symbols Reviewed by: Matt Amdur <[email protected]> Reviewed by: Adam Leventhal <[email protected]> Reviewed by: Carlos Cardenas <[email protected]> Reviewed by: Robert Mustacchi <[email protected]> Approved by: Dan McDonald <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     1
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     2
 * CDDL HEADER START
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     3
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     7
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    11
 * and limitations under the License.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    12
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    18
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    19
 * CDDL HEADER END
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    20
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    21
/*
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
    22
 * Copyright (c) 2013 by Delphix. All rights reserved.
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    23
 * Copyright (c) 2012 Joyent, Inc. All rights reserved.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    24
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    25
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    26
 * This file contains all of the interfaces for mdb's tab completion engine.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    27
 * Currently some interfaces are private to mdb and its internal implementation,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    28
 * those are in mdb_tab.h. Other pieces are public interfaces. Those are in
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    29
 * mdb_modapi.h.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    30
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    31
 * Memory allocations in tab completion context have to be done very carefully.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    32
 * We need to think of ourselves as the same as any other command that is being
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    33
 * executed by the user, which means we must use UM_GC to handle being
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    34
 * interrupted.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    35
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    36
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    37
#include <mdb/mdb_modapi.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    38
#include <mdb/mdb_ctf.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    39
#include <mdb/mdb_ctf_impl.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    40
#include <mdb/mdb_string.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    41
#include <mdb/mdb_module.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    42
#include <mdb/mdb_debug.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    43
#include <mdb/mdb_print.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    44
#include <mdb/mdb_nv.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    45
#include <mdb/mdb_tab.h>
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
    46
#include <mdb/mdb_target.h>
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    47
#include <mdb/mdb.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    48
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    49
#include <ctype.h>
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    50
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    51
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    52
 * There may be another way to do this, but this works well enough.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    53
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    54
#define	COMMAND_SEPARATOR "::"
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    55
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    56
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    57
 * find_command_start --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    58
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    59
 * 	Given a buffer find the start of the last command.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    60
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    61
static char *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    62
tab_find_command_start(char *buf)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    63
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    64
	char *offset = strstr(buf, COMMAND_SEPARATOR);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    65
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    66
	if (offset == NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    67
		return (NULL);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    68
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    69
	for (;;) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    70
		char *next = strstr(offset + strlen(COMMAND_SEPARATOR),
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    71
		    COMMAND_SEPARATOR);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    72
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    73
		if (next == NULL) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    74
			return (offset);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    75
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    76
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    77
		offset = next;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    78
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    79
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    80
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    81
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    82
 * get_dcmd --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    83
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    84
 * 	Given a buffer containing a command and its argument return
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    85
 * 	the name of the command and the offset in the buffer where
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    86
 * 	the command arguments start.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    87
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    88
 * 	Note: This will modify the buffer.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    89
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    90
char *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    91
tab_get_dcmd(char *buf, char **args, uint_t *flags)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    92
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    93
	char *start = buf + strlen(COMMAND_SEPARATOR);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    94
	char *separator = start;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    95
	const char *end = buf + strlen(buf);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    96
	uint_t space = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    97
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    98
	while (separator < end && !isspace(*separator))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
    99
		separator++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   100
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   101
	if (separator == end) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   102
		*args = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   103
	} else {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   104
		if (isspace(*separator))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   105
			space = 1;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   106
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   107
		*separator++ = '\0';
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   108
		*args = separator;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   109
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   110
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   111
	if (space)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   112
		*flags |= DCMD_TAB_SPACE;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   113
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   114
	return (start);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   115
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   116
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   117
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   118
 * count_args --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   119
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   120
 * 	Given a buffer containing dmcd arguments return the total number
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   121
 * 	of arguments.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   122
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   123
 * 	While parsing arguments we need to keep track of whether or not the last
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   124
 * 	arguments ends with a trailing space.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   125
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   126
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   127
tab_count_args(const char *input, uint_t *flags)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   128
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   129
	const char *index;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   130
	int argc = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   131
	uint_t space = *flags & DCMD_TAB_SPACE;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   132
	index = input;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   133
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   134
	while (*index != '\0') {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   135
		while (*index != '\0' && isspace(*index)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   136
			index++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   137
			space = 1;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   138
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   139
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   140
		if (*index != '\0' && !isspace(*index)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   141
			argc++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   142
			space = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   143
			while (*index != '\0' && !isspace (*index)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   144
				index++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   145
			}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   146
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   147
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   148
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   149
	if (space)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   150
		*flags |= DCMD_TAB_SPACE;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   151
	else
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   152
		*flags &= ~DCMD_TAB_SPACE;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   153
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   154
	return (argc);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   155
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   156
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   157
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   158
 * copy_args --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   159
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   160
 * 	Given a buffer containing dcmd arguments and an array of mdb_arg_t's
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   161
 * 	initialize the string value of each mdb_arg_t.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   162
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   163
 * 	Note: This will modify the buffer.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   164
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   165
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   166
tab_copy_args(char *input, int argc, mdb_arg_t *argv)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   167
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   168
	int i = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   169
	char *index;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   170
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   171
	index = input;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   172
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   173
	while (*index) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   174
		while (*index && isspace(*index)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   175
			index++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   176
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   177
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   178
		if (*index && !isspace(*index)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   179
			char *end = index;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   180
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   181
			while (*end && !isspace(*end)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   182
				end++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   183
			}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   184
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   185
			if (*end) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   186
				*end++ = '\0';
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   187
			}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   188
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   189
			argv[i].a_type = MDB_TYPE_STRING;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   190
			argv[i].a_un.a_str = index;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   191
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   192
			index = end;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   193
			i++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   194
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   195
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   196
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   197
	if (i != argc)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   198
		return (-1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   199
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   200
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   201
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   202
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   203
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   204
 * parse-buf --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   205
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   206
 * 	Parse the given buffer and return the specified dcmd, the number
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   207
 * 	of arguments, and array of mdb_arg_t containing the argument
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   208
 * 	values.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   209
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   210
 * 	Note: this will modify the specified buffer. Caller is responisble
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   211
 * 	for freeing argvp.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   212
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   213
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   214
tab_parse_buf(char *buf, char **dcmdp, int *argcp, mdb_arg_t **argvp,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   215
    uint_t *flags)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   216
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   217
	char *data = tab_find_command_start(buf);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   218
	char *args_data = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   219
	char *dcmd = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   220
	int argc = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   221
	mdb_arg_t *argv = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   222
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   223
	if (data == NULL) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   224
		return (-1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   225
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   226
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   227
	dcmd = tab_get_dcmd(data, &args_data, flags);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   228
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   229
	if (dcmd == NULL) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   230
		return (-1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   231
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   232
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   233
	if (args_data != NULL) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   234
		argc = tab_count_args(args_data, flags);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   235
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   236
		if (argc != 0) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   237
			argv = mdb_alloc(sizeof (mdb_arg_t) * argc,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   238
			    UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   239
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   240
			if (tab_copy_args(args_data, argc, argv) == -1)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   241
				return (-1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   242
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   243
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   244
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   245
	*dcmdp = dcmd;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   246
	*argcp = argc;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   247
	*argvp = argv;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   248
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   249
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   250
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   251
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   252
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   253
 * tab_command --
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   254
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   255
 * 	This function is executed anytime a tab is entered. It checks
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   256
 * 	the current buffer to determine if there is a valid dmcd,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   257
 * 	if that dcmd has a tab completion handler it will invoke it.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   258
 *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   259
 *	This function returns the string (if any) that should be added to the
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   260
 *	existing buffer to complete it.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   261
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   262
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   263
mdb_tab_command(mdb_tab_cookie_t *mcp, const char *buf)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   264
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   265
	char *data;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   266
	char *dcmd = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   267
	int argc = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   268
	mdb_arg_t *argv = NULL;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   269
	int ret = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   270
	mdb_idcmd_t *cp;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   271
	uint_t flags = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   272
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   273
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   274
	 * Parsing the command and arguments will modify the buffer
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   275
	 * (replacing spaces with \0), so make a copy of the specified
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   276
	 * buffer first.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   277
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   278
	data = mdb_alloc(strlen(buf) + 1, UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   279
	(void) strcpy(data, buf);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   280
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   281
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   282
	 * Get the specified dcmd and arguments from the buffer.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   283
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   284
	ret = tab_parse_buf(data, &dcmd, &argc, &argv, &flags);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   285
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   286
	/*
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   287
	 * Match against global symbols if the input is not a dcmd
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   288
	 */
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   289
	if (ret != 0) {
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   290
		(void) mdb_tab_complete_global(mcp, buf);
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   291
		goto out;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   292
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   293
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   294
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   295
	 * Check to see if the buffer contains a valid dcmd
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   296
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   297
	cp = mdb_dcmd_lookup(dcmd);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   298
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   299
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   300
	 * When argc is zero it indicates that we are trying to tab complete
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   301
	 * a dcmd or a global symbol. Note, that if there isn't the start of
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   302
	 * a dcmd, i.e. ::, then we will have already bailed in the call to
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   303
	 * tab_parse_buf.
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   304
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   305
	if (cp == NULL && argc != 0) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   306
		goto out;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   307
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   308
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   309
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   310
	 * Invoke the command specific tab completion handler or the built in
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   311
	 * dcmd one if there is no dcmd.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   312
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   313
	if (cp == NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   314
		(void) mdb_tab_complete_dcmd(mcp, dcmd);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   315
	else
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   316
		mdb_call_tab(cp, mcp, flags, argc, argv);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   317
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   318
out:
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   319
	return (mdb_tab_size(mcp));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   320
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   321
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   322
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   323
tab_complete_dcmd(mdb_var_t *v, void *arg)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   324
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   325
	mdb_idcmd_t *idcp = mdb_nv_get_cookie(mdb_nv_get_cookie(v));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   326
	mdb_tab_cookie_t *mcp = (mdb_tab_cookie_t *)arg;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   327
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   328
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   329
	 * The way that mdb is implemented, even commands like $C will show up
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   330
	 * here. As such, we don't want to match anything that doesn't start
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   331
	 * with an alpha or number. While nothing currently appears (via a
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   332
	 * cursory search with mdb -k) to start with a capital letter or a
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   333
	 * number, we'll support them anyways.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   334
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   335
	if (!isalnum(idcp->idc_name[0]))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   336
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   337
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   338
	mdb_tab_insert(mcp, idcp->idc_name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   339
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   340
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   341
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   342
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   343
mdb_tab_complete_dcmd(mdb_tab_cookie_t *mcp, const char *dcmd)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   344
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   345
	mdb_tab_setmbase(mcp, dcmd);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   346
	mdb_nv_sort_iter(&mdb.m_dcmds, tab_complete_dcmd, mcp,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   347
	    UM_GC | UM_SLEEP);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   348
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   349
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   350
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   351
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   352
tab_complete_walker(mdb_var_t *v, void *arg)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   353
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   354
	mdb_iwalker_t *iwp = mdb_nv_get_cookie(mdb_nv_get_cookie(v));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   355
	mdb_tab_cookie_t *mcp = arg;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   356
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   357
	mdb_tab_insert(mcp, iwp->iwlk_name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   358
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   359
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   360
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   361
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   362
mdb_tab_complete_walker(mdb_tab_cookie_t *mcp, const char *walker)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   363
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   364
	if (walker != NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   365
		mdb_tab_setmbase(mcp, walker);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   366
	mdb_nv_sort_iter(&mdb.m_walkers, tab_complete_walker, mcp,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   367
	    UM_GC | UM_SLEEP);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   368
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   369
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   370
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   371
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   372
mdb_tab_cookie_t *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   373
mdb_tab_init(void)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   374
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   375
	mdb_tab_cookie_t *mcp;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   376
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   377
	mcp = mdb_zalloc(sizeof (mdb_tab_cookie_t), UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   378
	(void) mdb_nv_create(&mcp->mtc_nv, UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   379
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   380
	return (mcp);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   381
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   382
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   383
size_t
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   384
mdb_tab_size(mdb_tab_cookie_t *mcp)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   385
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   386
	return (mdb_nv_size(&mcp->mtc_nv));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   387
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   388
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   389
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   390
 * Determine whether the specified name is a valid tab completion for
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   391
 * the given command. If the name is a valid tab completion then
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   392
 * it will be saved in the mdb_tab_cookie_t.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   393
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   394
void
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   395
mdb_tab_insert(mdb_tab_cookie_t *mcp, const char *name)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   396
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   397
	size_t len, matches, index;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   398
	uint_t flags;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   399
	mdb_var_t *v;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   400
	char *n;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   401
	const char *nvn;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   402
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   403
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   404
	 * If we have a match set, then we want to verify that we actually match
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   405
	 * it.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   406
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   407
	if (mcp->mtc_base != NULL &&
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   408
	    strncmp(name, mcp->mtc_base, strlen(mcp->mtc_base)) != 0)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   409
		return;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   410
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   411
	v = mdb_nv_lookup(&mcp->mtc_nv, name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   412
	if (v != NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   413
		return;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   414
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   415
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   416
	 * Names that we get passed in may be longer than MDB_NV_NAMELEN which
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   417
	 * is currently 31 including the null terminator. If that is the case,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   418
	 * then we're going to take care of allocating a string and holding it
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   419
	 * for our caller. Note that we don't need to free it, because we're
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   420
	 * allocating this with UM_GC.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   421
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   422
	flags = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   423
	len = strlen(name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   424
	if (len > MDB_NV_NAMELEN - 1) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   425
		n = mdb_alloc(len + 1, UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   426
		(void) strcpy(n, name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   427
		nvn = n;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   428
		flags |= MDB_NV_EXTNAME;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   429
	} else {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   430
		nvn = name;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   431
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   432
	flags |= MDB_NV_RDONLY;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   433
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   434
	(void) mdb_nv_insert(&mcp->mtc_nv, nvn, NULL, 0, flags);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   435
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   436
	matches = mdb_tab_size(mcp);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   437
	if (matches == 1) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   438
		(void) strlcpy(mcp->mtc_match, nvn, MDB_SYM_NAMLEN);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   439
	} else {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   440
		index = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   441
		while (mcp->mtc_match[index] &&
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   442
		    mcp->mtc_match[index] == nvn[index])
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   443
			index++;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   444
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   445
		mcp->mtc_match[index] = '\0';
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   446
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   447
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   448
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   449
/*ARGSUSED*/
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   450
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   451
tab_print_cb(mdb_var_t *v, void *ignored)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   452
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   453
	mdb_printf("%s\n", mdb_nv_get_name(v));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   454
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   455
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   456
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   457
void
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   458
mdb_tab_print(mdb_tab_cookie_t *mcp)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   459
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   460
	mdb_nv_sort_iter(&mcp->mtc_nv, tab_print_cb, NULL, UM_SLEEP | UM_GC);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   461
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   462
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   463
const char *
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   464
mdb_tab_match(mdb_tab_cookie_t *mcp)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   465
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   466
	size_t blen;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   467
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   468
	if (mcp->mtc_base == NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   469
		blen = 0;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   470
	else
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   471
		blen = strlen(mcp->mtc_base);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   472
	return (mcp->mtc_match + blen);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   473
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   474
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   475
void
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   476
mdb_tab_setmbase(mdb_tab_cookie_t *mcp, const char *base)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   477
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   478
	(void) strlcpy(mcp->mtc_base, base, MDB_SYM_NAMLEN);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   479
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   480
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   481
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   482
 * This function is currently a no-op due to the fact that we have to GC because
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   483
 * we're in command context.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   484
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   485
/*ARGSUSED*/
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   486
void
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   487
mdb_tab_fini(mdb_tab_cookie_t *mcp)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   488
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   489
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   490
13981
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   491
/*ARGSUSED*/
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   492
static int
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   493
tab_complete_global(void *arg, const GElf_Sym *sym, const char *name,
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   494
    const mdb_syminfo_t *sip, const char *obj)
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   495
{
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   496
	mdb_tab_cookie_t *mcp = arg;
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   497
	mdb_tab_insert(mcp, name);
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   498
	return (0);
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   499
}
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   500
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   501
/*
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   502
 * This function tab completes against all loaded global symbols.
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   503
 */
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   504
int
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   505
mdb_tab_complete_global(mdb_tab_cookie_t *mcp, const char *name)
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   506
{
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   507
	mdb_tab_setmbase(mcp, name);
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   508
	(void) mdb_tgt_symbol_iter(mdb.m_target, MDB_TGT_OBJ_EVERY,
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   509
	    MDB_TGT_SYMTAB, MDB_TGT_BIND_GLOBAL | MDB_TGT_TYPE_OBJECT |
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   510
	    MDB_TGT_TYPE_FUNC, tab_complete_global, mcp);
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   511
	return (0);
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   512
}
e0b637c317fa 3602 mdb should tab complete global symbols
Henrik Mattsson <henrik.mattsson@delphix.com>
parents: 13688
diff changeset
   513
13688
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   514
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   515
 * This function takes a ctf id and determines whether or not the associated
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   516
 * type should be considered as a potential match for the given tab
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   517
 * completion command. We verify that the type itself is valid
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   518
 * for completion given the current context of the command, resolve
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   519
 * its actual name, and then pass it off to mdb_tab_insert to determine
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   520
 * if it's an actual match.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   521
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   522
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   523
tab_complete_type(mdb_ctf_id_t id, void *arg)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   524
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   525
	int rkind;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   526
	char buf[MDB_SYM_NAMLEN];
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   527
	mdb_ctf_id_t rid;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   528
	mdb_tab_cookie_t *mcp = arg;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   529
	uint_t flags = (uint_t)(uintptr_t)mcp->mtc_cba;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   530
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   531
	/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   532
	 * CTF data includes types that mdb commands don't understand. Before
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   533
	 * we resolve the actual type prune any entry that is a type we
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   534
	 * don't care about.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   535
	 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   536
	switch (mdb_ctf_type_kind(id)) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   537
	case CTF_K_CONST:
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   538
	case CTF_K_RESTRICT:
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   539
	case CTF_K_VOLATILE:
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   540
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   541
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   542
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   543
	if (mdb_ctf_type_resolve(id, &rid) != 0)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   544
		return (1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   545
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   546
	rkind = mdb_ctf_type_kind(rid);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   547
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   548
	if ((flags & MDB_TABC_MEMBERS) && rkind != CTF_K_STRUCT &&
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   549
	    rkind != CTF_K_UNION)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   550
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   551
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   552
	if ((flags & MDB_TABC_NOPOINT) && rkind == CTF_K_POINTER)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   553
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   554
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   555
	if ((flags & MDB_TABC_NOARRAY) && rkind == CTF_K_ARRAY)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   556
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   557
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   558
	(void) mdb_ctf_type_name(id, buf, sizeof (buf));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   559
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   560
	mdb_tab_insert(mcp, buf);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   561
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   562
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   563
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   564
/*ARGSUSED*/
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   565
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   566
mdb_tab_complete_module(void *data, const mdb_map_t *mp, const char *name)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   567
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   568
	(void) mdb_ctf_type_iter(name, tab_complete_type, data);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   569
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   570
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   571
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   572
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   573
mdb_tab_complete_type(mdb_tab_cookie_t *mcp, const char *name, uint_t flags)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   574
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   575
	mdb_tgt_t *t = mdb.m_target;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   576
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   577
	mcp->mtc_cba = (void *)(uintptr_t)flags;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   578
	if (name != NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   579
		mdb_tab_setmbase(mcp, name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   580
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   581
	(void) mdb_tgt_object_iter(t, mdb_tab_complete_module, mcp);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   582
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   583
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   584
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   585
/*ARGSUSED*/
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   586
static int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   587
tab_complete_member(const char *name, mdb_ctf_id_t id, ulong_t off, void *arg)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   588
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   589
	mdb_tab_cookie_t *mcp = arg;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   590
	mdb_tab_insert(mcp, name);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   591
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   592
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   593
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   594
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   595
mdb_tab_complete_member_by_id(mdb_tab_cookie_t *mcp, mdb_ctf_id_t id,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   596
    const char *member)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   597
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   598
	if (member != NULL)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   599
		mdb_tab_setmbase(mcp, member);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   600
	(void) mdb_ctf_member_iter(id, tab_complete_member, mcp);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   601
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   602
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   603
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   604
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   605
mdb_tab_complete_member(mdb_tab_cookie_t *mcp, const char *type,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   606
    const char *member)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   607
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   608
	mdb_ctf_id_t id;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   609
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   610
	if (mdb_ctf_lookup_by_name(type, &id) != 0)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   611
		return (-1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   612
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   613
	return (mdb_tab_complete_member_by_id(mcp, id, member));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   614
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   615
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   616
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   617
mdb_tab_complete_mt(mdb_tab_cookie_t *mcp, uint_t flags, int argc,
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   618
    const mdb_arg_t *argv)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   619
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   620
	char tn[MDB_SYM_NAMLEN];
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   621
	int ret;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   622
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   623
	if (argc == 0 && !(flags & DCMD_TAB_SPACE))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   624
		return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   625
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   626
	if (argc == 0)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   627
		return (mdb_tab_complete_type(mcp, NULL, MDB_TABC_MEMBERS));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   628
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   629
	if ((ret = mdb_tab_typename(&argc, &argv, tn, sizeof (tn))) < 0)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   630
		return (ret);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   631
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   632
	if (argc == 1 && (!(flags & DCMD_TAB_SPACE) || ret == 1))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   633
		return (mdb_tab_complete_type(mcp, tn, MDB_TABC_MEMBERS));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   634
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   635
	if (argc == 1 && (flags & DCMD_TAB_SPACE))
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   636
		return (mdb_tab_complete_member(mcp, tn, NULL));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   637
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   638
	if (argc == 2)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   639
		return (mdb_tab_complete_member(mcp, tn, argv[1].a_un.a_str));
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   640
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   641
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   642
}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   643
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   644
/*
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   645
 * This is similar to mdb_print.c's args_to_typename, but it has subtle
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   646
 * differences surrounding how the strings of one element are handled that have
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   647
 * 'struct', 'enum', or 'union' in them and instead works with them for tab
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   648
 * completion purposes.
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   649
 */
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   650
int
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   651
mdb_tab_typename(int *argcp, const mdb_arg_t **argvp, char *buf, size_t len)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   652
{
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   653
	int argc = *argcp;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   654
	const mdb_arg_t *argv = *argvp;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   655
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   656
	if (argc < 1 || argv->a_type != MDB_TYPE_STRING)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   657
		return (DCMD_USAGE);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   658
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   659
	if (strcmp(argv->a_un.a_str, "struct") == 0 ||
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   660
	    strcmp(argv->a_un.a_str, "enum") == 0 ||
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   661
	    strcmp(argv->a_un.a_str, "union") == 0) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   662
		if (argc == 1) {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   663
			(void) mdb_snprintf(buf, len, "%s ",
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   664
			    argv[0].a_un.a_str);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   665
			return (1);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   666
		}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   667
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   668
		if (argv[1].a_type != MDB_TYPE_STRING)
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   669
			return (DCMD_USAGE);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   670
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   671
		(void) mdb_snprintf(buf, len, "%s %s",
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   672
		    argv[0].a_un.a_str, argv[1].a_un.a_str);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   673
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   674
		*argcp = argc - 1;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   675
		*argvp = argv + 1;
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   676
	} else {
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   677
		(void) mdb_snprintf(buf, len, "%s", argv[0].a_un.a_str);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   678
	}
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   679
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   680
	return (0);
32dde9989090 2701 Add tab completion support for mdb
Matt Amdur <matt.amdur@delphix.com>
parents:
diff changeset
   681
}