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

📄 exconvrt.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    switch (Base)    {    case 10:        /* Setup max length for the decimal number */        switch (DataWidth)        {        case 1:            DecimalLength = ACPI_MAX8_DECIMAL_DIGITS;            break;        case 4:            DecimalLength = ACPI_MAX32_DECIMAL_DIGITS;            break;        case 8:        default:            DecimalLength = ACPI_MAX64_DECIMAL_DIGITS;            break;        }        SupressZeros = TRUE;     /* No leading zeros */        Remainder = 0;        for (i = DecimalLength; i > 0; i--)        {            /* Divide by nth factor of 10 */            Digit = Integer;            for (j = 0; j < i; j++)            {                (void) AcpiUtShortDivide (Digit, 10, &Digit, &Remainder);            }            /* Handle leading zeros */            if (Remainder != 0)            {                SupressZeros = FALSE;            }            if (!SupressZeros)            {                String[k] = (UINT8) (ACPI_ASCII_ZERO + Remainder);                k++;            }        }        break;    case 16:        /* HexLength: 2 ascii hex chars per data byte */        HexLength = (ACPI_NATIVE_UINT) ACPI_MUL_2 (DataWidth);        for (i = 0, j = (HexLength-1); i < HexLength; i++, j--)        {            /* Get one hex digit, most significant digits first */            String[k] = (UINT8) AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j));            k++;        }        break;    default:        return (0);    }    /*     * Since leading zeros are supressed, we must check for the case where     * the integer equals 0     *     * Finally, null terminate the string and return the length     */    if (!k)    {        String [0] = ACPI_ASCII_ZERO;        k = 1;    }    String [k] = 0;    return ((UINT32) k);}/******************************************************************************* * * FUNCTION:    AcpiExConvertToString * * PARAMETERS:  ObjDesc         - Object to be converted.  Must be an *                                Integer, Buffer, or String *              ResultDesc      - Where the string object is returned *              Type            - String flags (base and conversion type) * * RETURN:      Status * * DESCRIPTION: Convert an ACPI Object to a string * ******************************************************************************/ACPI_STATUSAcpiExConvertToString (    ACPI_OPERAND_OBJECT     *ObjDesc,    ACPI_OPERAND_OBJECT     **ResultDesc,    UINT32                  Type){    ACPI_OPERAND_OBJECT     *ReturnDesc;    UINT8                   *NewBuf;    UINT32                  i;    UINT32                  StringLength = 0;    UINT16                  Base = 16;    UINT8                   Separator = ',';    ACPI_FUNCTION_TRACE_PTR (ExConvertToString, ObjDesc);    switch (ACPI_GET_OBJECT_TYPE (ObjDesc))    {    case ACPI_TYPE_STRING:        /* No conversion necessary */        *ResultDesc = ObjDesc;        return_ACPI_STATUS (AE_OK);    case ACPI_TYPE_INTEGER:        switch (Type)        {        case ACPI_EXPLICIT_CONVERT_DECIMAL:            /* Make room for maximum decimal number */            StringLength = ACPI_MAX_DECIMAL_DIGITS;            Base = 10;            break;        default:            /* Two hex string characters for each integer byte */            StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth);            break;        }        /*         * Create a new String         * Need enough space for one ASCII integer (plus null terminator)         */        ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength);        if (!ReturnDesc)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        NewBuf = ReturnDesc->Buffer.Pointer;        /* Convert integer to string */        StringLength = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base,                            NewBuf, AcpiGbl_IntegerByteWidth);        /* Null terminate at the correct place */        ReturnDesc->String.Length = StringLength;        NewBuf [StringLength] = 0;        break;    case ACPI_TYPE_BUFFER:        /* Setup string length, base, and separator */        switch (Type)        {        case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */            /*             * From ACPI: "If Data is a buffer, it is converted to a string of             * decimal values separated by commas."             */            Base = 10;            /*             * Calculate the final string length.  Individual string values             * are variable length (include separator for each)             */            for (i = 0; i < ObjDesc->Buffer.Length; i++)            {                if (ObjDesc->Buffer.Pointer[i] >= 100)                {                    StringLength += 4;                }                else if (ObjDesc->Buffer.Pointer[i] >= 10)                {                    StringLength += 3;                }                else                {                    StringLength += 2;                }            }            break;        case ACPI_IMPLICIT_CONVERT_HEX:            /*             * From the ACPI spec:             *"The entire contents of the buffer are converted to a string of             * two-character hexadecimal numbers, each separated by a space."             */            Separator = ' ';            StringLength = (ObjDesc->Buffer.Length * 3);            break;        case ACPI_EXPLICIT_CONVERT_HEX:     /* Used by ToHexString */            /*             * From ACPI: "If Data is a buffer, it is converted to a string of             * hexadecimal values separated by commas."             */            StringLength = (ObjDesc->Buffer.Length * 3);            break;        default:            return_ACPI_STATUS (AE_BAD_PARAMETER);        }        /*         * Create a new string object and string buffer         * (-1 because of extra separator included in StringLength from above)         */        ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) (StringLength - 1));        if (!ReturnDesc)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        NewBuf = ReturnDesc->Buffer.Pointer;        /*         * Convert buffer bytes to hex or decimal values         * (separated by commas or spaces)         */        for (i = 0; i < ObjDesc->Buffer.Length; i++)        {            NewBuf += AcpiExConvertToAscii (                        (ACPI_INTEGER) ObjDesc->Buffer.Pointer[i], Base,                        NewBuf, 1);            *NewBuf++ = Separator; /* each separated by a comma or space */        }        /*         * Null terminate the string         * (overwrites final comma/space from above)         */        NewBuf--;        *NewBuf = 0;        break;    default:        return_ACPI_STATUS (AE_TYPE);    }    *ResultDesc = ReturnDesc;    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiExConvertToTargetType * * PARAMETERS:  DestinationType     - Current type of the destination *              SourceDesc          - Source object to be converted. *              ResultDesc          - Where the converted object is returned *              WalkState           - Current method state * * RETURN:      Status * * DESCRIPTION: Implements "implicit conversion" rules for storing an object. * ******************************************************************************/ACPI_STATUSAcpiExConvertToTargetType (    ACPI_OBJECT_TYPE        DestinationType,    ACPI_OPERAND_OBJECT     *SourceDesc,    ACPI_OPERAND_OBJECT     **ResultDesc,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status = AE_OK;    ACPI_FUNCTION_TRACE (ExConvertToTargetType);    /* Default behavior */    *ResultDesc = SourceDesc;    /*     * If required by the target,     * perform implicit conversion on the source before we store it.     */    switch (GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs))    {    case ARGI_SIMPLE_TARGET:    case ARGI_FIXED_TARGET:    case ARGI_INTEGER_REF:      /* Handles Increment, Decrement cases */        switch (DestinationType)        {        case ACPI_TYPE_LOCAL_REGION_FIELD:            /*             * Named field can always handle conversions             */            break;        default:            /* No conversion allowed for these types */            if (DestinationType != ACPI_GET_OBJECT_TYPE (SourceDesc))            {                ACPI_DEBUG_PRINT ((ACPI_DB_INFO,                    "Explicit operator, will store (%s) over existing type (%s)\n",                    AcpiUtGetObjectTypeName (SourceDesc),                    AcpiUtGetTypeName (DestinationType)));                Status = AE_TYPE;            }        }        break;    case ARGI_TARGETREF:        switch (DestinationType)        {        case ACPI_TYPE_INTEGER:        case ACPI_TYPE_BUFFER_FIELD:        case ACPI_TYPE_LOCAL_BANK_FIELD:        case ACPI_TYPE_LOCAL_INDEX_FIELD:            /*             * These types require an Integer operand.  We can convert             * a Buffer or a String to an Integer if necessary.             */            Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,                        16);            break;        case ACPI_TYPE_STRING:            /*             * The operand must be a String.  We can convert an             * Integer or Buffer if necessary             */            Status = AcpiExConvertToString (SourceDesc, ResultDesc,                        ACPI_IMPLICIT_CONVERT_HEX);            break;        case ACPI_TYPE_BUFFER:            /*             * The operand must be a Buffer.  We can convert an             * Integer or String if necessary             */            Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc);            break;        default:            ACPI_ERROR ((AE_INFO, "Bad destination type during conversion: %X",                DestinationType));            Status = AE_AML_INTERNAL;            break;        }        break;    case ARGI_REFERENCE:        /*         * CreateXxxxField cases - we are storing the field object into the name         */        break;    default:        ACPI_ERROR ((AE_INFO,            "Unknown Target type ID 0x%X AmlOpcode %X DestType %s",            GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs),            WalkState->Opcode, AcpiUtGetTypeName (DestinationType)));        Status = AE_AML_INTERNAL;    }    /*     * Source-to-Target conversion semantics:     *     * If conversion to the target type cannot be performed, then simply     * overwrite the target with the new object and type.     */    if (Status == AE_TYPE)    {        Status = AE_OK;    }    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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