1/******************************************************************************
2 *
3 * Module Name: acpisrc.h - Include file for AcpiSrc utility
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2023, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include "acpi.h"
45#include "accommon.h"
46#include "acapps.h"
47
48/* mkdir support */
49
50#ifdef WIN32
51#include <direct.h>
52#else
53#define mkdir(x) mkdir(x, 0770)
54#endif
55
56
57/* Constants */
58
59#define LINES_IN_LEGAL_HEADER               115+36 /* intel+dual license. See legal header above at module start */
60#define LEGAL_HEADER_SIGNATURE              " * 2.1. This is your license from Intel Corp. under its intellectual property"
61#define LINES_IN_LINUX_HEADER               2 /* SPDX header is 1 line Intel copyright is another line */
62#define LINUX_HEADER_SIGNATURE              " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"
63#define LINES_IN_ASL_HEADER                 29 /* Header as output from disassembler */
64
65#define ASRC_MAX_FILE_SIZE                  (1024 * 100)
66
67#define FILE_TYPE_SOURCE                    1
68#define FILE_TYPE_HEADER                    2
69#define FILE_TYPE_DIRECTORY                 3
70#define FILE_TYPE_PATCH                     4
71
72#define CVT_COUNT_TABS                      0x00000001
73#define CVT_COUNT_NON_ANSI_COMMENTS         0x00000002
74#define CVT_TRIM_LINES                      0x00000004
75#define CVT_CHECK_BRACES                    0x00000008
76#define CVT_COUNT_LINES                     0x00000010
77#define CVT_BRACES_ON_SAME_LINE             0x00000020
78#define CVT_MIXED_CASE_TO_UNDERSCORES       0x00000040
79#define CVT_LOWER_CASE_IDENTIFIERS          0x00000080
80#define CVT_REMOVE_DEBUG_MACROS             0x00000100
81#define CVT_TRIM_WHITESPACE                 0x00000200  /* Should be after all line removal */
82#define CVT_REMOVE_EMPTY_BLOCKS             0x00000400  /* Should be after trimming lines */
83#define CVT_REDUCE_TYPEDEFS                 0x00000800
84#define CVT_COUNT_SHORTMULTILINE_COMMENTS   0x00001000
85#define CVT_SPACES_TO_TABS4                 0x40000000  /* Tab conversion should be last */
86#define CVT_SPACES_TO_TABS8                 0x80000000  /* Tab conversion should be last */
87
88#define FLG_DEFAULT_FLAGS                   0x00000000
89#define FLG_NO_CARRIAGE_RETURNS             0x00000001
90#define FLG_NO_FILE_OUTPUT                  0x00000002
91#define FLG_LOWERCASE_DIRNAMES              0x00000004
92
93#define AS_START_IGNORE                     "/*!"
94#define AS_STOP_IGNORE                      "!*/"
95
96
97/* Globals */
98
99extern UINT32                   Gbl_Files;
100extern UINT32                   Gbl_MissingBraces;
101extern UINT32                   Gbl_Tabs;
102extern UINT32                   Gbl_NonAnsiComments;
103extern UINT32                   Gbl_SourceLines;
104extern UINT32                   Gbl_WhiteLines;
105extern UINT32                   Gbl_CommentLines;
106extern UINT32                   Gbl_LongLines;
107extern UINT32                   Gbl_TotalLines;
108extern UINT32                   Gbl_HeaderSize;
109extern UINT32                   Gbl_HeaderLines;
110extern struct stat              Gbl_StatBuf;
111extern char                     *Gbl_FileBuffer;
112extern UINT32                   Gbl_TotalSize;
113extern UINT32                   Gbl_FileSize;
114extern UINT32                   Gbl_FileType;
115extern BOOLEAN                  Gbl_VerboseMode;
116extern BOOLEAN                  Gbl_QuietMode;
117extern BOOLEAN                  Gbl_BatchMode;
118extern BOOLEAN                  Gbl_MadeChanges;
119extern BOOLEAN                  Gbl_Overwrite;
120extern BOOLEAN                  Gbl_WidenDeclarations;
121extern BOOLEAN                  Gbl_IgnoreLoneLineFeeds;
122extern BOOLEAN                  Gbl_HasLoneLineFeeds;
123extern BOOLEAN                  Gbl_Cleanup;
124extern BOOLEAN                  Gbl_IgnoreTranslationEscapes;
125extern BOOLEAN                  Gbl_CheckAscii;
126extern void                     *Gbl_StructDefs;
127
128#define PARAM_LIST(pl)          pl
129#define TERSE_PRINT(a)          if (!Gbl_VerboseMode) printf PARAM_LIST(a)
130#define VERBOSE_PRINT(a)        if (Gbl_VerboseMode) printf PARAM_LIST(a)
131
132#define REPLACE_WHOLE_WORD      0x00
133#define REPLACE_SUBSTRINGS      0x01
134#define REPLACE_MASK            0x01
135
136#define EXTRA_INDENT_C          0x02
137
138
139/* Conversion table structs */
140
141typedef struct acpi_string_table
142{
143    char                        *Target;
144    char                        *Replacement;
145    UINT8                       Type;
146
147} ACPI_STRING_TABLE;
148
149
150typedef struct acpi_typed_identifier_table
151{
152    char                        *Identifier;
153    UINT8                       Type;
154
155} ACPI_TYPED_IDENTIFIER_TABLE;
156
157#define SRC_TYPE_SIMPLE         0
158#define SRC_TYPE_STRUCT         1
159#define SRC_TYPE_UNION          2
160
161
162typedef struct acpi_identifier_table
163{
164    char                        *Identifier;
165
166} ACPI_IDENTIFIER_TABLE;
167
168typedef struct acpi_conversion_table
169{
170    char                        *NewHeader;
171    UINT32                      Flags;
172
173    ACPI_TYPED_IDENTIFIER_TABLE *LowerCaseTable;
174
175    char                        *SourceSpdxHeader;
176    ACPI_STRING_TABLE           *SourceStringTable;
177    ACPI_IDENTIFIER_TABLE       *SourceLineTable;
178    ACPI_IDENTIFIER_TABLE       *SourceConditionalTable;
179    ACPI_IDENTIFIER_TABLE       *SourceMacroTable;
180    ACPI_TYPED_IDENTIFIER_TABLE *SourceStructTable;
181    ACPI_IDENTIFIER_TABLE       *SourceSpecialMacroTable;
182    UINT32                      SourceFunctions;
183
184    char                        *HeaderSpdxHeader;
185    ACPI_STRING_TABLE           *HeaderStringTable;
186    ACPI_IDENTIFIER_TABLE       *HeaderLineTable;
187    ACPI_IDENTIFIER_TABLE       *HeaderConditionalTable;
188    ACPI_IDENTIFIER_TABLE       *HeaderMacroTable;
189    ACPI_TYPED_IDENTIFIER_TABLE *HeaderStructTable;
190    ACPI_IDENTIFIER_TABLE       *HeaderSpecialMacroTable;
191    UINT32                      HeaderFunctions;
192
193    /* SPDX header conversion for patches is not supported */
194    ACPI_STRING_TABLE           *PatchStringTable;
195    ACPI_IDENTIFIER_TABLE       *PatchLineTable;
196    ACPI_IDENTIFIER_TABLE       *PatchConditionalTable;
197    ACPI_IDENTIFIER_TABLE       *PatchMacroTable;
198    ACPI_TYPED_IDENTIFIER_TABLE *PatchStructTable;
199    ACPI_IDENTIFIER_TABLE       *PatchSpecialMacroTable;
200    UINT32                      PatchFunctions;
201
202} ACPI_CONVERSION_TABLE;
203
204
205/* Conversion tables */
206
207extern ACPI_CONVERSION_TABLE       LinuxConversionTable;
208extern ACPI_CONVERSION_TABLE       CleanupConversionTable;
209extern ACPI_CONVERSION_TABLE       StatsConversionTable;
210extern ACPI_CONVERSION_TABLE       CustomConversionTable;
211extern ACPI_CONVERSION_TABLE       LicenseConversionTable;
212extern ACPI_CONVERSION_TABLE       IndentConversionTable;
213
214typedef
215char * (*AS_SCAN_CALLBACK) (
216    char                    *Buffer,
217    char                    *Filename,
218    UINT32                  LineNumber);
219
220typedef struct as_brace_info
221{
222    char                    *Operator;
223    UINT32                  Length;
224
225} AS_BRACE_INFO;
226
227
228/* Prototypes */
229
230char *
231AsSkipUntilChar (
232    char                    *Buffer,
233    char                    Target);
234
235char *
236AsSkipPastChar (
237    char                    *Buffer,
238    char                    Target);
239
240char *
241AsReplaceData (
242    char                    *Buffer,
243    UINT32                  LengthToRemove,
244    char                    *BufferToAdd,
245    UINT32                  LengthToAdd);
246
247int
248AsReplaceString (
249    char                    *Target,
250    char                    *Replacement,
251    UINT8                   Type,
252    char                    *Buffer);
253
254int
255AsLowerCaseString (
256    char                    *Target,
257    char                    *Buffer);
258
259void
260AsRemoveLine (
261    char                    *Buffer,
262    char                    *Keyword);
263
264void
265AsCheckForBraces (
266    char                    *Buffer,
267    char                    *Filename);
268
269void
270AsTrimLines (
271    char                    *Buffer,
272    char                    *Filename);
273
274void
275AsMixedCaseToUnderscores (
276    char                    *Buffer,
277    char                    *Filename);
278
279void
280AsCountTabs (
281    char                    *Buffer,
282    char                    *Filename);
283
284void
285AsBracesOnSameLine (
286    char                    *Buffer);
287
288void
289AsLowerCaseIdentifiers (
290    char                    *Buffer);
291
292void
293AsReduceTypedefs (
294    char                    *Buffer,
295    char                    *Keyword);
296
297void
298AsRemoveDebugMacros (
299    char                    *Buffer);
300
301void
302AsRemoveEmptyBlocks (
303    char                    *Buffer,
304    char                    *Filename);
305
306void
307AsCleanupSpecialMacro (
308    char                    *Buffer,
309    char                    *Keyword);
310
311void
312AsCountSourceLines (
313    char                    *Buffer,
314    char                    *Filename);
315
316void
317AsCountNonAnsiComments (
318    char                    *Buffer,
319    char                    *Filename);
320
321void
322AsTrimWhitespace (
323    char                    *Buffer);
324
325void
326AsTabify4 (
327    char                    *Buffer);
328
329void
330AsTabify8 (
331    char                    *Buffer);
332
333void
334AsRemoveConditionalCompile (
335    char                    *Buffer,
336    char                    *Keyword);
337
338ACPI_NATIVE_INT
339AsProcessTree (
340    ACPI_CONVERSION_TABLE   *ConversionTable,
341    char                    *SourcePath,
342    char                    *TargetPath);
343
344int
345AsGetFile (
346    char                    *FileName,
347    char                    **FileBuffer,
348    UINT32                  *FileSize);
349
350int
351AsPutFile (
352    char                    *Pathname,
353    char                    *FileBuffer,
354    UINT32                  SystemFlags);
355
356void
357AsReplaceHeader (
358    char                    *Buffer,
359    char                    *NewHeader);
360
361void
362AsDoSpdxHeader (
363    char                    *Buffer,
364    char                    *SpdxHeader);
365
366void
367AsConvertFile (
368    ACPI_CONVERSION_TABLE   *ConversionTable,
369    char                    *FileBuffer,
370    char                    *Filename,
371    ACPI_NATIVE_INT         FileType);
372
373ACPI_NATIVE_INT
374AsProcessOneFile (
375    ACPI_CONVERSION_TABLE   *ConversionTable,
376    char                    *SourcePath,
377    char                    *TargetPath,
378    int                     MaxPathLength,
379    char                    *Filename,
380    ACPI_NATIVE_INT         FileType);
381
382ACPI_NATIVE_INT
383AsCheckForDirectory (
384    char                    *SourceDirPath,
385    char                    *TargetDirPath,
386    char                    *Filename,
387    char                    **SourcePath,
388    char                    **TargetPath);
389
390void
391AsRemoveExtraLines (
392    char                    *FileBuffer,
393    char                    *Filename);
394
395void
396AsRemoveSpacesAfterPeriod (
397    char                    *FileBuffer,
398    char                    *Filename);
399
400BOOLEAN
401AsMatchExactWord (
402    char                    *Word,
403    UINT32                  WordLength);
404
405void
406AsPrint (
407    char                    *Message,
408    UINT32                  Count,
409    char                    *Filename);
410
411void
412AsInsertPrefix (
413    char                    *Buffer,
414    char                    *Keyword,
415    UINT8                   Type);
416
417char *
418AsInsertData (
419    char                    *Buffer,
420    char                    *BufferToAdd,
421    UINT32                  LengthToAdd);
422
423char *
424AsRemoveData (
425    char                    *StartPointer,
426    char                    *EndPointer);
427
428void
429AsInsertCarriageReturns (
430    char                    *Buffer);
431
432void
433AsConvertToLineFeeds (
434    char                    *Buffer);
435