All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joey Pabalinas <joeypabalinas@gmail.com>
To: linux-kbuild@vger.kernel.org
Cc: Ulf Magnusson <ulfalizer@gmail.com>,
	Masahiro Yamada <yamada.masahiro@socionext.com>,
	linux-kernel@vger.kernel.org,
	Joey Pabalinas <joeypabalinas@gmail.com>
Subject: [PATCH v2] scripts/kconfig: cleanup symbol handling code
Date: Sat, 10 Mar 2018 00:56:59 -1000	[thread overview]
Message-ID: <20180310105659.7e34lk4kvcbl64lg@gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 6531 bytes --]

Many of the variable names in scripts/kconfig/symbol.c are
far too terse to the point of not at all identifying _what_
they are actually used for (`p` and `l` as a couple examples),
and overall there is a large amount of code that could use
some cleaning up.

Give more explicit names to these variables, fix a couple cases
where different variables were sharing the same name and shadowing
each other, and overall cleanup a bit of the messiness in
sym_expand_string_value() and sym_escape_string_value()
while maintaining equivalent program behavior.

Suggested-by: Ulf Magnusson <ulfalizer@gmail.com>
Signed-off-by: Joey Pabalinas <joeypabalinas@gmail.com>

 1 file changed, 69 insertions(+), 61 deletions(-)

diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 2220bc4b051bd914e3..9ee32ddb44e193719c 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -5,8 +5,8 @@
 
 #include <ctype.h>
 #include <stdlib.h>
-#include <string.h>
 #include <regex.h>
+#include <linux/string.h>
 #include <sys/utsname.h>
 
 #include "lkc.h"
@@ -337,7 +337,7 @@ void sym_calc_value(struct symbol *sym)
 {
 	struct symbol_value newval, oldval;
 	struct property *prop;
-	struct expr *e;
+	struct expr *expr;
 
 	if (!sym)
 		return;
@@ -469,7 +469,7 @@ void sym_calc_value(struct symbol *sym)
 		struct symbol *choice_sym;
 
 		prop = sym_get_choice_prop(sym);
-		expr_list_for_each_sym(prop->expr, e, choice_sym) {
+		expr_list_for_each_sym(prop->expr, expr, choice_sym) {
 			if ((sym->flags & SYMBOL_WRITE) &&
 			    choice_sym->visible != no)
 				choice_sym->flags |= SYMBOL_WRITE;
@@ -899,94 +899,100 @@ struct symbol *sym_find(const char *name)
  * name to be expanded shall be prefixed by a '$'. Unknown symbol expands to
  * the empty string.
  */
-char *sym_expand_string_value(const char *in)
+char *sym_expand_string_value(const char *src)
 {
-	const char *src;
-	char *res;
-	size_t reslen;
+	const char *in;
+	char *res, *out;
+	size_t res_len, src_len;
 
 	/*
-	 * Note: 'in' might come from a token that's about to be
+	 * Note: 'src' might come from a token that'src about to be
 	 * freed, so make sure to always allocate a new string
 	 */
-	reslen = strlen(in) + 1;
-	res = xmalloc(reslen);
-	res[0] = '\0';
+	res_len = strlen(src) + 1;
+	res = xmalloc(res_len);
+	out = res;
 
-	while ((src = strchr(in, '$'))) {
+	while ((in = strchr(src, '$'))) {
 		char *p, name[SYMBOL_MAXLENGTH];
-		const char *symval = "";
+		const char *sym_val = "";
 		struct symbol *sym;
-		size_t newlen;
+		size_t new_len, sym_len;
 
-		strncat(res, in, src - in);
-		src++;
+		strscpy(out, src, in - src);
+		out += in - src;
+		in++;
 
 		p = name;
-		while (isalnum(*src) || *src == '_')
-			*p++ = *src++;
+		while (isalnum(*in) || *in == '_')
+			*p++ = *in++;
 		*p = '\0';
 
 		sym = sym_find(name);
 		if (sym != NULL) {
 			sym_calc_value(sym);
-			symval = sym_get_string_value(sym);
+			sym_val = sym_get_string_value(sym);
 		}
 
-		newlen = strlen(res) + strlen(symval) + strlen(src) + 1;
-		if (newlen > reslen) {
-			reslen = newlen;
-			res = xrealloc(res, reslen);
+		sym_len = strlen(sym_val);
+		new_len = sym_len + strlen(res) + strlen(in) + 1;
+		if (new_len > res_len) {
+			res_len = new_len;
+			res = xrealloc(res, res_len);
 		}
 
-		strcat(res, symval);
-		in = src;
+		strscpy(out, sym_val, sym_len);
+		out += sym_len;
+		src = in;
 	}
-	strcat(res, in);
+	src_len = strlen(src);
+	strscpy(out, src, src_len);
+	out += src_len;
+	*out = '\0';
 
 	return res;
 }
 
-const char *sym_escape_string_value(const char *in)
+const char *sym_escape_string_value(const char *src)
 {
-	const char *p;
-	size_t reslen;
-	char *res;
-	size_t l;
+	const char *in;
+	size_t res_len, in_len;
+	char *res, *out;
 
-	reslen = strlen(in) + strlen("\"\"") + 1;
+	res_len = strlen(src) + strlen("\"\"") + 1;
 
-	p = in;
+	in = src;
 	for (;;) {
-		l = strcspn(p, "\"\\");
-		p += l;
+		in_len = strcspn(in, "\"\\");
+		in += in_len;
 
-		if (p[0] == '\0')
+		if (*in == '\0')
 			break;
 
-		reslen++;
-		p++;
+		res_len++;
+		in++;
 	}
 
-	res = xmalloc(reslen);
-	res[0] = '\0';
+	res = xmalloc(res_len);
+	out = res;
+	*out++ = '\"';
 
-	strcat(res, "\"");
-
-	p = in;
+	in = src;
 	for (;;) {
-		l = strcspn(p, "\"\\");
-		strncat(res, p, l);
-		p += l;
+		in_len = strcspn(in, "\"\\");
+		strscpy(out, in, in_len);
+		in += in_len;
+		out += in_len;
 
-		if (p[0] == '\0')
+		if (*in == '\0')
 			break;
 
-		strcat(res, "\\");
-		strncat(res, p++, 1);
+		*out++ = '\\';
+		*out++ = *in++;
 	}
+	*out++ = '\"';
+	*out = '\0';
 
-	strcat(res, "\"");
 	return res;
 }
 
@@ -1014,8 +1020,8 @@ static int sym_rel_comp(const void *sym1, const void *sym2)
 	 * exactly; if this is the case, we can't decide which comes first,
 	 * and we fallback to sorting alphabetically.
 	 */
-	exact1 = (s1->eo - s1->so) == strlen(s1->sym->name);
-	exact2 = (s2->eo - s2->so) == strlen(s2->sym->name);
+	exact1 = (s1->eo - s1->so) == (off_t)strlen(s1->sym->name);
+	exact2 = (s2->eo - s2->so) == (off_t)strlen(s2->sym->name);
 	if (exact1 && !exact2)
 		return -1;
 	if (!exact1 && exact2)
@@ -1390,31 +1396,33 @@ const char *prop_get_type_name(enum prop_type type)
 	return "unknown";
 }
 
-static void prop_add_env(const char *env)
+static void prop_add_env(const char *env_key)
 {
 	struct symbol *sym, *sym2;
 	struct property *prop;
-	char *p;
+	char *env_val;
 
 	sym = current_entry->sym;
 	sym->flags |= SYMBOL_AUTO;
 	for_all_properties(sym, prop, P_ENV) {
 		sym2 = prop_get_symbol(prop);
-		if (strcmp(sym2->name, env))
+		if (strcmp(sym2->name, env_key))
 			menu_warn(current_entry, "redefining environment symbol from %s",
 				  sym2->name);
 		return;
 	}
 
 	prop = prop_alloc(P_ENV, sym);
-	prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST));
+	prop->expr = expr_alloc_symbol(sym_lookup(env_key, SYMBOL_CONST));
 
 	sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
 	sym_env_list->right.sym = sym;
+	env_val = getenv(env_key);
 
-	p = getenv(env);
-	if (p)
-		sym_add_default(sym, p);
-	else
-		menu_warn(current_entry, "environment variable %s undefined", env);
+	if (likely(env_val)) {
+		sym_add_default(sym, env_val);
+		return;
+	}
+
+	menu_warn(current_entry, "environment variable %s undefined", env_key);
 }
-- 
2.16.2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

             reply	other threads:[~2018-03-10 10:57 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-10 10:56 Joey Pabalinas [this message]
2018-03-25 16:52 ` [PATCH v2] scripts/kconfig: cleanup symbol handling code Masahiro Yamada
2018-03-26  2:04   ` Joey Pabalinas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180310105659.7e34lk4kvcbl64lg@gmail.com \
    --to=joeypabalinas@gmail.com \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ulfalizer@gmail.com \
    --cc=yamada.masahiro@socionext.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.