Home | History | Annotate | Line # | Download | only in acpisrc
      1 /******************************************************************************
      2  *
      3  * Module Name: acpisrc.h - Include file for AcpiSrc utility
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 #include "acpi.h"
    153 #include "accommon.h"
    154 #include "acapps.h"
    155 
    156 /* mkdir support */
    157 
    158 #ifdef WIN32
    159 #include <direct.h>
    160 #else
    161 #define mkdir(x) mkdir(x, 0770)
    162 #endif
    163 
    164 
    165 /* Constants */
    166 
    167 #define LINES_IN_LEGAL_HEADER               115+36 /* intel+dual license. See legal header above at module start */
    168 #define LEGAL_HEADER_SIGNATURE              " * 2.1. This is your license from Intel Corp. under its intellectual property"
    169 #define LINES_IN_LINUX_HEADER               2 /* SPDX header is 1 line Intel copyright is another line */
    170 #define LINUX_HEADER_SIGNATURE              " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"
    171 #define LINES_IN_ASL_HEADER                 29 /* Header as output from disassembler */
    172 
    173 #define ASRC_MAX_FILE_SIZE                  (1024 * 100)
    174 
    175 #define FILE_TYPE_SOURCE                    1
    176 #define FILE_TYPE_HEADER                    2
    177 #define FILE_TYPE_DIRECTORY                 3
    178 #define FILE_TYPE_PATCH                     4
    179 
    180 #define CVT_COUNT_TABS                      0x00000001
    181 #define CVT_COUNT_NON_ANSI_COMMENTS         0x00000002
    182 #define CVT_TRIM_LINES                      0x00000004
    183 #define CVT_CHECK_BRACES                    0x00000008
    184 #define CVT_COUNT_LINES                     0x00000010
    185 #define CVT_BRACES_ON_SAME_LINE             0x00000020
    186 #define CVT_MIXED_CASE_TO_UNDERSCORES       0x00000040
    187 #define CVT_LOWER_CASE_IDENTIFIERS          0x00000080
    188 #define CVT_REMOVE_DEBUG_MACROS             0x00000100
    189 #define CVT_TRIM_WHITESPACE                 0x00000200  /* Should be after all line removal */
    190 #define CVT_REMOVE_EMPTY_BLOCKS             0x00000400  /* Should be after trimming lines */
    191 #define CVT_REDUCE_TYPEDEFS                 0x00000800
    192 #define CVT_COUNT_SHORTMULTILINE_COMMENTS   0x00001000
    193 #define CVT_SPACES_TO_TABS4                 0x40000000  /* Tab conversion should be last */
    194 #define CVT_SPACES_TO_TABS8                 0x80000000  /* Tab conversion should be last */
    195 
    196 #define FLG_DEFAULT_FLAGS                   0x00000000
    197 #define FLG_NO_CARRIAGE_RETURNS             0x00000001
    198 #define FLG_NO_FILE_OUTPUT                  0x00000002
    199 #define FLG_LOWERCASE_DIRNAMES              0x00000004
    200 
    201 #define AS_START_IGNORE                     "/*!"
    202 #define AS_STOP_IGNORE                      "!*/"
    203 
    204 
    205 /* Globals */
    206 
    207 extern UINT32                   Gbl_Files;
    208 extern UINT32                   Gbl_MissingBraces;
    209 extern UINT32                   Gbl_Tabs;
    210 extern UINT32                   Gbl_NonAnsiComments;
    211 extern UINT32                   Gbl_SourceLines;
    212 extern UINT32                   Gbl_WhiteLines;
    213 extern UINT32                   Gbl_CommentLines;
    214 extern UINT32                   Gbl_LongLines;
    215 extern UINT32                   Gbl_TotalLines;
    216 extern UINT32                   Gbl_HeaderSize;
    217 extern UINT32                   Gbl_HeaderLines;
    218 extern struct stat              Gbl_StatBuf;
    219 extern char                     *Gbl_FileBuffer;
    220 extern UINT32                   Gbl_TotalSize;
    221 extern UINT32                   Gbl_FileSize;
    222 extern UINT32                   Gbl_FileType;
    223 extern BOOLEAN                  Gbl_VerboseMode;
    224 extern BOOLEAN                  Gbl_QuietMode;
    225 extern BOOLEAN                  Gbl_BatchMode;
    226 extern BOOLEAN                  Gbl_MadeChanges;
    227 extern BOOLEAN                  Gbl_Overwrite;
    228 extern BOOLEAN                  Gbl_WidenDeclarations;
    229 extern BOOLEAN                  Gbl_IgnoreLoneLineFeeds;
    230 extern BOOLEAN                  Gbl_HasLoneLineFeeds;
    231 extern BOOLEAN                  Gbl_Cleanup;
    232 extern BOOLEAN                  Gbl_IgnoreTranslationEscapes;
    233 extern BOOLEAN                  Gbl_CheckAscii;
    234 extern void                     *Gbl_StructDefs;
    235 
    236 #define PARAM_LIST(pl)          pl
    237 #define TERSE_PRINT(a)          if (!Gbl_VerboseMode) printf PARAM_LIST(a)
    238 #define VERBOSE_PRINT(a)        if (Gbl_VerboseMode) printf PARAM_LIST(a)
    239 
    240 #define REPLACE_WHOLE_WORD      0x00
    241 #define REPLACE_SUBSTRINGS      0x01
    242 #define REPLACE_MASK            0x01
    243 
    244 #define EXTRA_INDENT_C          0x02
    245 
    246 
    247 /* Conversion table structs */
    248 
    249 typedef struct acpi_string_table
    250 {
    251     char                        *Target;
    252     char                        *Replacement;
    253     UINT8                       Type;
    254 
    255 } ACPI_STRING_TABLE;
    256 
    257 
    258 typedef struct acpi_typed_identifier_table
    259 {
    260     char                        *Identifier;
    261     UINT8                       Type;
    262 
    263 } ACPI_TYPED_IDENTIFIER_TABLE;
    264 
    265 #define SRC_TYPE_SIMPLE         0
    266 #define SRC_TYPE_STRUCT         1
    267 #define SRC_TYPE_UNION          2
    268 
    269 
    270 typedef struct acpi_identifier_table
    271 {
    272     char                        *Identifier;
    273 
    274 } ACPI_IDENTIFIER_TABLE;
    275 
    276 typedef struct acpi_conversion_table
    277 {
    278     char                        *NewHeader;
    279     UINT32                      Flags;
    280 
    281     ACPI_TYPED_IDENTIFIER_TABLE *LowerCaseTable;
    282 
    283     char                        *SourceSpdxHeader;
    284     ACPI_STRING_TABLE           *SourceStringTable;
    285     ACPI_IDENTIFIER_TABLE       *SourceLineTable;
    286     ACPI_IDENTIFIER_TABLE       *SourceConditionalTable;
    287     ACPI_IDENTIFIER_TABLE       *SourceMacroTable;
    288     ACPI_TYPED_IDENTIFIER_TABLE *SourceStructTable;
    289     ACPI_IDENTIFIER_TABLE       *SourceSpecialMacroTable;
    290     UINT32                      SourceFunctions;
    291 
    292     char                        *HeaderSpdxHeader;
    293     ACPI_STRING_TABLE           *HeaderStringTable;
    294     ACPI_IDENTIFIER_TABLE       *HeaderLineTable;
    295     ACPI_IDENTIFIER_TABLE       *HeaderConditionalTable;
    296     ACPI_IDENTIFIER_TABLE       *HeaderMacroTable;
    297     ACPI_TYPED_IDENTIFIER_TABLE *HeaderStructTable;
    298     ACPI_IDENTIFIER_TABLE       *HeaderSpecialMacroTable;
    299     UINT32                      HeaderFunctions;
    300 
    301     /* SPDX header conversion for patches is not supported */
    302     ACPI_STRING_TABLE           *PatchStringTable;
    303     ACPI_IDENTIFIER_TABLE       *PatchLineTable;
    304     ACPI_IDENTIFIER_TABLE       *PatchConditionalTable;
    305     ACPI_IDENTIFIER_TABLE       *PatchMacroTable;
    306     ACPI_TYPED_IDENTIFIER_TABLE *PatchStructTable;
    307     ACPI_IDENTIFIER_TABLE       *PatchSpecialMacroTable;
    308     UINT32                      PatchFunctions;
    309 
    310 } ACPI_CONVERSION_TABLE;
    311 
    312 
    313 /* Conversion tables */
    314 
    315 extern ACPI_CONVERSION_TABLE       LinuxConversionTable;
    316 extern ACPI_CONVERSION_TABLE       CleanupConversionTable;
    317 extern ACPI_CONVERSION_TABLE       StatsConversionTable;
    318 extern ACPI_CONVERSION_TABLE       CustomConversionTable;
    319 extern ACPI_CONVERSION_TABLE       LicenseConversionTable;
    320 extern ACPI_CONVERSION_TABLE       IndentConversionTable;
    321 
    322 typedef
    323 char * (*AS_SCAN_CALLBACK) (
    324     char                    *Buffer,
    325     char                    *Filename,
    326     UINT32                  LineNumber);
    327 
    328 typedef struct as_brace_info
    329 {
    330     char                    *Operator;
    331     UINT32                  Length;
    332 
    333 } AS_BRACE_INFO;
    334 
    335 
    336 /* Prototypes */
    337 
    338 char *
    339 AsSkipUntilChar (
    340     char                    *Buffer,
    341     char                    Target);
    342 
    343 char *
    344 AsSkipPastChar (
    345     char                    *Buffer,
    346     char                    Target);
    347 
    348 char *
    349 AsReplaceData (
    350     char                    *Buffer,
    351     UINT32                  LengthToRemove,
    352     char                    *BufferToAdd,
    353     UINT32                  LengthToAdd);
    354 
    355 int
    356 AsReplaceString (
    357     char                    *Target,
    358     char                    *Replacement,
    359     UINT8                   Type,
    360     char                    *Buffer);
    361 
    362 int
    363 AsLowerCaseString (
    364     char                    *Target,
    365     char                    *Buffer);
    366 
    367 void
    368 AsRemoveLine (
    369     char                    *Buffer,
    370     char                    *Keyword);
    371 
    372 void
    373 AsCheckForBraces (
    374     char                    *Buffer,
    375     char                    *Filename);
    376 
    377 void
    378 AsTrimLines (
    379     char                    *Buffer,
    380     char                    *Filename);
    381 
    382 void
    383 AsMixedCaseToUnderscores (
    384     char                    *Buffer,
    385     char                    *Filename);
    386 
    387 void
    388 AsCountTabs (
    389     char                    *Buffer,
    390     char                    *Filename);
    391 
    392 void
    393 AsBracesOnSameLine (
    394     char                    *Buffer);
    395 
    396 void
    397 AsLowerCaseIdentifiers (
    398     char                    *Buffer);
    399 
    400 void
    401 AsReduceTypedefs (
    402     char                    *Buffer,
    403     char                    *Keyword);
    404 
    405 void
    406 AsRemoveDebugMacros (
    407     char                    *Buffer);
    408 
    409 void
    410 AsRemoveEmptyBlocks (
    411     char                    *Buffer,
    412     char                    *Filename);
    413 
    414 void
    415 AsCleanupSpecialMacro (
    416     char                    *Buffer,
    417     char                    *Keyword);
    418 
    419 void
    420 AsCountSourceLines (
    421     char                    *Buffer,
    422     char                    *Filename);
    423 
    424 void
    425 AsCountNonAnsiComments (
    426     char                    *Buffer,
    427     char                    *Filename);
    428 
    429 void
    430 AsTrimWhitespace (
    431     char                    *Buffer);
    432 
    433 void
    434 AsTabify4 (
    435     char                    *Buffer);
    436 
    437 void
    438 AsTabify8 (
    439     char                    *Buffer);
    440 
    441 void
    442 AsRemoveConditionalCompile (
    443     char                    *Buffer,
    444     char                    *Keyword);
    445 
    446 ACPI_NATIVE_INT
    447 AsProcessTree (
    448     ACPI_CONVERSION_TABLE   *ConversionTable,
    449     char                    *SourcePath,
    450     char                    *TargetPath);
    451 
    452 int
    453 AsGetFile (
    454     char                    *FileName,
    455     char                    **FileBuffer,
    456     UINT32                  *FileSize);
    457 
    458 int
    459 AsPutFile (
    460     char                    *Pathname,
    461     char                    *FileBuffer,
    462     UINT32                  SystemFlags);
    463 
    464 void
    465 AsReplaceHeader (
    466     char                    *Buffer,
    467     char                    *NewHeader);
    468 
    469 void
    470 AsDoSpdxHeader (
    471     char                    *Buffer,
    472     char                    *SpdxHeader);
    473 
    474 void
    475 AsConvertFile (
    476     ACPI_CONVERSION_TABLE   *ConversionTable,
    477     char                    *FileBuffer,
    478     char                    *Filename,
    479     ACPI_NATIVE_INT         FileType);
    480 
    481 ACPI_NATIVE_INT
    482 AsProcessOneFile (
    483     ACPI_CONVERSION_TABLE   *ConversionTable,
    484     char                    *SourcePath,
    485     char                    *TargetPath,
    486     int                     MaxPathLength,
    487     char                    *Filename,
    488     ACPI_NATIVE_INT         FileType);
    489 
    490 ACPI_NATIVE_INT
    491 AsCheckForDirectory (
    492     char                    *SourceDirPath,
    493     char                    *TargetDirPath,
    494     char                    *Filename,
    495     char                    **SourcePath,
    496     char                    **TargetPath);
    497 
    498 void
    499 AsRemoveExtraLines (
    500     char                    *FileBuffer,
    501     char                    *Filename);
    502 
    503 void
    504 AsRemoveSpacesAfterPeriod (
    505     char                    *FileBuffer,
    506     char                    *Filename);
    507 
    508 BOOLEAN
    509 AsMatchExactWord (
    510     char                    *Word,
    511     UINT32                  WordLength);
    512 
    513 void
    514 AsPrint (
    515     char                    *Message,
    516     UINT32                  Count,
    517     char                    *Filename);
    518 
    519 void
    520 AsInsertPrefix (
    521     char                    *Buffer,
    522     char                    *Keyword,
    523     UINT8                   Type);
    524 
    525 char *
    526 AsInsertData (
    527     char                    *Buffer,
    528     char                    *BufferToAdd,
    529     UINT32                  LengthToAdd);
    530 
    531 char *
    532 AsRemoveData (
    533     char                    *StartPointer,
    534     char                    *EndPointer);
    535 
    536 void
    537 AsInsertCarriageReturns (
    538     char                    *Buffer);
    539 
    540 void
    541 AsConvertToLineFeeds (
    542     char                    *Buffer);
    543