From: Matthew Wilcox <willy@infradead.org>
Date: Wed, 19 Dec 2018 17:50:30 +0000 (-0500)
Subject: printf: Convert device_node_string to printf_state
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=360cf24efa0d7e7e4433fb69a6ad47795806bb0c;p=users%2Fwilly%2Flinux.git

printf: Convert device_node_string to printf_state

Signed-off-by: Matthew Wilcox <willy@infradead.org>
---

diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index c907eff51bed..375088634bca 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1667,13 +1667,13 @@ char *device_node_gen_full_name(const struct device_node *np, char *buf, char *e
 }
 
 static noinline_for_stack
-char *device_node_string(char *buf, char *end, struct device_node *dn,
-			 struct printf_spec spec, const char *fmt)
+char *device_node_string(struct printf_state *ps, struct device_node *dn)
 {
 	char tbuf[sizeof("xxxx") + 1];
 	const char *p;
 	int ret;
-	char *buf_start = buf;
+	char *buf_start = ps->buf;
+	const char *fmt = ps->fmt + 2;
 	struct property *prop;
 	bool has_mult, pass;
 	static const struct printf_spec num_spec = {
@@ -1683,47 +1683,51 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
 		.base = 10,
 	};
 
-	struct printf_spec str_spec = spec;
+	struct printf_spec str_spec = ps->spec;
 	str_spec.field_width = -1;
 
-	if (!IS_ENABLED(CONFIG_OF))
-		return string(buf, end, "(!OF)", spec);
+	if (!IS_ENABLED(CONFIG_OF)) {
+		printf_string(ps, "(!OF)");
+		return ps->buf;
+	}
 
-	if ((unsigned long)dn < PAGE_SIZE)
-		return string(buf, end, "(null)", spec);
+	if ((unsigned long)dn < PAGE_SIZE) {
+		printf_string(ps, "(null)");
+		return ps->buf;
+	}
 
 	/* simple case without anything any more format specifiers */
-	fmt++;
-	if (fmt[0] == '\0' || strcspn(fmt,"fnpPFcC") > 0)
+	if (fmt[0] == '\0' || strcspn(fmt, "fnpPFcC") > 0)
 		fmt = "f";
 
 	for (pass = false; strspn(fmt,"fnpPFcC"); fmt++, pass = true) {
 		int precision;
 		if (pass) {
-			if (buf < end)
-				*buf = ':';
-			buf++;
+			if (ps->buf < ps->end)
+				*ps->buf = ':';
+			ps->buf++;
 		}
 
 		switch (*fmt) {
 		case 'f':	/* full_name */
-			buf = device_node_gen_full_name(dn, buf, end);
+			ps->buf = device_node_gen_full_name(dn, ps->buf, ps->end);
 			break;
 		case 'n':	/* name */
 			p = kbasename(of_node_full_name(dn));
 			precision = str_spec.precision;
 			str_spec.precision = strchrnul(p, '@') - p;
-			buf = string(buf, end, p, str_spec);
+			ps->buf = string(ps->buf, ps->end, p, str_spec);
 			str_spec.precision = precision;
 			break;
 		case 'p':	/* phandle */
-			buf = number(buf, end, (unsigned int)dn->phandle, num_spec);
+			ps->buf = number(ps->buf, ps->end,
+					(unsigned int)dn->phandle, num_spec);
 			break;
 		case 'P':	/* path-spec */
 			p = kbasename(of_node_full_name(dn));
 			if (!p[1])
 				p = "/";
-			buf = string(buf, end, p, str_spec);
+			ps->buf = string(ps->buf, ps->end, p, str_spec);
 			break;
 		case 'F':	/* flags */
 			tbuf[0] = of_node_check_flag(dn, OF_DYNAMIC) ? 'D' : '-';
@@ -1731,21 +1735,21 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
 			tbuf[2] = of_node_check_flag(dn, OF_POPULATED) ? 'P' : '-';
 			tbuf[3] = of_node_check_flag(dn, OF_POPULATED_BUS) ? 'B' : '-';
 			tbuf[4] = 0;
-			buf = string(buf, end, tbuf, str_spec);
+			ps->buf = string(ps->buf, ps->end, tbuf, str_spec);
 			break;
 		case 'c':	/* major compatible string */
 			ret = of_property_read_string(dn, "compatible", &p);
 			if (!ret)
-				buf = string(buf, end, p, str_spec);
+				ps->buf = string(ps->buf, ps->end, p, str_spec);
 			break;
 		case 'C':	/* full compatible string */
 			has_mult = false;
 			of_property_for_each_string(dn, "compatible", prop, p) {
 				if (has_mult)
-					buf = string(buf, end, ",", str_spec);
-				buf = string(buf, end, "\"", str_spec);
-				buf = string(buf, end, p, str_spec);
-				buf = string(buf, end, "\"", str_spec);
+					ps->buf = string(ps->buf, ps->end, ",", str_spec);
+				ps->buf = string(ps->buf, ps->end, "\"", str_spec);
+				ps->buf = string(ps->buf, ps->end, p, str_spec);
+				ps->buf = string(ps->buf, ps->end, "\"", str_spec);
 
 				has_mult = true;
 			}
@@ -1755,7 +1759,8 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
 		}
 	}
 
-	return widen_string(buf, buf - buf_start, end, spec);
+	printf_widen_string(ps, ps->buf - buf_start);
+	return ps->buf;
 }
 
 /*
@@ -1983,9 +1988,9 @@ char *pointer(struct printf_state *ps, void *ptr)
 	case 'G':
 		return flags_string(ps, ptr);
 	case 'O':
-		switch (fmt[1]) {
+		switch (ps->fmt[1]) {
 		case 'F':
-			return device_node_string(buf, end, ptr, spec, fmt + 1);
+			return device_node_string(ps, ptr);
 		}
 		break;
 	case 'x':