From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6E41746746; Wed, 14 May 2025 15:02:24 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D230240677; Wed, 14 May 2025 15:02:18 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) by mails.dpdk.org (Postfix) with ESMTP id 37EDF402C8 for ; Wed, 14 May 2025 15:02:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1747227737; x=1778763737; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=OZUOKfzNNMhmktkdGB0q4vjm5JDgbVNrgJxYySHYaQU=; b=I/UCA0xljgEPqQZ5w/l8o8UTVfOPJ265sjFHi+2sIU9AiSKW6rafsy1A tBdgJ63boWeYsAwekIjlDrw2YeJsHMKbZIvCEq9f1/P88cYUwqWU25vLI O5y34jJVJtUjSJAQBsEr2gtkjw2nW7TSsoqt8GvNyvprVpI3/fIkQQa3g gs/o11M469iyFMNm++W8MR1/f9wBDwngIlHRDrmFnan2F3WPYQqtvkeTS aMxpQOPEL2wa4m+bCTKo4ro1PGz/HjJ4n6O6ZmVOqpXGyrZOtdY6zIuXO SNYsN0XN7uGmX9Edo/3HMRyo1Yz9jnV5UJf/lrB7qSaPUyIHG7g9Po2X4 g==; X-CSE-ConnectionGUID: aafE3k2sQgGTpOTZXfRR9A== X-CSE-MsgGUID: eMP87D3vTmi4XyteIueqVA== X-IronPort-AV: E=McAfee;i="6700,10204,11433"; a="52926911" X-IronPort-AV: E=Sophos;i="6.15,288,1739865600"; d="scan'208";a="52926911" Received: from fmviesa006.fm.intel.com ([10.60.135.146]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2025 06:02:16 -0700 X-CSE-ConnectionGUID: McXowk5wSXu/146nH8Vnnw== X-CSE-MsgGUID: HjuZW1DQSraqsxwChcMbXg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,288,1739865600"; d="scan'208";a="137921792" Received: from silpixa00401119.ir.intel.com ([10.55.129.167]) by fmviesa006.fm.intel.com with ESMTP; 14 May 2025 06:02:17 -0700 From: Anatoly Burakov To: dev@dpdk.org, Aman Singh Subject: [PATCH v1 2/2] app/testpmd: sort commands by help string Date: Wed, 14 May 2025 14:02:12 +0100 Message-ID: <608636ba99de43497d42f41787fec7005cc2e52b.1747227723.git.anatoly.burakov@intel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <9d6e0ff75abe0185c5a03aecba3269668860a1f7.1747227723.git.anatoly.burakov@intel.com> References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org When using '?' to find commands, it occasionally is difficult to find the needed commands because all commands are not in alphabetical order, but rather can be ordered rather arbitrarily. To address this, use help string to order commands. This sacrifices some amount of grouping (i.e. when tm commands go one after another), but may improve discoverability (and most similar commands tend to have similar help strings and will be located closer together anyway). Signed-off-by: Anatoly Burakov --- app/test-pmd/cmdline.c | 82 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index a8f1b8ad67..c91fe732b6 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -13951,6 +13951,78 @@ testpmd_add_driver_commands(struct testpmd_driver_commands *c) TAILQ_INSERT_TAIL(&driver_commands_head, c, next); } +static int +cmd_cmp(const void *l, const void *r) +{ + cmdline_parse_inst_t *l_cmd = *(cmdline_parse_inst_t * const*)l; + cmdline_parse_inst_t *r_cmd = *(cmdline_parse_inst_t * const*)r; + int l_idx = -1, r_idx = -1; + size_t i; + + /* these commands should always be at the top of the list */ + cmdline_parse_inst_t const *top_cmds[] = { + &cmd_help_brief, + &cmd_help_long, + &cmd_quit, + &cmd_load_from_file, + &cmd_start, + &cmd_stop, + }; + + /* there may be NULL values - push them to the end */ + if (l_cmd == NULL) + return 1; + if (r_cmd == NULL) + return -1; + + /* should circuit on equality - shouldn't happen anyway */ + if (l_cmd == r_cmd) + return 0; + + /* try finding both commands in list header */ + for (i = 0; i < RTE_DIM(top_cmds); i++) { + cmdline_parse_inst_t const *tmp = top_cmds[i]; + if (l_idx == -1 && l_cmd == tmp) + l_idx = i; + if (r_idx == -1 && r_cmd == tmp) + r_idx = i; + } + + if (l_idx >= 0 && r_idx < 0) + /* l in list, r not in list */ + return -1; + if (l_idx < 0 && r_idx >= 0) + /* l not in list, r in list */ + return 1; + if (l_idx >= 0 && r_idx >= 0) + /* both in list */ + return l_idx < r_idx ? -1 : 1; + + /* + * Neither are in top list. Comparing commands is difficult because + * there are multiple types of tokens, some of which are custom and + * cannot be generalized. What we'll do instead is compare help strings, + * because those tend to be fairly consistently specified. + */ + const char *l_helpstr = l_cmd->help_str; + const char *r_helpstr = r_cmd->help_str; + int ret; + + /* some commands do not have help strings, push them to the back */ + if (l_helpstr == NULL && r_helpstr == NULL) + return 0; + if (l_helpstr == NULL) + return 1; + if (r_helpstr == NULL) + return -1; + + /* we need case-insensitive compare */ + ret = strcmp(l_helpstr, r_helpstr); + if (ret == 0) + return 0; + return ret < 0 ? -1 : 1; +} + int init_cmdline(void) { @@ -13962,6 +14034,10 @@ init_cmdline(void) cmd_set_fwd_mode_init(); cmd_set_fwd_retry_mode_init(); + /* sort built-in command array */ + qsort(builtin_ctx, RTE_DIM(builtin_ctx) - 1, sizeof(builtin_ctx[0]), cmd_cmp); + + /* count total number of commands */ count = 0; for (i = 0; builtin_ctx[i] != NULL; i++) count++; @@ -13975,12 +14051,18 @@ init_cmdline(void) if (main_ctx == NULL) return -1; + /* copy built-in commands */ count = 0; for (i = 0; builtin_ctx[i] != NULL; i++, count++) main_ctx[count] = builtin_ctx[i]; + + /* copy driver-specific commands */ TAILQ_FOREACH(c, &driver_commands_head, next) { + size_t start = count; for (i = 0; c->commands[i].ctx != NULL; i++, count++) main_ctx[count] = c->commands[i].ctx; + /* sort driver-specific commands, per driver */ + qsort(&main_ctx[start], i, sizeof(main_ctx[0]), cmd_cmp); } return 0; -- 2.47.1