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

📄 aslutils.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
        Gbl_InputByteCount, TotalKeywords);    /* AML summary */    if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))    {        FlPrintFile (FileId,            "AML Output: %s - %d bytes %d named objects %d executable opcodes\n\n",            Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,            TotalNamedObjects, TotalExecutableOpcodes);    }    /* Error summary */    FlPrintFile (FileId,        "Compilation complete. %d Errors, %d Warnings, %d Remarks, %d Optimizations\n",        Gbl_ExceptionCount[ASL_ERROR],        Gbl_ExceptionCount[ASL_WARNING] +            Gbl_ExceptionCount[ASL_WARNING2] +            Gbl_ExceptionCount[ASL_WARNING3],        Gbl_ExceptionCount[ASL_REMARK],        Gbl_ExceptionCount[ASL_OPTIMIZATION]);}/******************************************************************************* * * FUNCTION:    UtDisplaySummary * * PARAMETERS:  Op              - Integer parse node *              LowValue        - Smallest allowed value *              HighValue       - Largest allowed value * * RETURN:      Op if OK, otherwise NULL * * DESCRIPTION: Check integer for an allowable range * ******************************************************************************/ACPI_PARSE_OBJECT *UtCheckIntegerRange (    ACPI_PARSE_OBJECT       *Op,    UINT32                  LowValue,    UINT32                  HighValue){    char                    *ParseError = NULL;    char                    Buffer[64];    if (!Op)    {        return NULL;    }    if (Op->Asl.Value.Integer < LowValue)    {        ParseError = "Value below valid range";        Op->Asl.Value.Integer = LowValue;    }    if (Op->Asl.Value.Integer > HighValue)    {        ParseError = "Value above valid range";        Op->Asl.Value.Integer = HighValue;    }    if (ParseError)    {        sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);        AslCompilererror (Buffer);        return NULL;    }    return Op;}/******************************************************************************* * * FUNCTION:    UtGetStringBuffer * * PARAMETERS:  Length          - Size of buffer requested * * RETURN:      Pointer to the buffer.  Aborts on allocation failure * * DESCRIPTION: Allocate a string buffer.  Bypass the local *              dynamic memory manager for performance reasons (This has a *              major impact on the speed of the compiler.) * ******************************************************************************/char *UtGetStringBuffer (    UINT32                  Length){    char                    *Buffer;    if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)    {        Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);        Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +                                Length;    }    Buffer = Gbl_StringCacheNext;    Gbl_StringCacheNext += Length;    return (Buffer);}/******************************************************************************* * * FUNCTION:    UtInternalizeName * * PARAMETERS:  ExternalName            - Name to convert *              ConvertedName           - Where the converted name is returned * * RETURN:      Status * * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name * ******************************************************************************/ACPI_STATUSUtInternalizeName (    char                    *ExternalName,    char                    **ConvertedName){    ACPI_NAMESTRING_INFO    Info;    ACPI_STATUS             Status;    if (!ExternalName)    {        return (AE_OK);    }    /* Get the length of the new internal name */    Info.ExternalName = ExternalName;    AcpiNsGetInternalNameLength (&Info);    /* We need a segment to store the internal  name */    Info.InternalName = UtGetStringBuffer (Info.Length);    if (!Info.InternalName)    {        return (AE_NO_MEMORY);    }    /* Build the name */    Status = AcpiNsBuildInternalName (&Info);    if (ACPI_FAILURE (Status))    {        return (Status);    }    *ConvertedName = Info.InternalName;    return (AE_OK);}/******************************************************************************* * * FUNCTION:    UtPadNameWithUnderscores * * PARAMETERS:  NameSeg         - Input nameseg *              PaddedNameSeg   - Output padded nameseg * * RETURN:      Padded nameseg. * * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full *              ACPI_NAME. * ******************************************************************************/static voidUtPadNameWithUnderscores (    char                    *NameSeg,    char                    *PaddedNameSeg){    UINT32                  i;    for (i = 0; (i < ACPI_NAME_SIZE); i++)    {        if (*NameSeg)        {            *PaddedNameSeg = *NameSeg;            NameSeg++;        }        else        {            *PaddedNameSeg = '_';        }        PaddedNameSeg++;    }}/******************************************************************************* * * FUNCTION:    UtAttachNameseg * * PARAMETERS:  Op              - Parent parse node *              Name            - Full ExternalName * * RETURN:      None; Sets the NameSeg field in parent node * * DESCRIPTION: Extract the last nameseg of the ExternalName and store it *              in the NameSeg field of the Op. * ******************************************************************************/static voidUtAttachNameseg (    ACPI_PARSE_OBJECT       *Op,    char                    *Name){    char                    *NameSeg;    char                    PaddedNameSeg[4];    if (!Name)    {        return;    }    /* Look for the last dot in the namepath */    NameSeg = strrchr (Name, '.');    if (NameSeg)    {        /* Found last dot, we have also found the final nameseg */        NameSeg++;        UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);    }    else    {        /* No dots in the namepath, there is only a single nameseg. */        /* Handle prefixes */        while ((*Name == '\\') || (*Name == '^'))        {            Name++;        }        /* Remaing string should be one single nameseg */        UtPadNameWithUnderscores (Name, PaddedNameSeg);    }    strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);}/******************************************************************************* * * FUNCTION:    UtAttachNamepathToOwner * * PARAMETERS:  Op            - Parent parse node *              NameOp        - Node that contains the name * * RETURN:      Sets the ExternalName and Namepath in the parent node * * DESCRIPTION: Store the name in two forms in the parent node:  The original *              (external) name, and the internalized name that is used within *              the ACPI namespace manager. * ******************************************************************************/voidUtAttachNamepathToOwner (    ACPI_PARSE_OBJECT       *Op,    ACPI_PARSE_OBJECT       *NameOp){    ACPI_STATUS             Status;    /* Full external path */    Op->Asl.ExternalName = NameOp->Asl.Value.String;    /* Save the NameOp for possible error reporting later */    Op->Asl.ParentMethod = (void *) NameOp;    /* Last nameseg of the path */    UtAttachNameseg (Op, Op->Asl.ExternalName);    /* Create internalized path */    Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);    if (ACPI_FAILURE (Status))    {        /* TBD: abort on no memory */    }}/******************************************************************************* * * FUNCTION:    UtDoConstant * * PARAMETERS:  String      - Hex, Octal, or Decimal string * * RETURN:      Converted Integer * * DESCRIPTION: Convert a string to an integer.  With error checking. * ******************************************************************************/ACPI_INTEGERUtDoConstant (    char                    *String){    ACPI_STATUS             Status;    ACPI_INTEGER            Converted;    char                    ErrBuf[64];    Status = UtStrtoul64 (String, 0, &Converted);    if (ACPI_FAILURE (Status))    {        sprintf (ErrBuf, "%s %s\n", "Conversion error:",            AcpiFormatException (Status));        AslCompilererror (ErrBuf);    }    return (Converted);}/* TBD: use version in ACPI CA main code base? *//******************************************************************************* * * FUNCTION:    UtStrtoul64 * * PARAMETERS:  String          - Null terminated string *              Terminater      - Where a pointer to the terminating byte is *                                returned *              Base            - Radix of the string * * RETURN:      Converted value * * DESCRIPTION: Convert a string into an unsigned value. * ******************************************************************************/static ACPI_STATUSUtStrtoul64 (    char                    *String,    UINT32                  Base,    ACPI_INTEGER            *RetInteger){    UINT32                  Index;    UINT32                  Sign;    ACPI_INTEGER            ReturnValue = 0;    ACPI_STATUS             Status = AE_OK;    *RetInteger = 0;    switch (Base)    {    case 0:    case 8:    case 10:    case 16:        break;    default:        /*         * The specified Base parameter is not in the domain of         * this function:         */        return (AE_BAD_PARAMETER);    }    /* Skip over any white space in the buffer: */    while (isspace (*String) || *String == '\t')    {        ++String;    }    /*     * The buffer may contain an optional plus or minus sign.     * If it does, then skip over it but remember what is was:     */    if (*String == '-')    {        Sign = NEGATIVE;        ++String;    }    else if (*String == '+')    {        ++String;        Sign = POSITIVE;    }    else    {        Sign = POSITIVE;    }    /*     * If the input parameter Base is zero, then we need to     * determine if it is octal, decimal, or hexadecimal:     */    if (Base == 0)    {        if (*String == '0')        {            if (tolower (*(++String)) == 'x')            {                Base = 16;                ++String;            }            else            {                Base = 8;            }        }        else        {            Base = 10;        }    }    /*     * For octal and hexadecimal bases, skip over the leading     * 0 or 0x, if they are present.     */    if (Base == 8 && *String == '0')    {        String++;    }    if (Base == 16 &&        *String == '0' &&        tolower (*(++String)) == 'x')    {        String++;    }    /* Main loop: convert the string to an unsigned long */    while (*String)    {        if (isdigit (*String))        {            Index = ((UINT8) *String) - '0';        }        else        {            Index = (UINT8) toupper (*String);            if (isupper ((char) Index))            {                Index = Index - 'A' + 10;            }            else            {                goto ErrorExit;            }        }        if (Index >= Base)        {            goto ErrorExit;        }        /* Check to see if value is out of range: */        if (ReturnValue > ((ACPI_INTEGER_MAX - (ACPI_INTEGER) Index) /                            (ACPI_INTEGER) Base))        {            goto ErrorExit;        }        else        {            ReturnValue *= Base;            ReturnValue += Index;        }        ++String;    }    /* If a minus sign was present, then "the conversion is negated": */    if (Sign == NEGATIVE)    {        ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;    }    *RetInteger = ReturnValue;    return (Status);ErrorExit:    switch (Base)    {    case 8:        Status = AE_BAD_OCTAL_CONSTANT;        break;    case 10:        Status = AE_BAD_DECIMAL_CONSTANT;        break;    case 16:        Status = AE_BAD_HEX_CONSTANT;        break;    default:        /* Base validated above */        break;    }    return (Status);}

⌨️ 快捷键说明

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