Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ofw Rewrite of_compatible() using strlist_match().
details: https://anonhg.NetBSD.org/src/rev/135836ab5560
branches: trunk
changeset: 950322:135836ab5560
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Jan 24 19:38:37 2021 +0000
description:
Rewrite of_compatible() using strlist_match().
diffstat:
sys/dev/ofw/ofw_subr.c | 67 ++++++++++++++-----------------------------------
1 files changed, 19 insertions(+), 48 deletions(-)
diffs (96 lines):
diff -r a397a6f1b141 -r 135836ab5560 sys/dev/ofw/ofw_subr.c
--- a/sys/dev/ofw/ofw_subr.c Sun Jan 24 19:35:21 2021 +0000
+++ b/sys/dev/ofw/ofw_subr.c Sun Jan 24 19:38:37 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ofw_subr.c,v 1.46 2021/01/24 17:44:16 thorpej Exp $ */
+/* $NetBSD: ofw_subr.c,v 1.47 2021/01/24 19:38:37 thorpej Exp $ */
/*
* Copyright 1998
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.46 2021/01/24 17:44:16 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_subr.c,v 1.47 2021/01/24 19:38:37 thorpej Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -101,60 +101,31 @@
int
of_compatible(int phandle, const char * const *strings)
{
-
- int len, olen, allocated, nstr, cstr, rv;
- char *buf, sbuf[OFW_MAX_STACK_BUF_SIZE];
- const char *sp, *nsp;
+ char *prop, propbuf[OFW_MAX_STACK_BUF_SIZE];
+ const char *cp;
+ int proplen, match, rv = -1;
- len = OF_getproplen(phandle, "compatible");
- if (len <= 0)
- return (-1);
-
- if (len > sizeof(sbuf)) {
- buf = malloc(len, M_TEMP, M_WAITOK);
- allocated = 1;
- } else {
- buf = sbuf;
- allocated = 0;
+ proplen = OF_getproplen(phandle, "compatible");
+ if (proplen <= 0) {
+ return -1;
}
- /* 'compatible' size should not change. */
- if (OF_getprop(phandle, "compatible", buf, len) != len) {
- rv = -1;
+ prop = kmem_tmpbuf_alloc(proplen, propbuf, sizeof(propbuf), KM_SLEEP);
+
+ if (OF_getprop(phandle, "compatible", prop, proplen) != proplen) {
goto out;
}
- /* count 'compatible' strings */
- sp = buf;
- nstr = 0;
- olen = len;
- while (len && (nsp = memchr(sp, 0, len)) != NULL) {
- nsp++; /* skip over NUL char */
- len -= (nsp - sp);
- sp = nsp;
- nstr++;
+ for (; (cp = *strings) != NULL; strings++) {
+ if ((match = strlist_match(prop, proplen, cp)) != 0) {
+ rv = match - 1;
+ break;
+ }
}
- len = olen;
- sp = buf;
- rv = nstr;
- while (len && (nsp = memchr(sp, 0, len)) != NULL) {
- rv--;
- /* look for a match among the strings provided */
- for (cstr = 0; strings[cstr] != NULL; cstr++)
- if (strcmp(sp, strings[cstr]) == 0)
- goto out;
-
- nsp++; /* skip over NUL char */
- len -= (nsp - sp);
- sp = nsp;
- }
- rv = -1;
-
-out:
- if (allocated)
- free(buf, M_TEMP);
- return (rv);
+ out:
+ kmem_tmpbuf_free(prop, proplen, propbuf);
+ return rv;
}
/*
Home |
Main Index |
Thread Index |
Old Index