Lines Matching +full:led +full:- +full:cur
10 * See the COPYING file in the top-level directory.
16 * key-vals = [ key-val { ',' key-val } [ ',' ] ]
17 * key-val = key '=' val | help
18 * key = key-fragment { '.' key-fragment }
19 * key-fragment = qapi-name | index
20 * qapi-name = '__' / [a-z0-9.-]+ / '_' / [A-Za-z][A-Za-z0-9_-]* /
21 * index = / [0-9]+ /
27 * key-vals specifies a JSON object, i.e. a tree whose root is an
31 * Each key-val = key-fragment '.' ... '=' val specifies a path from
36 * L '.' key-fragment is a child of the node denoted by path L
37 * key-fragment is a child of the tree root
38 * If key-fragment is numeric, the parent is an array and the child
39 * is its key-fragment-th member, counting from zero.
41 * key-fragment.
44 * constraints must be satisfiable. Counter-example: a.b=1,a=2 is
52 * If multiple key-val denote the same leaf, the last one determines
55 * Key-fragments must be valid QAPI names or consist only of decimal
58 * The length of any key-fragment must be between 1 and 127.
60 * If any key-val is help, the object is to be treated as a help
63 * Design flaw: there is no way to denote an empty array or non-root
65 * (removing a key-val from the input string removes the member when
82 * key-vals = [ key-val-1st { ',' key-val } [ ',' ] ]
83 * key-val-1st = val-no-key | key-val
84 * val-no-key = / [^=,]+ / - help
86 * where val-no-key is syntactic sugar for implied-key=val-no-key.
103 * Convert all leading decimal digits to a (non-negative) number,
105 * If @end is non-null, assign a pointer to the first character after
119 return -EINVAL; in key_to_index()
123 return ret == -ERANGE ? INT_MAX : ret; in key_to_index()
129 * Ensure @cur maps @key_in_cur the right way.
132 * If @cur doesn't have @key_in_cur, put an empty QDict or @value,
145 static QObject *keyval_parse_put(QDict *cur, in keyval_parse_put() argument
152 old = qdict_get(cur, key_in_cur); in keyval_parse_put()
156 (int)(key_cursor - key), key); in keyval_parse_put()
167 qdict_put_obj(cur, key_in_cur, new); in keyval_parse_put()
191 QDict *cur; in keyval_parse_one() local
219 * applies to @cur. @key_in_cur[] holds the previous fragment. in keyval_parse_one()
221 cur = qdict; in keyval_parse_one()
226 len = end - s; in keyval_parse_one()
235 (int)(key_end - key), key); in keyval_parse_one()
247 next = keyval_parse_put(cur, key_in_cur, NULL, in keyval_parse_one()
248 key, s - 1, errp); in keyval_parse_one()
252 cur = qobject_to(QDict, next); in keyval_parse_one()
253 assert(cur); in keyval_parse_one()
268 val = g_string_new_len(params, val_end - params); in keyval_parse_one()
276 (int)(s - key), key); in keyval_parse_one()
295 if (!keyval_parse_put(cur, key_in_cur, qstring_from_gstring(val), in keyval_parse_one()
307 for (p = key; p; p = p->next) { in reassemble_key()
309 g_string_prepend(s, (char *)p->data); in reassemble_key()
318 * @str is the path that led to the * current dictionary (to be used for
324 size_t save_len = str->len; in keyval_do_merge()
329 old_value = qdict_get(dest, ent->key); in keyval_do_merge()
331 if (qobject_type(old_value) != qobject_type(ent->value)) { in keyval_do_merge()
333 str->str, ent->key); in keyval_do_merge()
335 } else if (qobject_type(ent->value) == QTYPE_QDICT) { in keyval_do_merge()
336 /* Merge sub-dictionaries. */ in keyval_do_merge()
337 g_string_append(str, ent->key); in keyval_do_merge()
340 qobject_to(QDict, ent->value), in keyval_do_merge()
344 } else if (qobject_type(ent->value) == QTYPE_QLIST) { in keyval_do_merge()
347 QList *new = qobject_to(QList, ent->value); in keyval_do_merge()
350 qobject_ref(item->value); in keyval_do_merge()
351 qlist_append_obj(old, item->value); in keyval_do_merge()
355 assert(qobject_type(ent->value) == QTYPE_QSTRING); in keyval_do_merge()
359 qobject_ref(ent->value); in keyval_do_merge()
360 qdict_put_obj(dest, ent->key, ent->value); in keyval_do_merge()
370 * - lists are concatenated
372 * - dictionaries are merged recursively
374 * - for scalar values, @merged wins
379 * .merge_lists = true case, or to implement -set for options backed by QDicts.
396 * Listify @cur recursively.
398 * @key_of_cur is the list of key fragments leading up to @cur.
399 * On success, return either @cur or its replacement.
402 static QObject *keyval_listify(QDict *cur, GSList *key_of_cur, Error **errp) in keyval_listify() argument
418 * Recursively listify @cur's members, and figure out whether @cur in keyval_listify()
423 for (ent = qdict_first(cur); ent; ent = qdict_next(cur, ent)) { in keyval_listify()
424 if (key_to_index(ent->key, NULL) >= 0) { in keyval_listify()
430 qdict = qobject_to(QDict, ent->value); in keyval_listify()
435 key_node.data = ent->key; in keyval_listify()
440 if (val != ent->value) { in keyval_listify()
441 qdict_put_obj(cur, ent->key, val); in keyval_listify()
452 return QOBJECT(cur); in keyval_listify()
455 /* Copy @cur's values to @elt[] */ in keyval_listify()
456 nelt = qdict_size(cur) + 1; /* one extra, for use as sentinel */ in keyval_listify()
458 max_index = -1; in keyval_listify()
459 for (ent = qdict_first(cur); ent; ent = qdict_next(cur, ent)) { in keyval_listify()
460 index = key_to_index(ent->key, NULL); in keyval_listify()
470 if ((size_t)index >= nelt - 1) { in keyval_listify()
474 elt[index] = ent->value; in keyval_listify()
484 assert(!elt[nelt-1]); /* need the sentinel to be null */ in keyval_listify()