u32 acpi_ns_build_normalized_path(struct acpi_namespace_node *node, char *full_path, u32 path_size, u8 no_trailing) { u32 length = 0, i; char name[ACPI_NAME_SIZE]; u8 do_no_trailing; char c, *left, *right; struct acpi_namespace_node *next_node; ACPI_FUNCTION_TRACE_PTR(ns_build_normalized_path, node); #define ACPI_PATH_PUT8(path, size, byte, length) \ do { \ if ((length) < (size)) \ { \ (path)[(length)] = (byte); \ } \ (length)++; \ } while (0) /* * Make sure the path_size is correct, so that we don't need to * validate both full_path and path_size. */ if (!full_path) { path_size = 0; } if (!node) { goto build_trailing_null; } next_node = node; while (next_node && next_node != acpi_gbl_root_node) { if (next_node != node) { ACPI_PATH_PUT8(full_path, path_size, AML_DUAL_NAME_PREFIX, length); } ACPI_MOVE_32_TO_32(name, &next_node->name); do_no_trailing = no_trailing; for (i = 0; i < 4; i++) { c = name[4 - i - 1]; if (do_no_trailing && c != '_') { do_no_trailing = FALSE; } if (!do_no_trailing) { ACPI_PATH_PUT8(full_path, path_size, c, length); } } next_node = next_node->parent; } ACPI_PATH_PUT8(full_path, path_size, AML_ROOT_PREFIX, length); /* Reverse the path string */ if (length <= path_size) { left = full_path; right = full_path + length - 1; while (left < right) { c = *left; *left++ = *right; *right-- = c; } } /* Append the trailing null */ build_trailing_null: ACPI_PATH_PUT8(full_path, path_size, '\0', length); #undef ACPI_PATH_PUT8 return_UINT32(length); }
UINT32 AcpiNsBuildNormalizedPath ( ACPI_NAMESPACE_NODE *Node, char *FullPath, UINT32 PathSize, BOOLEAN NoTrailing) { UINT32 Length = 0, i; char Name[ACPI_NAME_SIZE]; BOOLEAN DoNoTrailing; char c, *Left, *Right; ACPI_NAMESPACE_NODE *NextNode; ACPI_FUNCTION_TRACE_PTR (NsBuildNormalizedPath, Node); #define ACPI_PATH_PUT8(Path, Size, Byte, Length) \ do { \ if ((Length) < (Size)) \ { \ (Path)[(Length)] = (Byte); \ } \ (Length)++; \ } while (0) /* * Make sure the PathSize is correct, so that we don't need to * validate both FullPath and PathSize. */ if (!FullPath) { PathSize = 0; } if (!Node) { goto BuildTrailingNull; } NextNode = Node; while (NextNode && NextNode != AcpiGbl_RootNode) { if (NextNode != Node) { ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); } ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); DoNoTrailing = NoTrailing; for (i = 0; i < 4; i++) { c = Name[4-i-1]; if (DoNoTrailing && c != '_') { DoNoTrailing = FALSE; } if (!DoNoTrailing) { ACPI_PATH_PUT8(FullPath, PathSize, c, Length); } } NextNode = NextNode->Parent; } ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); /* Reverse the path string */ if (Length <= PathSize) { Left = FullPath; Right = FullPath+Length - 1; while (Left < Right) { c = *Left; *Left++ = *Right; *Right-- = c; } } /* Append the trailing null */ BuildTrailingNull: ACPI_PATH_PUT8 (FullPath, PathSize, '\0', Length); #undef ACPI_PATH_PUT8 return_UINT32 (Length); }