1 /******************************************************************************
2  *
3  * Module Name: acpisrc.h - Include file for AcpiSrc utility
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2013, 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 MERCHANTIBILITY 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 
47 #include <stdio.h>
48 #include <sys/stat.h>
49 #include <errno.h>
50 
51 /* mkdir support */
52 
53 #ifdef WIN32
54 #include <direct.h>
55 #else
56 #define mkdir(x) mkdir(x, 0770)
57 #endif
58 
59 
60 /* Constants */
61 
62 #define LINES_IN_LEGAL_HEADER               105 /* See above */
63 #define LEGAL_HEADER_SIGNATURE              " * 2.1. This is your license from Intel Corp. under its intellectual property"
64 #define LINES_IN_LINUX_HEADER               34
65 #define LINUX_HEADER_SIGNATURE              " * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"
66 #define LINES_IN_ASL_HEADER                 29 /* Header as output from disassembler */
67 
68 #define ASRC_MAX_FILE_SIZE                  (1024 * 100)
69 
70 #define FILE_TYPE_SOURCE                    1
71 #define FILE_TYPE_HEADER                    2
72 #define FILE_TYPE_DIRECTORY                 3
73 
74 #define CVT_COUNT_TABS                      0x00000001
75 #define CVT_COUNT_NON_ANSI_COMMENTS         0x00000002
76 #define CVT_TRIM_LINES                      0x00000004
77 #define CVT_CHECK_BRACES                    0x00000008
78 #define CVT_COUNT_LINES                     0x00000010
79 #define CVT_BRACES_ON_SAME_LINE             0x00000020
80 #define CVT_MIXED_CASE_TO_UNDERSCORES       0x00000040
81 #define CVT_LOWER_CASE_IDENTIFIERS          0x00000080
82 #define CVT_REMOVE_DEBUG_MACROS             0x00000100
83 #define CVT_TRIM_WHITESPACE                 0x00000200  /* Should be after all line removal */
84 #define CVT_REMOVE_EMPTY_BLOCKS             0x00000400  /* Should be after trimming lines */
85 #define CVT_REDUCE_TYPEDEFS                 0x00000800
86 #define CVT_COUNT_SHORTMULTILINE_COMMENTS   0x00001000
87 #define CVT_SPACES_TO_TABS4                 0x40000000  /* Tab conversion should be last */
88 #define CVT_SPACES_TO_TABS8                 0x80000000  /* Tab conversion should be last */
89 
90 #define FLG_DEFAULT_FLAGS                   0x00000000
91 #define FLG_NO_CARRIAGE_RETURNS             0x00000001
92 #define FLG_NO_FILE_OUTPUT                  0x00000002
93 #define FLG_LOWERCASE_DIRNAMES              0x00000004
94 
95 #define AS_START_IGNORE                     "/*!"
96 #define AS_STOP_IGNORE                      "!*/"
97 
98 
99 /* Globals */
100 
101 extern UINT32                   Gbl_Files;
102 extern UINT32                   Gbl_MissingBraces;
103 extern UINT32                   Gbl_Tabs;
104 extern UINT32                   Gbl_NonAnsiComments;
105 extern UINT32                   Gbl_SourceLines;
106 extern UINT32                   Gbl_WhiteLines;
107 extern UINT32                   Gbl_CommentLines;
108 extern UINT32                   Gbl_LongLines;
109 extern UINT32                   Gbl_TotalLines;
110 extern UINT32                   Gbl_HeaderSize;
111 extern UINT32                   Gbl_HeaderLines;
112 extern struct stat              Gbl_StatBuf;
113 extern char                     *Gbl_FileBuffer;
114 extern UINT32                   Gbl_TotalSize;
115 extern UINT32                   Gbl_FileSize;
116 extern UINT32                   Gbl_FileType;
117 extern BOOLEAN                  Gbl_VerboseMode;
118 extern BOOLEAN                  Gbl_QuietMode;
119 extern BOOLEAN                  Gbl_BatchMode;
120 extern BOOLEAN                  Gbl_MadeChanges;
121 extern BOOLEAN                  Gbl_Overwrite;
122 extern BOOLEAN                  Gbl_WidenDeclarations;
123 extern BOOLEAN                  Gbl_IgnoreLoneLineFeeds;
124 extern BOOLEAN                  Gbl_HasLoneLineFeeds;
125 extern BOOLEAN                  Gbl_Cleanup;
126 extern BOOLEAN                  Gbl_IgnoreTranslationEscapes;
127 extern void                     *Gbl_StructDefs;
128 
129 #define PARAM_LIST(pl)          pl
130 #define TERSE_PRINT(a)          if (!Gbl_VerboseMode) printf PARAM_LIST(a)
131 #define VERBOSE_PRINT(a)        if (Gbl_VerboseMode) printf PARAM_LIST(a)
132 
133 #define REPLACE_WHOLE_WORD      0x00
134 #define REPLACE_SUBSTRINGS      0x01
135 #define REPLACE_MASK            0x01
136 
137 #define EXTRA_INDENT_C          0x02
138 
139 
140 /* Conversion table structs */
141 
142 typedef struct acpi_string_table
143 {
144     char                        *Target;
145     char                        *Replacement;
146     UINT8                       Type;
147 
148 } ACPI_STRING_TABLE;
149 
150 
151 typedef struct acpi_typed_identifier_table
152 {
153     char                        *Identifier;
154     UINT8                       Type;
155 
156 } ACPI_TYPED_IDENTIFIER_TABLE;
157 
158 #define SRC_TYPE_SIMPLE         0
159 #define SRC_TYPE_STRUCT         1
160 #define SRC_TYPE_UNION          2
161 
162 
163 typedef struct acpi_identifier_table
164 {
165     char                        *Identifier;
166 
167 } ACPI_IDENTIFIER_TABLE;
168 
169 typedef struct acpi_conversion_table
170 {
171     char                        *NewHeader;
172     UINT32                      Flags;
173 
174     ACPI_TYPED_IDENTIFIER_TABLE *LowerCaseTable;
175 
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     ACPI_STRING_TABLE           *HeaderStringTable;
185     ACPI_IDENTIFIER_TABLE       *HeaderLineTable;
186     ACPI_IDENTIFIER_TABLE       *HeaderConditionalTable;
187     ACPI_IDENTIFIER_TABLE       *HeaderMacroTable;
188     ACPI_TYPED_IDENTIFIER_TABLE *HeaderStructTable;
189     ACPI_IDENTIFIER_TABLE       *HeaderSpecialMacroTable;
190     UINT32                      HeaderFunctions;
191 
192 } ACPI_CONVERSION_TABLE;
193 
194 
195 /* Conversion tables */
196 
197 extern ACPI_CONVERSION_TABLE       LinuxConversionTable;
198 extern ACPI_CONVERSION_TABLE       CleanupConversionTable;
199 extern ACPI_CONVERSION_TABLE       StatsConversionTable;
200 extern ACPI_CONVERSION_TABLE       CustomConversionTable;
201 extern ACPI_CONVERSION_TABLE       LicenseConversionTable;
202 extern ACPI_CONVERSION_TABLE       IndentConversionTable;
203 
204 
205 /* Prototypes */
206 
207 char *
208 AsSkipUntilChar (
209     char                    *Buffer,
210     char                    Target);
211 
212 char *
213 AsSkipPastChar (
214     char                    *Buffer,
215     char                    Target);
216 
217 char *
218 AsReplaceData (
219     char                    *Buffer,
220     UINT32                  LengthToRemove,
221     char                    *BufferToAdd,
222     UINT32                  LengthToAdd);
223 
224 int
225 AsReplaceString (
226     char                    *Target,
227     char                    *Replacement,
228     UINT8                   Type,
229     char                    *Buffer);
230 
231 int
232 AsLowerCaseString (
233     char                    *Target,
234     char                    *Buffer);
235 
236 void
237 AsRemoveLine (
238     char                    *Buffer,
239     char                    *Keyword);
240 
241 void
242 AsRemoveMacro (
243     char                    *Buffer,
244     char                    *Keyword);
245 
246 void
247 AsCheckForBraces (
248     char                    *Buffer,
249     char                    *Filename);
250 
251 void
252 AsTrimLines (
253     char                    *Buffer,
254     char                    *Filename);
255 
256 void
257 AsMixedCaseToUnderscores (
258     char                    *Buffer,
259     char                    *Filename);
260 
261 void
262 AsCountTabs (
263     char                    *Buffer,
264     char                    *Filename);
265 
266 void
267 AsBracesOnSameLine (
268     char                    *Buffer);
269 
270 void
271 AsLowerCaseIdentifiers (
272     char                    *Buffer);
273 
274 void
275 AsReduceTypedefs (
276     char                    *Buffer,
277     char                    *Keyword);
278 
279 void
280 AsRemoveDebugMacros (
281     char                    *Buffer);
282 
283 void
284 AsRemoveEmptyBlocks (
285     char                    *Buffer,
286     char                    *Filename);
287 
288 void
289 AsCleanupSpecialMacro (
290     char                    *Buffer,
291     char                    *Keyword);
292 
293 void
294 AsCountSourceLines (
295     char                    *Buffer,
296     char                    *Filename);
297 
298 void
299 AsCountNonAnsiComments (
300     char                    *Buffer,
301     char                    *Filename);
302 
303 void
304 AsTrimWhitespace (
305     char                    *Buffer);
306 
307 void
308 AsTabify4 (
309     char                    *Buffer);
310 
311 void
312 AsTabify8 (
313     char                    *Buffer);
314 
315 void
316 AsRemoveConditionalCompile (
317     char                    *Buffer,
318     char                    *Keyword);
319 
320 ACPI_NATIVE_INT
321 AsProcessTree (
322     ACPI_CONVERSION_TABLE   *ConversionTable,
323     char                    *SourcePath,
324     char                    *TargetPath);
325 
326 int
327 AsGetFile (
328     char                    *FileName,
329     char                    **FileBuffer,
330     UINT32                  *FileSize);
331 
332 int
333 AsPutFile (
334     char                    *Pathname,
335     char                    *FileBuffer,
336     UINT32                  SystemFlags);
337 
338 void
339 AsReplaceHeader (
340     char                    *Buffer,
341     char                    *NewHeader);
342 
343 void
344 AsConvertFile (
345     ACPI_CONVERSION_TABLE   *ConversionTable,
346     char                    *FileBuffer,
347     char                    *Filename,
348     ACPI_NATIVE_INT         FileType);
349 
350 ACPI_NATIVE_INT
351 AsProcessOneFile (
352     ACPI_CONVERSION_TABLE   *ConversionTable,
353     char                    *SourcePath,
354     char                    *TargetPath,
355     int                     MaxPathLength,
356     char                    *Filename,
357     ACPI_NATIVE_INT         FileType);
358 
359 ACPI_NATIVE_INT
360 AsCheckForDirectory (
361     char                    *SourceDirPath,
362     char                    *TargetDirPath,
363     char                    *Filename,
364     char                    **SourcePath,
365     char                    **TargetPath);
366 
367 void
368 AsRemoveExtraLines (
369     char                    *FileBuffer,
370     char                    *Filename);
371 
372 void
373 AsRemoveSpacesAfterPeriod (
374     char                    *FileBuffer,
375     char                    *Filename);
376 
377 BOOLEAN
378 AsMatchExactWord (
379     char                    *Word,
380     UINT32                  WordLength);
381 
382 void
383 AsPrint (
384     char                    *Message,
385     UINT32                  Count,
386     char                    *Filename);
387 
388 void
389 AsInsertPrefix (
390     char                    *Buffer,
391     char                    *Keyword,
392     UINT8                   Type);
393 
394 char *
395 AsInsertData (
396     char                    *Buffer,
397     char                    *BufferToAdd,
398     UINT32                  LengthToAdd);
399 
400 char *
401 AsRemoveData (
402     char                    *StartPointer,
403     char                    *EndPointer);
404 
405 void
406 AsInsertCarriageReturns (
407     char                    *Buffer);
408 
409 void
410 AsConvertToLineFeeds (
411     char                    *Buffer);
412 
413 void
414 AsStrlwr (
415     char                    *SrcString);
416