⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsutils.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
 * * DESCRIPTION: Calculate the length of the internal (AML) namestring *              corresponding to the external (ASL) namestring. * ******************************************************************************/voidAcpiNsGetInternalNameLength (    ACPI_NAMESTRING_INFO    *Info){    char                    *NextExternalChar;    UINT32                  i;    ACPI_FUNCTION_ENTRY ();    NextExternalChar = Info->ExternalName;    Info->NumCarats = 0;    Info->NumSegments = 0;    Info->FullyQualified = FALSE;    /*     * For the internal name, the required length is 4 bytes per segment, plus     * 1 each for RootPrefix, MultiNamePrefixOp, segment count, trailing null     * (which is not really needed, but no there's harm in putting it there)     *     * strlen() + 1 covers the first NameSeg, which has no path separator     */    if (AcpiNsValidRootPrefix (NextExternalChar[0]))    {        Info->FullyQualified = TRUE;        NextExternalChar++;    }    else    {        /*         * Handle Carat prefixes         */        while (*NextExternalChar == '^')        {            Info->NumCarats++;            NextExternalChar++;        }    }    /*     * Determine the number of ACPI name "segments" by counting the number of     * path separators within the string. Start with one segment since the     * segment count is [(# separators) + 1], and zero separators is ok.     */    if (*NextExternalChar)    {        Info->NumSegments = 1;        for (i = 0; NextExternalChar[i]; i++)        {            if (AcpiNsValidPathSeparator (NextExternalChar[i]))            {                Info->NumSegments++;            }        }    }    Info->Length = (ACPI_NAME_SIZE * Info->NumSegments) +                    4 + Info->NumCarats;    Info->NextExternalChar = NextExternalChar;}/******************************************************************************* * * FUNCTION:    AcpiNsBuildInternalName * * PARAMETERS:  Info            - Info struct fully initialized * * RETURN:      Status * * DESCRIPTION: Construct the internal (AML) namestring *              corresponding to the external (ASL) namestring. * ******************************************************************************/ACPI_STATUSAcpiNsBuildInternalName (    ACPI_NAMESTRING_INFO    *Info){    UINT32                  NumSegments = Info->NumSegments;    char                    *InternalName = Info->InternalName;    char                    *ExternalName = Info->NextExternalChar;    char                    *Result = NULL;    ACPI_NATIVE_UINT        i;    ACPI_FUNCTION_TRACE (NsBuildInternalName);    /* Setup the correct prefixes, counts, and pointers */    if (Info->FullyQualified)    {        InternalName[0] = '\\';        if (NumSegments <= 1)        {            Result = &InternalName[1];        }        else if (NumSegments == 2)        {            InternalName[1] = AML_DUAL_NAME_PREFIX;            Result = &InternalName[2];        }        else        {            InternalName[1] = AML_MULTI_NAME_PREFIX_OP;            InternalName[2] = (char) NumSegments;            Result = &InternalName[3];        }    }    else    {        /*         * Not fully qualified.         * Handle Carats first, then append the name segments         */        i = 0;        if (Info->NumCarats)        {            for (i = 0; i < Info->NumCarats; i++)            {                InternalName[i] = '^';            }        }        if (NumSegments <= 1)        {            Result = &InternalName[i];        }        else if (NumSegments == 2)        {            InternalName[i] = AML_DUAL_NAME_PREFIX;            Result = &InternalName[(ACPI_NATIVE_UINT) (i+1)];        }        else        {            InternalName[i] = AML_MULTI_NAME_PREFIX_OP;            InternalName[(ACPI_NATIVE_UINT) (i+1)] = (char) NumSegments;            Result = &InternalName[(ACPI_NATIVE_UINT) (i+2)];        }    }    /* Build the name (minus path separators) */    for (; NumSegments; NumSegments--)    {        for (i = 0; i < ACPI_NAME_SIZE; i++)        {            if (AcpiNsValidPathSeparator (*ExternalName) ||               (*ExternalName == 0))            {                /* Pad the segment with underscore(s) if segment is short */                Result[i] = '_';            }            else            {                /* Convert the character to uppercase and save it */                Result[i] = (char) ACPI_TOUPPER ((int) *ExternalName);                ExternalName++;            }        }        /* Now we must have a path separator, or the pathname is bad */        if (!AcpiNsValidPathSeparator (*ExternalName) &&            (*ExternalName != 0))        {            return_ACPI_STATUS (AE_BAD_PARAMETER);        }        /* Move on the next segment */        ExternalName++;        Result += ACPI_NAME_SIZE;    }    /* Terminate the string */    *Result = 0;    if (Info->FullyQualified)    {        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n",            InternalName, InternalName));    }    else    {        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",            InternalName, InternalName));    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiNsInternalizeName * * PARAMETERS:  *ExternalName           - External representation of name *              **Converted Name        - Where to return the resulting *                                        internal represention of the name * * RETURN:      Status * * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0") *              to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) * *******************************************************************************/ACPI_STATUSAcpiNsInternalizeName (    char                    *ExternalName,    char                    **ConvertedName){    char                    *InternalName;    ACPI_NAMESTRING_INFO    Info;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (NsInternalizeName);    if ((!ExternalName)      ||        (*ExternalName == 0) ||        (!ConvertedName))    {        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /* Get the length of the new internal name */    Info.ExternalName = ExternalName;    AcpiNsGetInternalNameLength (&Info);    /* We need a segment to store the internal  name */    InternalName = ACPI_ALLOCATE_ZEROED (Info.Length);    if (!InternalName)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    /* Build the name */    Info.InternalName = InternalName;    Status = AcpiNsBuildInternalName (&Info);    if (ACPI_FAILURE (Status))    {        ACPI_FREE (InternalName);        return_ACPI_STATUS (Status);    }    *ConvertedName = InternalName;    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiNsExternalizeName * * PARAMETERS:  InternalNameLength  - Lenth of the internal name below *              InternalName        - Internal representation of name *              ConvertedNameLength - Where the length is returned *              ConvertedName       - Where the resulting external name *                                    is returned * * RETURN:      Status * * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) *              to its external (printable) form (e.g. "\_PR_.CPU0") * ******************************************************************************/ACPI_STATUSAcpiNsExternalizeName (    UINT32                  InternalNameLength,    char                    *InternalName,    UINT32                  *ConvertedNameLength,    char                    **ConvertedName){    ACPI_NATIVE_UINT        NamesIndex = 0;    ACPI_NATIVE_UINT        NumSegments = 0;    ACPI_NATIVE_UINT        RequiredLength;    ACPI_NATIVE_UINT        PrefixLength = 0;    ACPI_NATIVE_UINT        i = 0;    ACPI_NATIVE_UINT        j = 0;    ACPI_FUNCTION_TRACE (NsExternalizeName);    if (!InternalNameLength     ||        !InternalName           ||        !ConvertedName)    {        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /*     * Check for a prefix (one '\' | one or more '^').     */    switch (InternalName[0])    {    case '\\':        PrefixLength = 1;        break;    case '^':        for (i = 0; i < InternalNameLength; i++)        {            if (InternalName[i] == '^')            {                PrefixLength = i + 1;            }            else            {                break;            }        }        if (i == InternalNameLength)        {            PrefixLength = i;        }        break;    default:        break;    }    /*     * Check for object names.  Note that there could be 0-255 of these     * 4-byte elements.     */    if (PrefixLength < InternalNameLength)    {        switch (InternalName[PrefixLength])        {        case AML_MULTI_NAME_PREFIX_OP:            /* <count> 4-byte names */            NamesIndex = PrefixLength + 2;            NumSegments = (ACPI_NATIVE_UINT) (UINT8)                          InternalName[(ACPI_NATIVE_UINT) (PrefixLength + 1)];            break;        case AML_DUAL_NAME_PREFIX:            /* Two 4-byte names */            NamesIndex = PrefixLength + 1;            NumSegments = 2;            break;        case 0:            /* NullName */            NamesIndex = 0;            NumSegments = 0;            break;        default:            /* one 4-byte name */            NamesIndex = PrefixLength;            NumSegments = 1;            break;        }    }    /*     * Calculate the length of ConvertedName, which equals the length     * of the prefix, length of all object names, length of any required     * punctuation ('.') between object names, plus the NULL terminator.     */    RequiredLength = PrefixLength + (4 * NumSegments) +                        ((NumSegments > 0) ? (NumSegments - 1) : 0) + 1;    /*     * Check to see if we're still in bounds.  If not, there's a problem     * with InternalName (invalid format).     */    if (RequiredLength > InternalNameLength)    {        ACPI_ERROR ((AE_INFO, "Invalid internal name"));        return_ACPI_STATUS (AE_BAD_PATHNAME);    }    /*     * Build ConvertedName

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -