From patchwork Mon Feb 20 02:39:14 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Zaborowski X-Patchwork-Id: 142153 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0A4CAB6FA2 for ; Tue, 21 Feb 2012 00:37:48 +1100 (EST) Received: from localhost ([::1]:39812 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzTR1-0000pL-Eq for incoming@patchwork.ozlabs.org; Mon, 20 Feb 2012 08:37:43 -0500 Received: from eggs.gnu.org ([140.186.70.92]:35649) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzTQr-0000p5-TH for qemu-devel@nongnu.org; Mon, 20 Feb 2012 08:37:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RzTQn-0007ED-P8 for qemu-devel@nongnu.org; Mon, 20 Feb 2012 08:37:33 -0500 Received: from mga03.intel.com ([143.182.124.21]:21007) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzTQn-0007E7-GP for qemu-devel@nongnu.org; Mon, 20 Feb 2012 08:37:29 -0500 Received: from azsmga002.ch.intel.com ([10.2.17.35]) by azsmga101.ch.intel.com with ESMTP; 20 Feb 2012 05:37:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.71,315,1320652800"; d="scan'208";a="68340141" Received: from unknown (HELO azaborow-mobl.ger.corp.intel.com) ([10.252.123.58]) by AZSMGA002.ch.intel.com with SMTP; 20 Feb 2012 05:37:24 -0800 Received: by azaborow-mobl.ger.corp.intel.com (sSMTP sendmail emulation); Mon, 20 Feb 2012 03:39:14 +0100 From: Andrzej Zaborowski To: qemu-devel@nongnu.org Date: Mon, 20 Feb 2012 03:39:14 +0100 Message-Id: <1329705554-22225-1-git-send-email-andrew.zaborowski@intel.com> X-Mailer: git-send-email 1.7.1.86.g0e460.dirty X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 143.182.124.21 Subject: [Qemu-devel] [PATCH v3] Add tab-completion for device_add. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Andrzej Zaborowski Signed-off-by: Andrzej Zaborowski --- v2: pass only char *prop_name as qdev_driver_prop_foreach_func parameter, Anthony noted Property was soon going away. v3: use QOM. --- monitor.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 58 insertions(+), 0 deletions(-) diff --git a/monitor.c b/monitor.c index aadbdcb..28f5b9a 100644 --- a/monitor.c +++ b/monitor.c @@ -3917,6 +3917,27 @@ static void block_completion_it(void *opaque, BlockDriverState *bs) } } +static void class_completion_it(ObjectClass *klass, void *opaque) +{ + const char *input = opaque; + const char *name = object_class_get_name(klass); + + if (input[0] == '\0' || !strncmp(name, input, strlen(input))) { + readline_add_completion(cur_mon->rs, name); + } +} + +static int driver_prop_completion_it(Property *info, void *opaque) +{ + const char *input = opaque; + + if (input[0] == '\0' || !strncmp(info->name, input, strlen(input))) { + readline_add_completion(cur_mon->rs, info->name); + } + + return 0; +} + /* NOTE: this parser is an approximate form of the real command parser */ static void parse_cmdline(const char *cmdline, int *pnb_args, char **args) @@ -3957,6 +3978,7 @@ static void monitor_find_completion(const char *cmdline) const char *ptype, *str; const mon_cmd_t *cmd; const KeyDef *key; + char *pkey; parse_cmdline(cmdline, &nb_args, args); #ifdef DEBUG_COMPLETION @@ -3995,6 +4017,7 @@ static void monitor_find_completion(const char *cmdline) goto cleanup; } + key_get_info(cmd->args_type, &pkey); ptype = next_arg_type(cmd->args_type); for(i = 0; i < nb_args - 2; i++) { if (*ptype != '\0') { @@ -4040,9 +4063,44 @@ static void monitor_find_completion(const char *cmdline) } } break; + case 'O': + if (!strcmp(pkey, "device")) { + char *sep = strrchr(str, ','); + + readline_set_completion_index(cur_mon->rs, + strlen(sep ? sep + 1 : str)); + if (sep) { + char *driver = g_strndup(str, strchr(str, ',') - str); + ObjectClass *klass = object_class_by_name(driver); + DeviceClass *info; + Property *prop; + + g_free(driver); + if (!klass) { + break; + } + + info = DEVICE_CLASS(klass); + for (prop = info->props; prop && prop->name; prop++) { + driver_prop_completion_it(prop, sep + 1); + } + if (info->bus_info) { + for (prop = info->bus_info->props; + prop && prop->name; prop++) { + driver_prop_completion_it(prop, sep + 1); + } + } + break; + } + + object_class_foreach(class_completion_it, TYPE_DEVICE, 0, + (void *) str); + } + break; default: break; } + g_free(pkey); } cleanup: