From patchwork Mon May 6 18:20:47 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yann E. MORIN" X-Patchwork-Id: 2524861 Return-Path: X-Original-To: patchwork-linux-kbuild@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id B2509DF230 for ; Mon, 6 May 2013 18:20:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754177Ab3EFSU4 (ORCPT ); Mon, 6 May 2013 14:20:56 -0400 Received: from mail-wi0-f180.google.com ([209.85.212.180]:57991 "EHLO mail-wi0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752781Ab3EFSUz (ORCPT ); Mon, 6 May 2013 14:20:55 -0400 Received: by mail-wi0-f180.google.com with SMTP id h11so2849911wiv.13 for ; Mon, 06 May 2013 11:20:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=9qFusInOocoidCtm1w+aSXyPFeeuyiKhPtkdcecFQD0=; b=GTyHOmc5IXdVR6LILpiGMpukqiSbW8aMLEpqFFYsXFuY6x29QcBiHBhoqoweoyEz1n hlDpevnJPHus7hsamF3bPSvUbsO7lLTWEuyCZhxe3Rnm/IA45uSRQcZ5oTawaFnwLTj9 O0AjNgS8Ag1H5LePE0Bz6nhMHxSRXnN/8fAFWvIEwQjhPjI+9Hl4iABSF4SvruT7ioBE aZ9kU4jaItE/c6cxhpx7Uqm+LqiWMbakHV2aXe7aIIL/dcDrrS8J4AtuG1svEMDNN5pf DG9MT12jvWtY83h3OhBri+251+4hLdnd5f1X2uIjX8+eEwWNov38tuhCYZcqMjiWGcCs sopQ== X-Received: by 10.194.71.241 with SMTP id y17mr26753870wju.31.1367864454248; Mon, 06 May 2013 11:20:54 -0700 (PDT) Received: from gourin.bzh.lan (ks3095497.kimsufi.com. [94.23.60.27]) by mx.google.com with ESMTPSA id ed20sm16992548wic.0.2013.05.06.11.20.52 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 06 May 2013 11:20:53 -0700 (PDT) From: "Yann E. MORIN" To: linux-kbuild@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "Yann E. MORIN" , Jean Delvare , Michal Marek , Roland Eggner , Wang YanQing Subject: [PATCH] kconfig: sort found symbols by relevance Date: Mon, 6 May 2013 20:20:47 +0200 Message-Id: <1367864447-30456-1-git-send-email-yann.morin.1998@free.fr> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1367826629.4494.30.camel@chaos.site> References: <1367826629.4494.30.camel@chaos.site> Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org From: "Yann E. MORIN" When searching for symbols, return the symbols sorted by relevance. Relevance is the ratio of the length of the matched string and the length of the symbol name. Symbols of equal relevance are sorted alphabetically. Reported-by: Jean Delvare Signed-off-by: "Yann E. MORIN" Cc: Jean Delvare Cc: Michal Marek Cc: Roland Eggner Cc: Wang YanQing --- scripts/kconfig/symbol.c | 66 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index ecc5aa5..baba030 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -943,38 +943,86 @@ const char *sym_escape_string_value(const char *in) return res; } +struct sym_match { + struct symbol *sym; + int rel; +}; + +/* Compare matched symbols as thus: + * - highest relevance first + * - equal relevance sorted alphabetically + */ +static int sym_rel_comp( const void *sym1, const void *sym2 ) +{ + struct sym_match **s1 = (struct sym_match **)sym1; + struct sym_match **s2 = (struct sym_match **)sym2; + + if ( (*s1)->rel > (*s2)->rel ) + return -1; + else if ( (*s1)->rel < (*s2)->rel ) + return 1; + else + return strcmp( (*s1)->sym->name, (*s2)->sym->name ); +} + struct symbol **sym_re_search(const char *pattern) { struct symbol *sym, **sym_arr = NULL; + struct sym_match **sym_match_arr = NULL; int i, cnt, size; regex_t re; + regmatch_t match[1]; cnt = size = 0; /* Skip if empty */ if (strlen(pattern) == 0) return NULL; - if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) + if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE)) return NULL; for_all_symbols(i, sym) { + struct sym_match *tmp_sym_match; if (sym->flags & SYMBOL_CONST || !sym->name) continue; - if (regexec(&re, sym->name, 0, NULL, 0)) + if (regexec(&re, sym->name, 1, match, 0)) continue; if (cnt + 1 >= size) { - void *tmp = sym_arr; + void *tmp; size += 16; - sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); - if (!sym_arr) { - free(tmp); - return NULL; + tmp = realloc(sym_match_arr, size * sizeof(struct sym_match *)); + if (!tmp) { + goto sym_re_search_free; } + sym_match_arr = tmp; } sym_calc_value(sym); - sym_arr[cnt++] = sym; + tmp_sym_match = (struct sym_match*)malloc(sizeof(struct sym_match)); + if (!tmp_sym_match) + goto sym_re_search_free; + tmp_sym_match->sym = sym; + /* As regexec return 0, we know we have a match, so + * we can use match[0].rm_[se]o without further checks + */ + tmp_sym_match->rel = (100*(match[0].rm_eo-match[0].rm_so)) + /strlen(sym->name); + sym_match_arr[cnt++] = tmp_sym_match; } - if (sym_arr) + + if( sym_match_arr ) { + qsort( sym_match_arr, cnt, sizeof(struct sym_match*), sym_rel_comp ); + sym_arr = malloc( (cnt+1) * sizeof(struct symbol) ); + if (!sym_arr) + goto sym_re_search_free; + for ( i=0; isym; sym_arr[cnt] = NULL; + } +sym_re_search_free: + if (sym_match_arr) { + for ( i=0; i