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.0 |