From owner-acpi-jp@jp.freebsd.org  Sat Aug  5 17:56:02 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id RAA83422;
	Sat, 5 Aug 2000 17:56:02 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id RAA83417
	for <acpi-jp@jp.freebsd.org>; Sat, 5 Aug 2000 17:56:02 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (iwasaki.imasy.or.jp [202.227.24.92])
	by tasogare.imasy.or.jp (8.10.1+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e758u0p91455
	for <acpi-jp@jp.freebsd.org>; Sat, 5 Aug 2000 17:56:00 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <20000805175555M.iwasaki@jp.FreeBSD.org>
Date: Sat, 05 Aug 2000 17:55:55 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 107
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 523
Subject: [acpi-jp 523] New API: aml_apply_foreach_found_objects()
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

ACPI $B$K$h$k(B PnP $B$J(B device enumeration $B$K$b$-$C$HLrN)$D$H;W$$!"(B
Namespace $B$rA`:n$9$k?7$7$$(B API $B$rDI2C<BAu$7$^$7$?!#$D$$$G$K(B amldb $B$b(B
$B$3$l$r;H$&$h$&JQ99$7$^$7$?!#(B

aml_apply_foreach_found_objects(aml_get_rootname(), "_PS0",
    eval_given_named_object);
$B$3$s$J46$8$G;H$$$^$9!#$3$NNc$G$O!"(Broot $B$+$i$9$Y$F$N(B _PS0 
($B%G%P%$%9$r(B D0 $B$XA+0\$5$;$k%a%=%C%I(B) $B$N(B named object $B$r$5$,$7$F(B
$B4X?t(B eval_given_named_object(struct aml_name *) $B$r=g<!E,MQ$7$^$9!#(B

PnP $B$G$O(B _CRS $B$H$+(B _HID $B$H$+$G$5$,$9$H;W$$$^$9$,NI$/J,$+$j$^$;$s(B (^^;
$BDI2C$7$F$b32$OL5$$$H;W$$$^$9$N$G!":#HU$d$C$F$*$-$^$9!#(B

Index: sys/dev/acpi/aml/aml_name.c
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_name.c,v
retrieving revision 1.11
diff -u -r1.11 aml_name.c
--- sys/dev/acpi/aml/aml_name.c	2000/07/13 04:18:06	1.11
+++ sys/dev/acpi/aml/aml_name.c	2000/08/05 06:42:23
@@ -114,6 +114,30 @@
 	return (NULL);
 }
 
+void
+aml_apply_foreach_found_objects(struct aml_name *parent, char *name,
+    int (*func)(struct aml_name *))
+{
+	struct	aml_name *child, *ptr;
+
+	/* function to apply must be specified */
+	if (func == NULL) {
+		return;
+	}
+
+	if ((child = aml_find_from_namespace(parent, name)) != NULL) {
+		/* if function call was failed, stop searching */
+		if (func(child) != 0) {
+			return;
+		}
+	}
+
+	for (ptr = parent->child; ptr; ptr = ptr->brother) {
+		/* do more searching */
+		aml_apply_foreach_found_objects(ptr, name, func);
+	}
+}
+
 struct aml_name_group *
 aml_new_name_group(int id)
 {
Index: sys/dev/acpi/aml/aml_name.h
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_name.h,v
retrieving revision 1.13
diff -u -r1.13 aml_name.h
--- sys/dev/acpi/aml/aml_name.h	2000/07/13 04:18:06	1.13
+++ sys/dev/acpi/aml/aml_name.h	2000/08/05 06:44:58
@@ -66,6 +66,8 @@
 void			 aml_delete_name_group(struct aml_name_group *);
 
 struct aml_name		*aml_find_from_namespace(struct aml_name *, char *);
+void			 aml_apply_foreach_found_objects(struct aml_name *,
+			     char *, int (*)(struct aml_name *));
 struct aml_name		*aml_search_name(struct aml_environ *, u_int8_t *);
 struct aml_name		*aml_create_name(struct aml_environ *, u_int8_t *);
 
Index: usr.sbin/acpi/amldb/debug.c
===================================================================
RCS file: /home/cvs/ACPI/usr.sbin/acpi/amldb/debug.c,v
retrieving revision 1.15
diff -u -r1.15 debug.c
--- usr.sbin/acpi/amldb/debug.c	2000/07/13 06:06:36	1.15
+++ usr.sbin/acpi/amldb/debug.c	2000/08/05 08:13:26
@@ -49,17 +49,13 @@
 
 #include "debug.h"
 
-static void
-find_named_objects(struct aml_name *parent, char *name)
+static int
+print_named_object(struct aml_name *name)
 {
-	struct	aml_name *child, *ptr;
+	aml_print_curname(name);
+	printf("\n");
 
-	if ((child = aml_find_from_namespace(parent, name)) != NULL) {
-		aml_print_curname(child);
-		printf("\n");
-	}
-	for (ptr = parent->child; ptr; ptr = ptr->brother)
-		find_named_objects(ptr, name);
+	return (0);	/* always return success to continue the search */
 }
 
 void 
@@ -291,7 +287,8 @@
 			while (ptr[0] == ' ')
 				ptr++;
 
-			find_named_objects(aml_get_rootname(), ptr);
+			aml_apply_foreach_found_objects(aml_get_rootname(),
+			    ptr, print_named_object);
 			break;
 		case 'h':
 			fputs("s	Single step\n"
