| OFSL(9) | Kernel Developer's Manual | OFSL(9) |
strlist, strlist_next,
strlist_count, strlist_string,
strlist_match, strlist_index,
strlist_append —
#include <sys/systm.h>
const char *
strlist_next(const
char *sl, size_t
slsize, size_t
*cursorp);
void
strlist_count(const
char *sl, size_t
slsize);
const char *
strlist_string(const
char *sl, size_t
slsize, unsigned int
index);
int
strlist_match(const
char *sl, size_t
slsize, const char
*str);
int
strlist_pmatch(const
char *sl, size_t
slsize, const char
*pattern);
int
strlist_index(const
char *sl, size_t
slsize, const char
*str);
bool
strlist_append(char
**slp, size_t
*slsizep, const char
*str);
strlist functions provide a simple way to interact
with OpenFirmware (IEEE 1275) string lists.
An OpenFirmware string list is simply a buffer containing one or more NUL-terminated strings concatenated together. For example, a string list containing the strings “foo”, “bar”, and “baz” would be represented in memory as:
foo\0bar\0baz\0
The following functions are available:
strlist_next(const char *sl,
size_t slsize, size_t
*cursorp)strlist_next(). Each call
to strlist_next() returns the current string and
advances the cursor to the next string in the list. If all strings in the
list have been enumerated, strlist_next() will
return NULL.strlist_count(const char
*sl, size_t slsize)strlist_string(const char
*sl, size_t slsize, unsigned int
index)NULL if the index is out of range.strlist_match(const char
*sl, size_t slsize, const char
*str)strlist_pmatch(const char
*sl, size_t slsize, const char
*pattern)strlist_match(), but uses
pmatch() to compare strings, allowing for wildcard
characters to be specified in pattern.strlist_index(const char
*sl, size_t slsize, const char
*str)strlist_append(char **slp,
size_t *slsizep, const char
*str)NULL and
slsize to 0. Pass these by reference to
strlist_append(). New memory for the string list
will be allocated as needed. The resulting string list can be freed with
kmem_free(). Returns true
if the string was successfully appended to the string list or
false if memory allocation fails.strlist_next():
void
print_stringlist(const char *sl, size_t slsize)
{
const char *cp;
size_t cursor;
printf("There are %u strings in the string list:\n",
strlist_count(sl, slsize));
for (cursor = 0;
(cp = strlist_next(sl, slsize, &cursor) != NULL; ) {
printf("\t%s\n", cp);
}
}
The following example shows a simple way to use
strlist_match():
bool
is_compatible(int phandle, const char *compat_str)
{
char buf[128];
int proplen;
proplen = OF_getprop(phandle, "compatible", buf, sizeof(buf));
return strlist_match(buf, proplen, compat_str) != 0;
}
The following example shows a use of
strlist_pmatch():
bool
is_pc_printer_port(const char *pnp_id_list, size_t list_size)
{
return strlist_pmatch(pnp_id_list, list_size, "PNP04??") != 0;
}
The following example converts an array of strings to a string
list using strlist_append():
char *
string_array_to_string_list(const char **array, int count,
size_t *slsizep)
{
char *sl;
size_t slsize;
int i;
for (i = 0, sl = NULL, slsize = 0; i < count; i++) {
if (!strlist_append(&sl, &slsize, array[i])) {
kmem_free(sl, slsize);
return NULL;
}
}
*slsizep = slsize;
return sl;
}
strlist functions first appeared in
NetBSD 10.0.
| January 20, 2021 | NetBSD 10.1 |