[RFC PATCH 27/28] cli: lil: Add a function to quote values

Sean Anderson seanga2 at gmail.com
Thu Jul 1 08:16:10 CEST 2021


This allows us to convert lil_values into a form which can be re-parsed. We
were already doing this for lists, so we just have to expose the inner
loop.

Signed-off-by: Sean Anderson <seanga2 at gmail.com>
---

 common/cli_lil.c | 89 ++++++++++++++++++++++++++++--------------------
 1 file changed, 52 insertions(+), 37 deletions(-)

diff --git a/common/cli_lil.c b/common/cli_lil.c
index 42659920b5..2a8600ffb6 100644
--- a/common/cli_lil.c
+++ b/common/cli_lil.c
@@ -2387,49 +2387,64 @@ braces:
 	return needs;
 }
 
+static enum lil_error do_quote(struct lil_value *val, struct lil_value *item)
+{
+	char q;
+	size_t i;
+
+	switch (item_needs(lil_to_string(item), item->l)) {
+	case NEEDS_NOTHING:
+		return lil_append_val(val, item);
+	case NEEDS_BRACES:
+		return lil_append_char(val, '{') ?:
+			lil_append_val(val, item) ?:
+			lil_append_char(val, '}');
+	case NEEDS_DOUBLE:
+		q = '"';
+		goto quote;
+	case NEEDS_SINGLE:
+		q = '\'';
+quote:
+		if (lil_append_char(val, q))
+			return LIL_ERR_OOM;
+
+		for (i = 0; i < item->l; i++) {
+			char c = item->d[i];
+
+			if (c == '\\' || c == q)
+				if (lil_append_char(val, '\\'))
+					return LIL_ERR_OOM;
+			if (lil_append_char(val, c))
+				return LIL_ERR_OOM;
+		}
+		if (lil_append_char(val, q))
+			return LIL_ERR_OOM;
+	}
+	return LIL_ERR_NONE;
+}
+
+static struct lil_value *lil_quote_value(struct lil_value *val)
+{
+	struct lil_value *r = alloc_value(NULL);
+
+	if (do_quote(r, val)) {
+		lil_free_value(r);
+		return NULL;
+	}
+	return r;
+}
+
 struct lil_value *lil_list_to_value(struct lil_list *list)
 {
 	struct lil_value *val = alloc_value(NULL);
-	size_t i, j;
+	size_t i;
 
 	for (i = 0; i < list->c; i++) {
-		char q;
-		struct lil_value *item = lil_list_get(list, i);
+		if (i && lil_append_char(val, ' '))
+			goto err;
 
-		if (i)
-			lil_append_char(val, ' ');
-
-		switch (item_needs(lil_to_string(item), item->l)) {
-		case NEEDS_NOTHING:
-			if (lil_append_val(val, item))
-				goto err;
-			continue;
-		case NEEDS_BRACES:
-			if (lil_append_char(val, '{') ||
-			    lil_append_val(val, item) ||
-			    lil_append_char(val, '}'))
-				goto err;
-			continue;
-		case NEEDS_DOUBLE:
-			q = '"';
-			goto quote;
-		case NEEDS_SINGLE:
-			q = '\'';
-quote:
-			if (lil_append_char(val, q))
-				goto err;
-			for (j = 0; j < item->l; j++) {
-				char c = item->d[j];
-
-				if (c == '\\' || c == q)
-					if (lil_append_char(val, '\\'))
-						goto err;
-				if (lil_append_char(val, c))
-					goto err;
-			}
-			if (lil_append_char(val, q))
-				goto err;
-		}
+		if (do_quote(val, lil_list_get(list, i)))
+			goto err;
 	}
 	return val;
 
-- 
2.32.0



More information about the U-Boot mailing list