1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 16:52:14 +02:00

libfdt: Bring in upstream stringlist functions

These have now landed upstream. The naming is different and in one case the
function signature has changed. Update the code to match.

This applies the following upstream commits by
Thierry Reding <treding@nvidia.com> :

   604e61e fdt: Add functions to retrieve strings
   8702bd1 fdt: Add a function to get the index of a string
   2218387 fdt: Add a function to count strings

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2016-10-02 17:59:28 -06:00
parent 9c07b9877c
commit b02e4044ff
21 changed files with 176 additions and 132 deletions

View File

@@ -538,80 +538,104 @@ int fdt_stringlist_contains(const char *strlist, int listlen, const char *str)
return 0;
}
int fdt_count_strings(const void *fdt, int node, const char *property)
int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)
{
int length, i, count = 0;
const char *list;
const char *list, *end;
int length, count = 0;
list = fdt_getprop(fdt, node, property, &length);
list = fdt_getprop(fdt, nodeoffset, property, &length);
if (!list)
return length;
return -length;
for (i = 0; i < length; i++) {
int len = strlen(list);
end = list + length;
list += len + 1;
i += len;
while (list < end) {
length = strnlen(list, end - list) + 1;
/* Abort if the last string isn't properly NUL-terminated. */
if (list + length > end)
return -FDT_ERR_BADVALUE;
list += length;
count++;
}
return count;
}
int fdt_find_string(const void *fdt, int node, const char *property,
const char *string)
int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
const char *string)
{
int length, len, idx = 0;
const char *list, *end;
int len, index = 0;
list = fdt_getprop(fdt, node, property, &len);
list = fdt_getprop(fdt, nodeoffset, property, &length);
if (!list)
return len;
return -length;
end = list + len;
len = strlen(string);
len = strlen(string) + 1;
end = list + length;
while (list < end) {
int l = strlen(list);
length = strnlen(list, end - list) + 1;
if (l == len && memcmp(list, string, len) == 0)
return index;
/* Abort if the last string isn't properly NUL-terminated. */
if (list + length > end)
return -FDT_ERR_BADVALUE;
list += l + 1;
index++;
if (length == len && memcmp(list, string, length) == 0)
return idx;
list += length;
idx++;
}
return -FDT_ERR_NOTFOUND;
}
int fdt_get_string_index(const void *fdt, int node, const char *property,
int index, const char **output)
const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
const char *property, int idx,
int *lenp)
{
const char *list;
int length, i;
const char *list, *end;
int length;
list = fdt_getprop(fdt, node, property, &length);
list = fdt_getprop(fdt, nodeoffset, property, &length);
if (!list) {
if (lenp)
*lenp = length;
for (i = 0; i < length; i++) {
int len = strlen(list);
return NULL;
}
if (index == 0) {
*output = list;
return 0;
end = list + length;
while (list < end) {
length = strnlen(list, end - list) + 1;
/* Abort if the last string isn't properly NUL-terminated. */
if (list + length > end) {
if (lenp)
*lenp = -FDT_ERR_BADVALUE;
return NULL;
}
list += len + 1;
i += len;
index--;
if (idx == 0) {
if (lenp)
*lenp = length - 1;
return list;
}
list += length;
idx--;
}
return -FDT_ERR_NOTFOUND;
}
if (lenp)
*lenp = -FDT_ERR_NOTFOUND;
int fdt_get_string(const void *fdt, int node, const char *property,
const char **output)
{
return fdt_get_string_index(fdt, node, property, 0, output);
return NULL;
}
int fdt_node_check_compatible(const void *fdt, int nodeoffset,