patch-2.4.0-test3 linux/drivers/acpi/parser/psscope.c
Next file: linux/drivers/acpi/parser/pstree.c
Previous file: linux/drivers/acpi/parser/psparse.c
Back to the patch index
Back to the overall index
- Lines: 272
- Date:
Wed Jul 5 11:23:13 2000
- Orig file:
v2.4.0-test2/linux/drivers/acpi/parser/psscope.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.0-test2/linux/drivers/acpi/parser/psscope.c linux/drivers/acpi/parser/psscope.c
@@ -0,0 +1,271 @@
+/******************************************************************************
+ *
+ * Module Name: psscope - Parser scope stack management routines
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 R. Byron Moore
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include "acpi.h"
+#include "parser.h"
+
+#define _COMPONENT PARSER
+ MODULE_NAME ("psscope");
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_get_parent_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ *
+ * RETURN: Pointer to an Op object
+ *
+ * DESCRIPTION: Get parent of current op being parsed
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_OP *
+acpi_ps_get_parent_scope (
+ ACPI_PARSE_STATE *parser_state)
+{
+ return parser_state->scope->op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_has_completed_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ *
+ * RETURN: Boolean, TRUE = scope completed.
+ *
+ * DESCRIPTION: Is parsing of current argument complete? Determined by
+ * 1) AML pointer is at or beyond the end of the scope
+ * 2) The scope argument count has reached zero.
+ *
+ ******************************************************************************/
+
+u8
+acpi_ps_has_completed_scope (
+ ACPI_PARSE_STATE *parser_state)
+{
+ return (u8) ((parser_state->aml >= parser_state->scope->arg_end ||
+ !parser_state->scope->arg_count));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_init_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ * Root - the root object of this new scope
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocate and init a new scope object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_ps_init_scope (
+ ACPI_PARSE_STATE *parser_state,
+ ACPI_GENERIC_OP *root)
+{
+ ACPI_PARSE_SCOPE *scope;
+
+
+ scope = acpi_cm_callocate (sizeof (ACPI_PARSE_SCOPE));
+ if (!scope) {
+ return AE_NO_MEMORY;
+ }
+
+ scope->op = root;
+ scope->arg_count = ACPI_VAR_ARGS;
+ scope->arg_end = parser_state->aml_end;
+ scope->pkg_end = parser_state->aml_end;
+ parser_state->scope = scope;
+ parser_state->start_op = root;
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_push_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ * Op - Current op to be pushed
+ * Next_arg - Next op argument (to be pushed)
+ * Arg_count - Fixed or variable number of args
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push current op to begin parsing its argument
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_ps_push_scope (
+ ACPI_PARSE_STATE *parser_state,
+ ACPI_GENERIC_OP *op,
+ u32 remaining_args,
+ u32 arg_count)
+{
+ ACPI_PARSE_SCOPE *scope = parser_state->scope_avail;
+
+
+ if (scope) {
+ /* grabbed scope from available list */
+
+ parser_state->scope_avail = scope->parent;
+ }
+
+ else {
+ /* allocate scope from the heap */
+
+ scope = (ACPI_PARSE_SCOPE*) acpi_cm_allocate (sizeof (ACPI_PARSE_SCOPE));
+ if (!scope) {
+ return (AE_NO_MEMORY);
+ }
+ }
+
+ /* Always zero out the scope before init */
+
+ MEMSET (scope, 0, sizeof (*scope));
+
+ scope->op = op;
+ scope->arg_list = remaining_args;
+ scope->arg_count = arg_count;
+ scope->pkg_end = parser_state->pkg_end;
+ scope->parent = parser_state->scope;
+ parser_state->scope = scope;
+
+ if (arg_count == ACPI_VAR_ARGS) {
+ /* multiple arguments */
+
+ scope->arg_end = parser_state->pkg_end;
+ }
+
+ else {
+ /* single argument */
+
+ scope->arg_end = ACPI_MAX_AML;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_pop_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ * Op - Where the popped op is returned
+ * Next_arg - Where the popped "next argument" is
+ * returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return to parsing a previous op
+ *
+ ******************************************************************************/
+
+void
+acpi_ps_pop_scope (
+ ACPI_PARSE_STATE *parser_state,
+ ACPI_GENERIC_OP **op,
+ u32 *arg_list)
+{
+ ACPI_PARSE_SCOPE *scope = parser_state->scope;
+
+
+ if (scope->parent) {
+ /* return to parsing previous op */
+
+ *op = scope->op;
+ *arg_list = scope->arg_list;
+ parser_state->pkg_end = scope->pkg_end;
+ parser_state->scope = scope->parent;
+
+ /* add scope to available list */
+
+ scope->parent = parser_state->scope_avail;
+ parser_state->scope_avail = scope;
+ }
+
+ else {
+ /* empty parse stack, prepare to fetch next opcode */
+
+ *op = NULL;
+ *arg_list = 0;
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_ps_cleanup_scope
+ *
+ * PARAMETERS: Parser_state - Current parser state object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Destroy available list, remaining stack levels, and return
+ * root scope
+ *
+ ******************************************************************************/
+
+void
+acpi_ps_cleanup_scope (
+ ACPI_PARSE_STATE *parser_state)
+{
+ ACPI_PARSE_SCOPE *scope;
+
+
+ if (!parser_state) {
+ return;
+ }
+
+ /* destroy available list */
+
+ while (parser_state->scope_avail) {
+ scope = parser_state->scope_avail;
+ parser_state->scope_avail = scope->parent;
+ acpi_cm_free (scope);
+ }
+
+ /* destroy scope stack */
+
+ while (parser_state->scope) {
+ scope = parser_state->scope;
+ parser_state->scope = scope->parent;
+ acpi_cm_free (scope);
+ }
+
+ return;
+}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)