New helper to add markers

The add_marker() function is used to create a new marker and add it at
the right spot to the relevant marker list. Use it in the
add_string_markers() helper (which gets slightly quicker by it).

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Uwe Kleine-König 2025-01-14 11:09:29 +01:00 committed by David Gibson
parent 7da5d106c7
commit 605dc044c3
1 changed files with 37 additions and 15 deletions

View File

@ -139,26 +139,48 @@ static const char *delim_end[] = {
[TYPE_STRING] = "", [TYPE_STRING] = "",
}; };


/*
* The invariants in the marker list are:
* - offsets are non-strictly monotonically increasing
* - for a single offset there is at most one type marker
* - for a single offset that has both a type marker and non-type markers, the
* type marker appears before the others.
*/
static struct marker **add_marker(struct marker **mi,
enum markertype type, unsigned int offset, char *ref)
{
struct marker *nm;

while (*mi && (*mi)->offset < offset)
mi = &(*mi)->next;

if (*mi && (*mi)->offset == offset && is_type_marker((*mi)->type)) {
if (is_type_marker(type))
return mi;
mi = &(*mi)->next;
}

if (*mi && (*mi)->offset == offset && type == (*mi)->type)
return mi;

nm = xmalloc(sizeof(*nm));
nm->type = type;
nm->offset = offset;
nm->ref = ref;
nm->next = *mi;
*mi = nm;

return &nm->next;
}

static void add_string_markers(struct property *prop) static void add_string_markers(struct property *prop)
{ {
int l, len = prop->val.len; int l, len = prop->val.len;
const char *p = prop->val.val; const char *p = prop->val.val;
struct marker **mi = &prop->val.markers;


for (l = strlen(p) + 1; l < len; l += strlen(p + l) + 1) { for (l = strlen(p) + 1; l < len; l += strlen(p + l) + 1)
struct marker *m, **nextp; mi = add_marker(mi, TYPE_STRING, l, NULL);

m = xmalloc(sizeof(*m));
m->offset = l;
m->type = TYPE_STRING;
m->ref = NULL;
m->next = NULL;

/* Find the end of the markerlist */
nextp = &prop->val.markers;
while (*nextp)
nextp = &((*nextp)->next);
*nextp = m;
}
} }


static enum markertype guess_value_type(struct property *prop) static enum markertype guess_value_type(struct property *prop)