From owner-acpi-jp@jp.freebsd.org  Wed Aug 16 16:21:27 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id QAA83968;
	Wed, 16 Aug 2000 16:21:27 +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 QAA83961
	for <acpi-jp@jp.freebsd.org>; Wed, 16 Aug 2000 16:21:26 +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.2+3.3W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id e7G7LNr89253
	for <acpi-jp@jp.freebsd.org>; Wed, 16 Aug 2000 16:21:23 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
In-Reply-To: <20000815235321X.iwasaki@jp.FreeBSD.org>
References: <20000814181553D.iwasaki@jp.FreeBSD.org>
	<20000815235321X.iwasaki@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: <20000816162123I.iwasaki@jp.FreeBSD.org>
Date: Wed, 16 Aug 2000 16:21:23 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 227
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 575
Subject: [acpi-jp 575] Re: PowerResource control
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> $B$U$H!"$3$NA0DI2C$7$?(B aml_apply_foreach_found_objects() $B$N;EAH$_$r;H$C$F(B
> $B$d$k$3$H$K$9$k$H!"$I$N(B systemlevel $B$N(B PowerResource $B$,BP>]$,$J$k$+$r(B
> $B;XDj$G$-$J$5$=$&$J$N$G!"(Bcallback $B$X2DJQ8D0z?t$rEO$;$k$h$&$K=$@5$7$F$_$^$7$?!#(B

$B$I$&$;$J$N$G(B "\_GPE._L" $B$H$+(B full path $B$G;XDj$7$F(B _GPE $B$N(B wake handler $B$r(B
$BJa$^$($i$l$k$h$&$K$b$7$^$7$?!#:#HU(B commit $B$9$k$N$O$3$A$i$G$9!#(B

Index: sys/dev/acpi/aml/aml_evalobj.c
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_evalobj.c,v
retrieving revision 1.26
diff -u -r1.26 aml_evalobj.c
--- sys/dev/acpi/aml/aml_evalobj.c	2000/08/09 14:47:43	1.26
+++ sys/dev/acpi/aml/aml_evalobj.c	2000/08/15 12:10:29
@@ -306,7 +306,7 @@
  */
 
 int
-aml_eval_name_simple(struct aml_name *name)
+aml_eval_name_simple(struct aml_name *name, va_list ap)
 {
 	struct	aml_environ *env;
 	union	aml_object *ret;
Index: sys/dev/acpi/aml/aml_evalobj.h
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_evalobj.h,v
retrieving revision 1.10
diff -u -r1.10 aml_evalobj.h
--- sys/dev/acpi/aml/aml_evalobj.h	2000/08/08 14:12:05	1.10
+++ sys/dev/acpi/aml/aml_evalobj.h	2000/08/15 14:54:46
@@ -30,11 +30,13 @@
 #ifndef _AML_EVALOBJ_H_
 #define _AML_EVALOBJ_H_
 
+#include <machine/stdarg.h>
+
 union aml_object	*aml_eval_objref(struct aml_environ *,
 					 union aml_object *);
 union aml_object	*aml_eval_name(struct aml_environ *,
 				       struct aml_name *);
-int			 aml_eval_name_simple(struct aml_name *);
+int			 aml_eval_name_simple(struct aml_name *, va_list);
 int			 aml_objtonum(struct aml_environ *,
 				      union aml_object *);
 struct aml_name		*aml_execute_method(struct aml_environ *);
Index: sys/dev/acpi/aml/aml_name.c
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_name.c,v
retrieving revision 1.14
diff -u -r1.14 aml_name.c
--- sys/dev/acpi/aml/aml_name.c	2000/08/09 14:47:43	1.14
+++ sys/dev/acpi/aml/aml_name.c	2000/08/16 06:40:24
@@ -81,6 +81,11 @@
 	return (result);
 }
 
+/*
+ * Parse given namesppace expression and find a first matched object
+ * under given level of the tree by depth first search.
+ */
+
 struct aml_name *
 aml_find_from_namespace(struct aml_name *parent, char *name)
 {
@@ -116,28 +121,111 @@
 	return (NULL);
 }
 
-void
-aml_apply_foreach_found_objects(struct aml_name *parent, char *name,
-    int (*func)(struct aml_name *))
+static void
+_aml_apply_foreach_found_objects(struct aml_name *parent, char *name,
+    int len, int shallow, int (*func)(struct aml_name *, va_list), va_list ap)
 {
 	struct	aml_name *child, *ptr;
 
+	child = ptr = NULL;
+
 	/* 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 (child = parent->child; child; child = child->brother) {
+		if (!strncmp(child->name, name, len)) {
+			/* if function call was failed, stop searching */
+			if (func(child, ap) != 0) {
+				return;
+			}
 		}
 	}
 
+	if (shallow == 1) {
+		return;
+	}
+
 	for (ptr = parent->child; ptr; ptr = ptr->brother) {
 		/* do more searching */
-		aml_apply_foreach_found_objects(ptr, name, func);
+		_aml_apply_foreach_found_objects(ptr, name, len, 0, func, ap);
+	}
+}
+
+/*
+ * Find named objects as many as possible under given level of
+ * namespace, and apply given callback function for each
+ * named objects found.  If the callback function returns non-zero
+ * value, then the search terminates immediately.
+ * Note that object name expression is used as forward substring match,
+ * not exact match.  The name expression "_L" will match for objects
+ * which have name starting with "_L" such as "\_SB_.LID_._LID" and
+ * "\_GPE._L00" and so on. The name expression can include parent object
+ * name in it like "\_GPE._L".  In this case, GPE X level wake handlers
+ * will be found under "\_GPE" in shallow level.
+ */
+
+void
+aml_apply_foreach_found_objects(struct aml_name *start, char *name,
+    int (*func)(struct aml_name *, va_list), ...)
+{
+	int	i, len, has_dot, last_is_dot, shallow;
+	struct	aml_name *child, *parent;
+	va_list	ap;
+
+	shallow = 0;
+	parent = start;
+	if (name[0] == '\\') {
+		name++;
+		parent = &rootname;
+		shallow = 1;
 	}
+
+	len = strlen(name);
+	last_is_dot = 0;
+	/* the last dot should be ignored */
+	if (len > 0 && name[len - 1] == '.') {
+		len--;
+		last_is_dot = 1;
+	}
+
+	has_dot = 0;
+	for (i = 0; i < len - 1; i++) {
+		if (name[i] == '.') {
+			has_dot = 1;
+			break;
+		}
+	}
+
+	/* try to parse expression and find any matched object. */
+	if (has_dot == 1) {
+		child = aml_find_from_namespace(parent, name);
+		if (child == NULL) {
+			return;
+		}
+
+		/*
+		 * we have at least one object matched, search all objects
+		 * under upper level of the found object.
+		 */
+		parent = child->parent;
+
+		/* find the last `.' */
+		for (name = name + len - 1; *name != '.'; name--)
+			;
+		name++;
+		len = strlen(name) - last_is_dot;
+		shallow = 1;
+	}
+
+	if (len > 4) {
+		return;
+	}
+
+	va_start(ap, func);
+	_aml_apply_foreach_found_objects(parent, name, len, shallow, func, ap);
+	va_end(ap);
 }
 
 struct aml_name_group *
Index: sys/dev/acpi/aml/aml_name.h
===================================================================
RCS file: /home/cvs/ACPI/sys/dev/acpi/aml/aml_name.h,v
retrieving revision 1.16
diff -u -r1.16 aml_name.h
--- sys/dev/acpi/aml/aml_name.h	2000/08/09 14:47:43	1.16
+++ sys/dev/acpi/aml/aml_name.h	2000/08/15 12:10:29
@@ -32,6 +32,8 @@
 #ifndef _AML_NAME_H_
 #define _AML_NAME_H_
 
+#include <machine/stdarg.h>
+
 #include <dev/acpi/aml/aml_obj.h>
 
 struct aml_name {
@@ -69,7 +71,7 @@
 
 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 *));
+			     char *, int (*)(struct aml_name *, va_list), ...);
 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.18
diff -u -r1.18 debug.c
--- usr.sbin/acpi/amldb/debug.c	2000/08/09 14:47:56	1.18
+++ usr.sbin/acpi/amldb/debug.c	2000/08/15 12:10:29
@@ -52,8 +52,9 @@
 #include "debug.h"
 
 static int
-print_named_object(struct aml_name *name)
+print_named_object(struct aml_name *name, va_list ap)
 {
+
 	aml_print_curname(name);
 	printf("\n");
 
