14c52cad2SJung-uk Kim /****************************************************************************** 24c52cad2SJung-uk Kim * 34c52cad2SJung-uk Kim * Module Name: prmacros - Preprocessor #define macro support 44c52cad2SJung-uk Kim * 54c52cad2SJung-uk Kim *****************************************************************************/ 64c52cad2SJung-uk Kim 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 124c52cad2SJung-uk Kim * All rights reserved. 134c52cad2SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 1194c52cad2SJung-uk Kim * Redistribution and use in source and binary forms, with or without 1204c52cad2SJung-uk Kim * modification, are permitted provided that the following conditions 1214c52cad2SJung-uk Kim * are met: 1224c52cad2SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 1234c52cad2SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 1244c52cad2SJung-uk Kim * without modification. 1254c52cad2SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1264c52cad2SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 1274c52cad2SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 1284c52cad2SJung-uk Kim * including a substantially similar Disclaimer requirement for further 1294c52cad2SJung-uk Kim * binary redistribution. 1304c52cad2SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 1314c52cad2SJung-uk Kim * of any contributors may be used to endorse or promote products derived 1324c52cad2SJung-uk Kim * from this software without specific prior written permission. 1334c52cad2SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1474c52cad2SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 1484c52cad2SJung-uk Kim * Software Foundation. 1494c52cad2SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 1514c52cad2SJung-uk Kim 1524c52cad2SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 1534c52cad2SJung-uk Kim 1544c52cad2SJung-uk Kim #define _COMPONENT ASL_PREPROCESSOR 1554c52cad2SJung-uk Kim ACPI_MODULE_NAME ("prmacros") 1564c52cad2SJung-uk Kim 1574c52cad2SJung-uk Kim 1584c52cad2SJung-uk Kim /******************************************************************************* 1594c52cad2SJung-uk Kim * 1604c52cad2SJung-uk Kim * FUNCTION: PrDumpPredefinedNames 1614c52cad2SJung-uk Kim * 1624c52cad2SJung-uk Kim * PARAMETERS: None 1634c52cad2SJung-uk Kim * 1644c52cad2SJung-uk Kim * RETURN: None 1654c52cad2SJung-uk Kim * 1664c52cad2SJung-uk Kim * DESCRIPTION: Dump the list of #defines. Used as the preprocessor starts, to 1674c52cad2SJung-uk Kim * display the names that were defined on the command line. 1684c52cad2SJung-uk Kim * Debug information only. 1694c52cad2SJung-uk Kim * 1704c52cad2SJung-uk Kim ******************************************************************************/ 1714c52cad2SJung-uk Kim 1724c52cad2SJung-uk Kim void 1734c52cad2SJung-uk Kim PrDumpPredefinedNames ( 1744c52cad2SJung-uk Kim void) 1754c52cad2SJung-uk Kim { 1764c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo; 1774c52cad2SJung-uk Kim 1784c52cad2SJung-uk Kim 1796f1f1a63SJung-uk Kim DefineInfo = AslGbl_DefineList; 1804c52cad2SJung-uk Kim while (DefineInfo) 1814c52cad2SJung-uk Kim { 1824c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 1834c52cad2SJung-uk Kim "Predefined #define: %s->%s\n", 1844c52cad2SJung-uk Kim 0, DefineInfo->Identifier, DefineInfo->Replacement); 1854c52cad2SJung-uk Kim 1864c52cad2SJung-uk Kim DefineInfo = DefineInfo->Next; 1874c52cad2SJung-uk Kim } 1884c52cad2SJung-uk Kim } 1894c52cad2SJung-uk Kim 1904c52cad2SJung-uk Kim 1914c52cad2SJung-uk Kim /******************************************************************************* 1924c52cad2SJung-uk Kim * 1934c52cad2SJung-uk Kim * FUNCTION: PrAddDefine 1944c52cad2SJung-uk Kim * 1954c52cad2SJung-uk Kim * PARAMETERS: Identifier - Name to be replaced 1964c52cad2SJung-uk Kim * Replacement - Replacement for Identifier 1974c52cad2SJung-uk Kim * Persist - Keep define across multiple compiles? 1984c52cad2SJung-uk Kim * 1994c52cad2SJung-uk Kim * RETURN: A new define_info struct. NULL on error. 2004c52cad2SJung-uk Kim * 2014c52cad2SJung-uk Kim * DESCRIPTION: Add a new #define to the global list 2024c52cad2SJung-uk Kim * 2034c52cad2SJung-uk Kim ******************************************************************************/ 2044c52cad2SJung-uk Kim 2054c52cad2SJung-uk Kim PR_DEFINE_INFO * 2064c52cad2SJung-uk Kim PrAddDefine ( 2074c52cad2SJung-uk Kim char *Identifier, 2084c52cad2SJung-uk Kim char *Replacement, 2094c52cad2SJung-uk Kim BOOLEAN Persist) 2104c52cad2SJung-uk Kim { 2114c52cad2SJung-uk Kim char *IdentifierString; 2124c52cad2SJung-uk Kim char *ReplacementString; 2134c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo; 2144c52cad2SJung-uk Kim 2154c52cad2SJung-uk Kim 2164c52cad2SJung-uk Kim if (!Replacement) 2174c52cad2SJung-uk Kim { 2184c52cad2SJung-uk Kim Replacement = ""; 2194c52cad2SJung-uk Kim } 2204c52cad2SJung-uk Kim 2214c52cad2SJung-uk Kim /* Check for already-defined first */ 2224c52cad2SJung-uk Kim 2234c52cad2SJung-uk Kim DefineInfo = PrMatchDefine (Identifier); 2244c52cad2SJung-uk Kim if (DefineInfo) 2254c52cad2SJung-uk Kim { 226a009b7dcSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 2274c52cad2SJung-uk Kim "#define: name already exists: %s\n", 2286f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, Identifier); 2294c52cad2SJung-uk Kim 2304c52cad2SJung-uk Kim /* 2314c52cad2SJung-uk Kim * Name already exists. This is only an error if the target name 2324c52cad2SJung-uk Kim * is different. 2334c52cad2SJung-uk Kim */ 2344c52cad2SJung-uk Kim if (strcmp (Replacement, DefineInfo->Replacement)) 2354c52cad2SJung-uk Kim { 2364c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_EXISTING_NAME, 2374c52cad2SJung-uk Kim THIS_TOKEN_OFFSET (Identifier)); 2384c52cad2SJung-uk Kim 2394c52cad2SJung-uk Kim return (NULL); 2404c52cad2SJung-uk Kim } 2414c52cad2SJung-uk Kim 2424c52cad2SJung-uk Kim return (DefineInfo); 2434c52cad2SJung-uk Kim } 2444c52cad2SJung-uk Kim 2454c52cad2SJung-uk Kim /* Copy input strings */ 2464c52cad2SJung-uk Kim 2474c52cad2SJung-uk Kim IdentifierString = UtLocalCalloc (strlen (Identifier) + 1); 2484c52cad2SJung-uk Kim strcpy (IdentifierString, Identifier); 2494c52cad2SJung-uk Kim 2504c52cad2SJung-uk Kim ReplacementString = UtLocalCalloc (strlen (Replacement) + 1); 2514c52cad2SJung-uk Kim strcpy (ReplacementString, Replacement); 2524c52cad2SJung-uk Kim 2534c52cad2SJung-uk Kim /* Init and link new define info struct */ 2544c52cad2SJung-uk Kim 2554c52cad2SJung-uk Kim DefineInfo = UtLocalCalloc (sizeof (PR_DEFINE_INFO)); 2564c52cad2SJung-uk Kim DefineInfo->Replacement = ReplacementString; 2574c52cad2SJung-uk Kim DefineInfo->Identifier = IdentifierString; 2584c52cad2SJung-uk Kim DefineInfo->Persist = Persist; 2594c52cad2SJung-uk Kim 2606f1f1a63SJung-uk Kim if (AslGbl_DefineList) 2614c52cad2SJung-uk Kim { 2626f1f1a63SJung-uk Kim AslGbl_DefineList->Previous = DefineInfo; 2634c52cad2SJung-uk Kim } 2644c52cad2SJung-uk Kim 2656f1f1a63SJung-uk Kim DefineInfo->Next = AslGbl_DefineList; 2666f1f1a63SJung-uk Kim AslGbl_DefineList = DefineInfo; 2674c52cad2SJung-uk Kim return (DefineInfo); 2684c52cad2SJung-uk Kim } 2694c52cad2SJung-uk Kim 2704c52cad2SJung-uk Kim 2714c52cad2SJung-uk Kim /******************************************************************************* 2724c52cad2SJung-uk Kim * 2734c52cad2SJung-uk Kim * FUNCTION: PrRemoveDefine 2744c52cad2SJung-uk Kim * 2754c52cad2SJung-uk Kim * PARAMETERS: DefineName - Name of define to be removed 2764c52cad2SJung-uk Kim * 2774c52cad2SJung-uk Kim * RETURN: None 2784c52cad2SJung-uk Kim * 2794c52cad2SJung-uk Kim * DESCRIPTION: Implements #undef. Remove a #define if found in the global 2804c52cad2SJung-uk Kim * list. No error if the target of the #undef does not exist, 2814c52cad2SJung-uk Kim * as per the C #undef definition. 2824c52cad2SJung-uk Kim * 2834c52cad2SJung-uk Kim ******************************************************************************/ 2844c52cad2SJung-uk Kim 2854c52cad2SJung-uk Kim void 2864c52cad2SJung-uk Kim PrRemoveDefine ( 2874c52cad2SJung-uk Kim char *DefineName) 2884c52cad2SJung-uk Kim { 2894c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo; 2904c52cad2SJung-uk Kim 2914c52cad2SJung-uk Kim 2924c52cad2SJung-uk Kim /* Match name and delete the node */ 2934c52cad2SJung-uk Kim 2946f1f1a63SJung-uk Kim DefineInfo = AslGbl_DefineList; 2954c52cad2SJung-uk Kim while (DefineInfo) 2964c52cad2SJung-uk Kim { 2974c52cad2SJung-uk Kim if (!strcmp (DefineName, DefineInfo->Identifier)) 2984c52cad2SJung-uk Kim { 2994c52cad2SJung-uk Kim /* Remove from linked list */ 3004c52cad2SJung-uk Kim 3014c52cad2SJung-uk Kim if (DefineInfo->Previous) 3024c52cad2SJung-uk Kim { 3034c52cad2SJung-uk Kim (DefineInfo->Previous)->Next = DefineInfo->Next; 3044c52cad2SJung-uk Kim } 3054c52cad2SJung-uk Kim else 3064c52cad2SJung-uk Kim { 3076f1f1a63SJung-uk Kim AslGbl_DefineList = DefineInfo->Next; 3084c52cad2SJung-uk Kim } 3094c52cad2SJung-uk Kim 3104c52cad2SJung-uk Kim if (DefineInfo->Next) 3114c52cad2SJung-uk Kim { 3124c52cad2SJung-uk Kim (DefineInfo->Next)->Previous = DefineInfo->Previous; 3134c52cad2SJung-uk Kim } 3144c52cad2SJung-uk Kim 3154c52cad2SJung-uk Kim free (DefineInfo); 3164c52cad2SJung-uk Kim return; 3174c52cad2SJung-uk Kim } 3184c52cad2SJung-uk Kim 3194c52cad2SJung-uk Kim DefineInfo = DefineInfo->Next; 3204c52cad2SJung-uk Kim } 3214c52cad2SJung-uk Kim 3224c52cad2SJung-uk Kim /* 3234c52cad2SJung-uk Kim * Name was not found. By definition of #undef, this is not 3244c52cad2SJung-uk Kim * an error, however. 3254c52cad2SJung-uk Kim */ 3264c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 3274c52cad2SJung-uk Kim "#undef: could not find %s\n", 3286f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, DefineName); 3294c52cad2SJung-uk Kim } 3304c52cad2SJung-uk Kim 3314c52cad2SJung-uk Kim 3324c52cad2SJung-uk Kim /******************************************************************************* 3334c52cad2SJung-uk Kim * 3344c52cad2SJung-uk Kim * FUNCTION: PrMatchDefine 3354c52cad2SJung-uk Kim * 3364c52cad2SJung-uk Kim * PARAMETERS: MatchString - Name associated with the #define 3374c52cad2SJung-uk Kim * 3384c52cad2SJung-uk Kim * RETURN: Matched string if found. NULL otherwise. 3394c52cad2SJung-uk Kim * 3404c52cad2SJung-uk Kim * DESCRIPTION: Find a name in global #define list 3414c52cad2SJung-uk Kim * 3424c52cad2SJung-uk Kim ******************************************************************************/ 3434c52cad2SJung-uk Kim 3444c52cad2SJung-uk Kim PR_DEFINE_INFO * 3454c52cad2SJung-uk Kim PrMatchDefine ( 3464c52cad2SJung-uk Kim char *MatchString) 3474c52cad2SJung-uk Kim { 3484c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo; 3494c52cad2SJung-uk Kim 3504c52cad2SJung-uk Kim 3516f1f1a63SJung-uk Kim DefineInfo = AslGbl_DefineList; 3524c52cad2SJung-uk Kim while (DefineInfo) 3534c52cad2SJung-uk Kim { 3544c52cad2SJung-uk Kim if (!strcmp (MatchString, DefineInfo->Identifier)) 3554c52cad2SJung-uk Kim { 3564c52cad2SJung-uk Kim return (DefineInfo); 3574c52cad2SJung-uk Kim } 3584c52cad2SJung-uk Kim 3594c52cad2SJung-uk Kim DefineInfo = DefineInfo->Next; 3604c52cad2SJung-uk Kim } 3614c52cad2SJung-uk Kim 3624c52cad2SJung-uk Kim return (NULL); 3634c52cad2SJung-uk Kim } 3644c52cad2SJung-uk Kim 3654c52cad2SJung-uk Kim 3664c52cad2SJung-uk Kim /******************************************************************************* 3674c52cad2SJung-uk Kim * 3684c52cad2SJung-uk Kim * FUNCTION: PrAddMacro 3694c52cad2SJung-uk Kim * 3704c52cad2SJung-uk Kim * PARAMETERS: Name - Start of the macro definition 3714c52cad2SJung-uk Kim * Next - "Next" buffer from GetNextToken 3724c52cad2SJung-uk Kim * 3734c52cad2SJung-uk Kim * RETURN: None 3744c52cad2SJung-uk Kim * 3754c52cad2SJung-uk Kim * DESCRIPTION: Add a new macro to the list of #defines. Handles argument 3764c52cad2SJung-uk Kim * processing. 3774c52cad2SJung-uk Kim * 3784c52cad2SJung-uk Kim ******************************************************************************/ 3794c52cad2SJung-uk Kim 3804c52cad2SJung-uk Kim void 3814c52cad2SJung-uk Kim PrAddMacro ( 3824c52cad2SJung-uk Kim char *Name, 3834c52cad2SJung-uk Kim char **Next) 3844c52cad2SJung-uk Kim { 3854c52cad2SJung-uk Kim char *Token = NULL; 3864c52cad2SJung-uk Kim ACPI_SIZE TokenOffset; 3874c52cad2SJung-uk Kim ACPI_SIZE MacroBodyOffset; 3884c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo; 3894c52cad2SJung-uk Kim PR_MACRO_ARG *Args; 3904c52cad2SJung-uk Kim char *Body; 3914c52cad2SJung-uk Kim char *BodyInSource; 3924c52cad2SJung-uk Kim UINT32 i; 3934c52cad2SJung-uk Kim UINT16 UseCount = 0; 3944c52cad2SJung-uk Kim UINT16 ArgCount = 0; 3954c52cad2SJung-uk Kim UINT32 Depth = 1; 396722b1667SJung-uk Kim /*UINT32 Depth = 1;*/ 3974c52cad2SJung-uk Kim UINT32 EndOfArgList; 3984c52cad2SJung-uk Kim char BufferChar; 3994c52cad2SJung-uk Kim 4004c52cad2SJung-uk Kim /* Find the end of the arguments list */ 4014c52cad2SJung-uk Kim 4026f1f1a63SJung-uk Kim TokenOffset = Name - AslGbl_MainTokenBuffer + strlen (Name) + 1; 4034c52cad2SJung-uk Kim while (1) 4044c52cad2SJung-uk Kim { 4056f1f1a63SJung-uk Kim BufferChar = AslGbl_CurrentLineBuffer[TokenOffset]; 4064c52cad2SJung-uk Kim if (BufferChar == '(') 4074c52cad2SJung-uk Kim { 4084c52cad2SJung-uk Kim Depth++; 4094c52cad2SJung-uk Kim } 4104c52cad2SJung-uk Kim else if (BufferChar == ')') 4114c52cad2SJung-uk Kim { 4124c52cad2SJung-uk Kim Depth--; 4134c52cad2SJung-uk Kim } 4144c52cad2SJung-uk Kim else if (BufferChar == 0) 4154c52cad2SJung-uk Kim { 4164c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_MACRO_SYNTAX, TokenOffset); 4174c52cad2SJung-uk Kim return; 4184c52cad2SJung-uk Kim } 4194c52cad2SJung-uk Kim 4204c52cad2SJung-uk Kim if (Depth == 0) 4214c52cad2SJung-uk Kim { 4224c52cad2SJung-uk Kim /* Found arg list end */ 4234c52cad2SJung-uk Kim 4244c52cad2SJung-uk Kim EndOfArgList = TokenOffset; 4254c52cad2SJung-uk Kim break; 4264c52cad2SJung-uk Kim } 4274c52cad2SJung-uk Kim 4284c52cad2SJung-uk Kim TokenOffset++; 4294c52cad2SJung-uk Kim } 4304c52cad2SJung-uk Kim 4314c52cad2SJung-uk Kim /* At this point, we know that we have a reasonable argument list */ 4324c52cad2SJung-uk Kim 4334c52cad2SJung-uk Kim Args = UtLocalCalloc (sizeof (PR_MACRO_ARG) * PR_MAX_MACRO_ARGS); 4344c52cad2SJung-uk Kim 4354c52cad2SJung-uk Kim /* Get the macro argument names */ 4364c52cad2SJung-uk Kim 4374c52cad2SJung-uk Kim for (i = 0; i < PR_MAX_MACRO_ARGS; i++) 4384c52cad2SJung-uk Kim { 4394c52cad2SJung-uk Kim Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next); 440722b1667SJung-uk Kim 4414c52cad2SJung-uk Kim if (!Token) 4424c52cad2SJung-uk Kim { 4434c52cad2SJung-uk Kim /* This is the case for a NULL macro body */ 4444c52cad2SJung-uk Kim 4454c52cad2SJung-uk Kim BodyInSource = ""; 4464c52cad2SJung-uk Kim goto AddMacroToList; 4474c52cad2SJung-uk Kim } 4484c52cad2SJung-uk Kim 4494c52cad2SJung-uk Kim /* Don't go beyond the argument list */ 4504c52cad2SJung-uk Kim 4516f1f1a63SJung-uk Kim TokenOffset = Token - AslGbl_MainTokenBuffer + strlen (Token); 4524c52cad2SJung-uk Kim if (TokenOffset > EndOfArgList) 4534c52cad2SJung-uk Kim { 4544c52cad2SJung-uk Kim break; 4554c52cad2SJung-uk Kim } 4564c52cad2SJung-uk Kim 4574c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 458722b1667SJung-uk Kim "Macro param: %s\n", 4596f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, Token); 4604c52cad2SJung-uk Kim 4614c52cad2SJung-uk Kim Args[i].Name = UtLocalCalloc (strlen (Token) + 1); 4624c52cad2SJung-uk Kim strcpy (Args[i].Name, Token); 4634c52cad2SJung-uk Kim 4644c52cad2SJung-uk Kim Args[i].UseCount = 0; 4654c52cad2SJung-uk Kim ArgCount++; 4664c52cad2SJung-uk Kim if (ArgCount >= PR_MAX_MACRO_ARGS) 4674c52cad2SJung-uk Kim { 4684c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_TOO_MANY_ARGUMENTS, TokenOffset); 469313a0c13SJung-uk Kim goto ErrorExit; 4704c52cad2SJung-uk Kim } 4714c52cad2SJung-uk Kim } 4724c52cad2SJung-uk Kim 4734c52cad2SJung-uk Kim /* Get the macro body. Token now points to start of body */ 4744c52cad2SJung-uk Kim 4756f1f1a63SJung-uk Kim MacroBodyOffset = Token - AslGbl_MainTokenBuffer; 4764c52cad2SJung-uk Kim 4774c52cad2SJung-uk Kim /* Match each method arg in the macro body for later use */ 4784c52cad2SJung-uk Kim 4794c52cad2SJung-uk Kim while (Token) 4804c52cad2SJung-uk Kim { 4814c52cad2SJung-uk Kim /* Search the macro arg list for matching arg */ 4824c52cad2SJung-uk Kim 4835f9b24faSJung-uk Kim for (i = 0; ((i < PR_MAX_MACRO_ARGS) && Args[i].Name); i++) 4844c52cad2SJung-uk Kim { 4854c52cad2SJung-uk Kim /* 4864c52cad2SJung-uk Kim * Save argument offset within macro body. This is the mechanism 4874c52cad2SJung-uk Kim * used to expand the macro upon invocation. 4884c52cad2SJung-uk Kim * 4894c52cad2SJung-uk Kim * Handles multiple instances of the same argument 4904c52cad2SJung-uk Kim */ 4914c52cad2SJung-uk Kim if (!strcmp (Token, Args[i].Name)) 4924c52cad2SJung-uk Kim { 4934c52cad2SJung-uk Kim UseCount = Args[i].UseCount; 4944c52cad2SJung-uk Kim 495f8146b88SJung-uk Kim Args[i].Offset[UseCount] = 4966f1f1a63SJung-uk Kim (Token - AslGbl_MainTokenBuffer) - MacroBodyOffset; 4974c52cad2SJung-uk Kim 498722b1667SJung-uk Kim 4994c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 5004c52cad2SJung-uk Kim "Macro Arg #%u: %s UseCount %u Offset %u\n", 5016f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, i, Token, 5024c52cad2SJung-uk Kim UseCount+1, Args[i].Offset[UseCount]); 5034c52cad2SJung-uk Kim 5044c52cad2SJung-uk Kim Args[i].UseCount++; 505722b1667SJung-uk Kim 5064c52cad2SJung-uk Kim if (Args[i].UseCount >= PR_MAX_ARG_INSTANCES) 5074c52cad2SJung-uk Kim { 5084c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_TOO_MANY_ARGUMENTS, 5094c52cad2SJung-uk Kim THIS_TOKEN_OFFSET (Token)); 5104c52cad2SJung-uk Kim 511313a0c13SJung-uk Kim goto ErrorExit; 5124c52cad2SJung-uk Kim } 5134c52cad2SJung-uk Kim break; 5144c52cad2SJung-uk Kim } 5154c52cad2SJung-uk Kim } 5164c52cad2SJung-uk Kim 5174c52cad2SJung-uk Kim Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next); 5184c52cad2SJung-uk Kim } 5194c52cad2SJung-uk Kim 5206f1f1a63SJung-uk Kim BodyInSource = &AslGbl_CurrentLineBuffer[MacroBodyOffset]; 5214c52cad2SJung-uk Kim 5224c52cad2SJung-uk Kim 5234c52cad2SJung-uk Kim AddMacroToList: 5244c52cad2SJung-uk Kim 5254c52cad2SJung-uk Kim /* Check if name is already defined first */ 5264c52cad2SJung-uk Kim 5274c52cad2SJung-uk Kim DefineInfo = PrMatchDefine (Name); 5284c52cad2SJung-uk Kim if (DefineInfo) 5294c52cad2SJung-uk Kim { 5304c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 5314c52cad2SJung-uk Kim "#define: macro name already exists: %s\n", 5326f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, Name); 5334c52cad2SJung-uk Kim 5344c52cad2SJung-uk Kim /* Error only if not exactly the same macro */ 5354c52cad2SJung-uk Kim 5364c52cad2SJung-uk Kim if (strcmp (DefineInfo->Body, BodyInSource) || 5374c52cad2SJung-uk Kim (DefineInfo->ArgCount != ArgCount)) 5384c52cad2SJung-uk Kim { 5394c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_EXISTING_NAME, 5404c52cad2SJung-uk Kim THIS_TOKEN_OFFSET (Name)); 5414c52cad2SJung-uk Kim } 5424c52cad2SJung-uk Kim 543313a0c13SJung-uk Kim goto ErrorExit; 5444c52cad2SJung-uk Kim } 5454c52cad2SJung-uk Kim 5464c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 5474c52cad2SJung-uk Kim "Macro body: %s\n", 5486f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, BodyInSource); 5494c52cad2SJung-uk Kim 5504c52cad2SJung-uk Kim /* Add macro to the #define list */ 5514c52cad2SJung-uk Kim 5524c52cad2SJung-uk Kim DefineInfo = PrAddDefine (Name, BodyInSource, FALSE); 5534c52cad2SJung-uk Kim if (DefineInfo) 5544c52cad2SJung-uk Kim { 5554c52cad2SJung-uk Kim Body = UtLocalCalloc (strlen (BodyInSource) + 1); 5564c52cad2SJung-uk Kim strcpy (Body, BodyInSource); 5574c52cad2SJung-uk Kim 5584c52cad2SJung-uk Kim DefineInfo->Body = Body; 5594c52cad2SJung-uk Kim DefineInfo->Args = Args; 5604c52cad2SJung-uk Kim DefineInfo->ArgCount = ArgCount; 5614c52cad2SJung-uk Kim } 562313a0c13SJung-uk Kim 563313a0c13SJung-uk Kim return; 564313a0c13SJung-uk Kim 565313a0c13SJung-uk Kim 566313a0c13SJung-uk Kim ErrorExit: 567313a0c13SJung-uk Kim ACPI_FREE (Args); 568313a0c13SJung-uk Kim return; 5694c52cad2SJung-uk Kim } 5704c52cad2SJung-uk Kim 5714c52cad2SJung-uk Kim 5724c52cad2SJung-uk Kim /******************************************************************************* 5734c52cad2SJung-uk Kim * 5744c52cad2SJung-uk Kim * FUNCTION: PrDoMacroInvocation 5754c52cad2SJung-uk Kim * 5764c52cad2SJung-uk Kim * PARAMETERS: TokenBuffer - Current line buffer 5774c52cad2SJung-uk Kim * MacroStart - Start of the macro invocation within 5784c52cad2SJung-uk Kim * the token buffer 5794c52cad2SJung-uk Kim * DefineInfo - Info for this macro 5804c52cad2SJung-uk Kim * Next - "Next" buffer from GetNextToken 5814c52cad2SJung-uk Kim * 5824c52cad2SJung-uk Kim * RETURN: None 5834c52cad2SJung-uk Kim * 5844c52cad2SJung-uk Kim * DESCRIPTION: Expand a macro invocation 5854c52cad2SJung-uk Kim * 5864c52cad2SJung-uk Kim ******************************************************************************/ 5874c52cad2SJung-uk Kim 5884c52cad2SJung-uk Kim void 5894c52cad2SJung-uk Kim PrDoMacroInvocation ( 5904c52cad2SJung-uk Kim char *TokenBuffer, 5914c52cad2SJung-uk Kim char *MacroStart, 5924c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo, 5934c52cad2SJung-uk Kim char **Next) 5944c52cad2SJung-uk Kim { 5954c52cad2SJung-uk Kim PR_MACRO_ARG *Args; 5964c52cad2SJung-uk Kim char *Token = NULL; 5974c52cad2SJung-uk Kim UINT32 TokenOffset; 5984c52cad2SJung-uk Kim UINT32 Length; 5994c52cad2SJung-uk Kim UINT32 i; 600722b1667SJung-uk Kim UINT32 Diff1; 601722b1667SJung-uk Kim UINT32 Diff2; 6024c52cad2SJung-uk Kim 6034c52cad2SJung-uk Kim /* Take a copy of the macro body for expansion */ 6044c52cad2SJung-uk Kim 6056f1f1a63SJung-uk Kim strcpy (AslGbl_MacroTokenBuffer, DefineInfo->Body); 6064c52cad2SJung-uk Kim 6074c52cad2SJung-uk Kim /* Replace each argument within the prototype body */ 6084c52cad2SJung-uk Kim 6094c52cad2SJung-uk Kim Args = DefineInfo->Args; 6104c52cad2SJung-uk Kim if (!Args->Name) 6114c52cad2SJung-uk Kim { 6124c52cad2SJung-uk Kim /* This macro has no arguments */ 6134c52cad2SJung-uk Kim 6144c52cad2SJung-uk Kim Token = PrGetNextToken (NULL, PR_MACRO_ARGUMENTS, Next); 615722b1667SJung-uk Kim 6164c52cad2SJung-uk Kim if (!Token) 6174c52cad2SJung-uk Kim { 6184c52cad2SJung-uk Kim goto BadInvocation; 6194c52cad2SJung-uk Kim } 6204c52cad2SJung-uk Kim 6214c52cad2SJung-uk Kim TokenOffset = (MacroStart - TokenBuffer); 6224c52cad2SJung-uk Kim Length = Token - MacroStart + strlen (Token) + 1; 6234c52cad2SJung-uk Kim 6244c52cad2SJung-uk Kim PrReplaceData ( 6256f1f1a63SJung-uk Kim &AslGbl_CurrentLineBuffer[TokenOffset], Length, 6266f1f1a63SJung-uk Kim AslGbl_MacroTokenBuffer, strlen (AslGbl_MacroTokenBuffer)); 6274c52cad2SJung-uk Kim return; 6284c52cad2SJung-uk Kim } 6294c52cad2SJung-uk Kim 6304c52cad2SJung-uk Kim while (Args->Name) 6314c52cad2SJung-uk Kim { 6324c52cad2SJung-uk Kim /* Get the next argument from macro invocation */ 6334c52cad2SJung-uk Kim 6344c52cad2SJung-uk Kim Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next); 6354c52cad2SJung-uk Kim if (!Token) 6364c52cad2SJung-uk Kim { 6374c52cad2SJung-uk Kim goto BadInvocation; 6384c52cad2SJung-uk Kim } 6394c52cad2SJung-uk Kim 640722b1667SJung-uk Kim /* 641722b1667SJung-uk Kim * Avoid optimizing using just 1 signed int due to specific 642722b1667SJung-uk Kim * non-portable implementations of signed ints 643722b1667SJung-uk Kim */ 644722b1667SJung-uk Kim Diff1 = strlen (Args->Name) > strlen (Token) ? strlen (Args->Name) - 645722b1667SJung-uk Kim strlen (Token) : 0; 646722b1667SJung-uk Kim 647722b1667SJung-uk Kim Diff2 = strlen (Args->Name) < strlen (Token) ? strlen (Token) - 648722b1667SJung-uk Kim strlen (Args->Name) : 0; 649722b1667SJung-uk Kim 6504c52cad2SJung-uk Kim /* Replace all instances of this argument */ 6514c52cad2SJung-uk Kim 6524c52cad2SJung-uk Kim for (i = 0; i < Args->UseCount; i++) 6534c52cad2SJung-uk Kim { 654722b1667SJung-uk Kim /* 655722b1667SJung-uk Kim * To test the output of the preprocessed macro function that 656722b1667SJung-uk Kim * is passed to the compiler 657722b1667SJung-uk Kim */ 6584c52cad2SJung-uk Kim 659722b1667SJung-uk Kim /* 660722b1667SJung-uk Kim * fprintf (stderr, "Current token = %s \t Current arg_name = %s \ 661722b1667SJung-uk Kim * \t strlen (Token) = %u \t strlen (Args->Name) = %u \t Offset = %u \ 662722b1667SJung-uk Kim * \t UseCount = %u \t", Token, Args->Name, strlen (Token), \ 663722b1667SJung-uk Kim * strlen (Args->Name), Args->Offset[i], Args->UseCount); 664722b1667SJung-uk Kim */ 6654c52cad2SJung-uk Kim 666722b1667SJung-uk Kim AslGbl_MacroTokenReplaceBuffer = (char *) calloc ((strlen (AslGbl_MacroTokenBuffer)), sizeof (char)); 667722b1667SJung-uk Kim 668722b1667SJung-uk Kim PrReplaceResizeSubstring (Args, Diff1, Diff2, i, Token); 6694c52cad2SJung-uk Kim 6704c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 6714c52cad2SJung-uk Kim "ExpandArg: %s\n", 6726f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, AslGbl_MacroTokenBuffer); 6734c52cad2SJung-uk Kim } 6744c52cad2SJung-uk Kim 6754c52cad2SJung-uk Kim Args++; 6764c52cad2SJung-uk Kim } 6774c52cad2SJung-uk Kim 6784c52cad2SJung-uk Kim if (!Token) 6794c52cad2SJung-uk Kim { 6804c52cad2SJung-uk Kim return; 6814c52cad2SJung-uk Kim } 6824c52cad2SJung-uk Kim 6834c52cad2SJung-uk Kim /* Replace the entire macro invocation with the expanded macro */ 6844c52cad2SJung-uk Kim 6854c52cad2SJung-uk Kim TokenOffset = (MacroStart - TokenBuffer); 6864c52cad2SJung-uk Kim Length = Token - MacroStart + strlen (Token) + 1; 6874c52cad2SJung-uk Kim 6884c52cad2SJung-uk Kim PrReplaceData ( 6896f1f1a63SJung-uk Kim &AslGbl_CurrentLineBuffer[TokenOffset], Length, 6906f1f1a63SJung-uk Kim AslGbl_MacroTokenBuffer, strlen (AslGbl_MacroTokenBuffer)); 6914c52cad2SJung-uk Kim 6924c52cad2SJung-uk Kim return; 6934c52cad2SJung-uk Kim 6944c52cad2SJung-uk Kim BadInvocation: 6954c52cad2SJung-uk Kim PrError (ASL_ERROR, ASL_MSG_INVALID_INVOCATION, 6964c52cad2SJung-uk Kim THIS_TOKEN_OFFSET (MacroStart)); 6974c52cad2SJung-uk Kim 6984c52cad2SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID 6994c52cad2SJung-uk Kim "Bad macro invocation: %s\n", 7006f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, AslGbl_MacroTokenBuffer); 7014c52cad2SJung-uk Kim return; 7024c52cad2SJung-uk Kim } 703