xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/asllistsup.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
1ff4a156dSchristos /******************************************************************************
2ff4a156dSchristos  *
3ff4a156dSchristos  * Module Name: asllistsup - Listing file support utilities
4ff4a156dSchristos  *
5ff4a156dSchristos  *****************************************************************************/
6ff4a156dSchristos 
7ff4a156dSchristos /*
8*046a2985Schristos  * Copyright (C) 2000 - 2023, Intel Corp.
9ff4a156dSchristos  * All rights reserved.
10ff4a156dSchristos  *
11ff4a156dSchristos  * Redistribution and use in source and binary forms, with or without
12ff4a156dSchristos  * modification, are permitted provided that the following conditions
13ff4a156dSchristos  * are met:
14ff4a156dSchristos  * 1. Redistributions of source code must retain the above copyright
15ff4a156dSchristos  *    notice, this list of conditions, and the following disclaimer,
16ff4a156dSchristos  *    without modification.
17ff4a156dSchristos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18ff4a156dSchristos  *    substantially similar to the "NO WARRANTY" disclaimer below
19ff4a156dSchristos  *    ("Disclaimer") and any redistribution must be conditioned upon
20ff4a156dSchristos  *    including a substantially similar Disclaimer requirement for further
21ff4a156dSchristos  *    binary redistribution.
22ff4a156dSchristos  * 3. Neither the names of the above-listed copyright holders nor the names
23ff4a156dSchristos  *    of any contributors may be used to endorse or promote products derived
24ff4a156dSchristos  *    from this software without specific prior written permission.
25ff4a156dSchristos  *
26ff4a156dSchristos  * Alternatively, this software may be distributed under the terms of the
27ff4a156dSchristos  * GNU General Public License ("GPL") version 2 as published by the Free
28ff4a156dSchristos  * Software Foundation.
29ff4a156dSchristos  *
30ff4a156dSchristos  * NO WARRANTY
31ff4a156dSchristos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32ff4a156dSchristos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34ff4a156dSchristos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35ff4a156dSchristos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36ff4a156dSchristos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37ff4a156dSchristos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38ff4a156dSchristos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39ff4a156dSchristos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40ff4a156dSchristos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41ff4a156dSchristos  * POSSIBILITY OF SUCH DAMAGES.
42ff4a156dSchristos  */
43ff4a156dSchristos 
44ff4a156dSchristos #include "aslcompiler.h"
45ff4a156dSchristos #include "aslcompiler.y.h"
46ff4a156dSchristos 
47ff4a156dSchristos 
48ff4a156dSchristos #define _COMPONENT          ACPI_COMPILER
49ff4a156dSchristos         ACPI_MODULE_NAME    ("aslistsup")
50ff4a156dSchristos 
51ff4a156dSchristos 
52ff4a156dSchristos /*******************************************************************************
53ff4a156dSchristos  *
54ff4a156dSchristos  * FUNCTION:    LsDumpAscii
55ff4a156dSchristos  *
56ff4a156dSchristos  * PARAMETERS:  FileId          - ID of current listing file
57ff4a156dSchristos  *              Count           - Number of bytes to convert
58ff4a156dSchristos  *              Buffer          - Buffer of bytes to convert
59ff4a156dSchristos  *
60ff4a156dSchristos  * RETURN:      None
61ff4a156dSchristos  *
62ff4a156dSchristos  * DESCRIPTION: Convert hex bytes to ascii
63ff4a156dSchristos  *
64ff4a156dSchristos  ******************************************************************************/
65ff4a156dSchristos 
66ff4a156dSchristos void
LsDumpAscii(UINT32 FileId,UINT32 Count,UINT8 * Buffer)67ff4a156dSchristos LsDumpAscii (
68ff4a156dSchristos     UINT32                  FileId,
69ff4a156dSchristos     UINT32                  Count,
70ff4a156dSchristos     UINT8                   *Buffer)
71ff4a156dSchristos {
72ff4a156dSchristos     UINT8                   BufChar;
73ff4a156dSchristos     UINT32                  i;
74ff4a156dSchristos 
75ff4a156dSchristos 
76ff4a156dSchristos     FlPrintFile (FileId, "    \"");
77ff4a156dSchristos     for (i = 0; i < Count; i++)
78ff4a156dSchristos     {
79ff4a156dSchristos         BufChar = Buffer[i];
80ff4a156dSchristos         if (isprint (BufChar))
81ff4a156dSchristos         {
82ff4a156dSchristos             FlPrintFile (FileId, "%c", BufChar);
83ff4a156dSchristos         }
84ff4a156dSchristos         else
85ff4a156dSchristos         {
86ff4a156dSchristos             /* Not a printable character, just put out a dot */
87ff4a156dSchristos 
88ff4a156dSchristos             FlPrintFile (FileId, ".");
89ff4a156dSchristos         }
90ff4a156dSchristos     }
9171e38f1dSchristos 
92ff4a156dSchristos     FlPrintFile (FileId, "\"");
93ff4a156dSchristos }
94ff4a156dSchristos 
95ff4a156dSchristos 
96ff4a156dSchristos /*******************************************************************************
97ff4a156dSchristos  *
98ff4a156dSchristos  * FUNCTION:    LsDumpAsciiInComment
99ff4a156dSchristos  *
100ff4a156dSchristos  * PARAMETERS:  FileId          - ID of current listing file
101ff4a156dSchristos  *              Count           - Number of bytes to convert
102ff4a156dSchristos  *              Buffer          - Buffer of bytes to convert
103ff4a156dSchristos  *
104ff4a156dSchristos  * RETURN:      None
105ff4a156dSchristos  *
106ff4a156dSchristos  * DESCRIPTION: Convert hex bytes to ascii
107ff4a156dSchristos  *
108ff4a156dSchristos  ******************************************************************************/
109ff4a156dSchristos 
110ff4a156dSchristos void
LsDumpAsciiInComment(UINT32 FileId,UINT32 Count,UINT8 * Buffer)111ff4a156dSchristos LsDumpAsciiInComment (
112ff4a156dSchristos     UINT32                  FileId,
113ff4a156dSchristos     UINT32                  Count,
114ff4a156dSchristos     UINT8                   *Buffer)
115ff4a156dSchristos {
116ff4a156dSchristos     UINT8                   BufChar = 0;
117ff4a156dSchristos     UINT8                   LastChar;
118ff4a156dSchristos     UINT32                  i;
119ff4a156dSchristos 
120ff4a156dSchristos 
121ff4a156dSchristos     FlPrintFile (FileId, "    \"");
122ff4a156dSchristos     for (i = 0; i < Count; i++)
123ff4a156dSchristos     {
124ff4a156dSchristos         LastChar = BufChar;
125ff4a156dSchristos         BufChar = Buffer[i];
126ff4a156dSchristos 
127ff4a156dSchristos         if (isprint (BufChar))
128ff4a156dSchristos         {
129ff4a156dSchristos             /* Handle embedded C comment sequences */
130ff4a156dSchristos 
131ff4a156dSchristos             if (((LastChar == '*') && (BufChar == '/')) ||
132ff4a156dSchristos                 ((LastChar == '/') && (BufChar == '*')))
133ff4a156dSchristos             {
134ff4a156dSchristos                 /* Insert a space to break the sequence */
135ff4a156dSchristos 
136783af925Schristos                 FlPrintFile (FileId, " ");
137ff4a156dSchristos             }
138ff4a156dSchristos 
139ff4a156dSchristos             FlPrintFile (FileId, "%c", BufChar);
140ff4a156dSchristos         }
141ff4a156dSchristos         else
142ff4a156dSchristos         {
143ff4a156dSchristos             /* Not a printable character, just put out a dot */
144ff4a156dSchristos 
145ff4a156dSchristos             FlPrintFile (FileId, ".");
146ff4a156dSchristos         }
147ff4a156dSchristos     }
148ff4a156dSchristos 
149ff4a156dSchristos     FlPrintFile (FileId, "\"");
150ff4a156dSchristos }
151ff4a156dSchristos 
152ff4a156dSchristos 
153ff4a156dSchristos /*******************************************************************************
154ff4a156dSchristos  *
155ff4a156dSchristos  * FUNCTION:    LsCheckException
156ff4a156dSchristos  *
157ff4a156dSchristos  * PARAMETERS:  LineNumber          - Current logical (cumulative) line #
158ff4a156dSchristos  *              FileId              - ID of output listing file
159ff4a156dSchristos  *
160ff4a156dSchristos  * RETURN:      None
161ff4a156dSchristos  *
162ff4a156dSchristos  * DESCRIPTION: Check if there is an exception for this line, and if there is,
163ff4a156dSchristos  *              put it in the listing immediately. Handles multiple errors
1644c4e8184Schristos  *              per line. AslGbl_NextError points to the next error in the
165ff4a156dSchristos  *              sorted (by line #) list of compile errors/warnings.
166ff4a156dSchristos  *
167ff4a156dSchristos  ******************************************************************************/
168ff4a156dSchristos 
169ff4a156dSchristos void
LsCheckException(UINT32 LineNumber,UINT32 FileId)170ff4a156dSchristos LsCheckException (
171ff4a156dSchristos     UINT32                  LineNumber,
172ff4a156dSchristos     UINT32                  FileId)
173ff4a156dSchristos {
174ff4a156dSchristos 
1754c4e8184Schristos     if ((!AslGbl_NextError) ||
1764c4e8184Schristos         (LineNumber < AslGbl_NextError->LogicalLineNumber ))
177ff4a156dSchristos     {
178ff4a156dSchristos         return;
179ff4a156dSchristos     }
180ff4a156dSchristos 
181ff4a156dSchristos     /* Handle multiple errors per line */
182ff4a156dSchristos 
183ff4a156dSchristos     if (FileId == ASL_FILE_LISTING_OUTPUT)
184ff4a156dSchristos     {
1854c4e8184Schristos         while (AslGbl_NextError &&
1864c4e8184Schristos               (LineNumber >= AslGbl_NextError->LogicalLineNumber))
187ff4a156dSchristos         {
1884c4e8184Schristos             AePrintException (FileId, AslGbl_NextError, "\n[****iasl****]\n");
1894c4e8184Schristos             AslGbl_NextError = AslGbl_NextError->Next;
190ff4a156dSchristos         }
191ff4a156dSchristos 
192ff4a156dSchristos         FlPrintFile (FileId, "\n");
193ff4a156dSchristos     }
194ff4a156dSchristos }
195ff4a156dSchristos 
196ff4a156dSchristos 
197ff4a156dSchristos /*******************************************************************************
198ff4a156dSchristos  *
199ff4a156dSchristos  * FUNCTION:    LsWriteListingHexBytes
200ff4a156dSchristos  *
201ff4a156dSchristos  * PARAMETERS:  Buffer          - AML code buffer
202ff4a156dSchristos  *              Length          - Number of AML bytes to write
203ff4a156dSchristos  *              FileId          - ID of current listing file.
204ff4a156dSchristos  *
205ff4a156dSchristos  * RETURN:      None
206ff4a156dSchristos  *
207ff4a156dSchristos  * DESCRIPTION: Write the contents of the AML buffer to the listing file via
208ff4a156dSchristos  *              the listing buffer. The listing buffer is flushed every 16
209ff4a156dSchristos  *              AML bytes.
210ff4a156dSchristos  *
211ff4a156dSchristos  ******************************************************************************/
212ff4a156dSchristos 
213ff4a156dSchristos void
LsWriteListingHexBytes(UINT8 * Buffer,UINT32 Length,UINT32 FileId)214ff4a156dSchristos LsWriteListingHexBytes (
215ff4a156dSchristos     UINT8                   *Buffer,
216ff4a156dSchristos     UINT32                  Length,
217ff4a156dSchristos     UINT32                  FileId)
218ff4a156dSchristos {
219ff4a156dSchristos     UINT32                  i;
220ff4a156dSchristos 
221ff4a156dSchristos 
222ff4a156dSchristos     /* Transfer all requested bytes */
223ff4a156dSchristos 
224ff4a156dSchristos     for (i = 0; i < Length; i++)
225ff4a156dSchristos     {
226ff4a156dSchristos         /* Print line header when buffer is empty */
227ff4a156dSchristos 
2284c4e8184Schristos         if (AslGbl_CurrentHexColumn == 0)
229ff4a156dSchristos         {
2304c4e8184Schristos             if (AslGbl_HasIncludeFiles)
231ff4a156dSchristos             {
232ff4a156dSchristos                 FlPrintFile (FileId, "%*s", 10, " ");
233ff4a156dSchristos             }
234ff4a156dSchristos 
235ff4a156dSchristos             switch (FileId)
236ff4a156dSchristos             {
237ff4a156dSchristos             case ASL_FILE_LISTING_OUTPUT:
238ff4a156dSchristos 
2394c4e8184Schristos                 FlPrintFile (FileId, "%8.8X%s", AslGbl_CurrentAmlOffset,
240ff4a156dSchristos                     ASL_LISTING_LINE_PREFIX);
241ff4a156dSchristos                 break;
242ff4a156dSchristos 
243ff4a156dSchristos             case ASL_FILE_ASM_SOURCE_OUTPUT:
244ff4a156dSchristos 
245ff4a156dSchristos                 FlPrintFile (FileId, "    db ");
246ff4a156dSchristos                 break;
247ff4a156dSchristos 
248ff4a156dSchristos             case ASL_FILE_C_SOURCE_OUTPUT:
249ff4a156dSchristos 
250ff4a156dSchristos                 FlPrintFile (FileId, "        ");
251ff4a156dSchristos                 break;
252ff4a156dSchristos 
253ff4a156dSchristos             default:
254ff4a156dSchristos 
255ff4a156dSchristos                 /* No other types supported */
256ff4a156dSchristos 
257ff4a156dSchristos                 return;
258ff4a156dSchristos             }
259ff4a156dSchristos         }
260ff4a156dSchristos 
261ff4a156dSchristos         /* Transfer AML byte and update counts */
262ff4a156dSchristos 
2634c4e8184Schristos         AslGbl_AmlBuffer[AslGbl_CurrentHexColumn] = Buffer[i];
264ff4a156dSchristos 
2654c4e8184Schristos         AslGbl_CurrentHexColumn++;
2664c4e8184Schristos         AslGbl_CurrentAmlOffset++;
267ff4a156dSchristos 
268ff4a156dSchristos         /* Flush buffer when it is full */
269ff4a156dSchristos 
2704c4e8184Schristos         if (AslGbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)
271ff4a156dSchristos         {
272ff4a156dSchristos             LsFlushListingBuffer (FileId);
273ff4a156dSchristos         }
274ff4a156dSchristos     }
275ff4a156dSchristos }
276ff4a156dSchristos 
277ff4a156dSchristos 
278ff4a156dSchristos /*******************************************************************************
279ff4a156dSchristos  *
280ff4a156dSchristos  * FUNCTION:    LsWriteSourceLines
281ff4a156dSchristos  *
282ff4a156dSchristos  * PARAMETERS:  ToLineNumber            -
283ff4a156dSchristos  *              ToLogicalLineNumber     - Write up to this source line number
284ff4a156dSchristos  *              FileId                  - ID of current listing file
285ff4a156dSchristos  *
286ff4a156dSchristos  * RETURN:      None
287ff4a156dSchristos  *
288ff4a156dSchristos  * DESCRIPTION: Read then write source lines to the listing file until we have
289ff4a156dSchristos  *              reached the specified logical (cumulative) line number. This
290ff4a156dSchristos  *              automatically echos out comment blocks and other non-AML
291ff4a156dSchristos  *              generating text until we get to the actual AML-generating line
292ff4a156dSchristos  *              of ASL code specified by the logical line number.
293ff4a156dSchristos  *
294ff4a156dSchristos  ******************************************************************************/
295ff4a156dSchristos 
296ff4a156dSchristos void
LsWriteSourceLines(UINT32 ToLineNumber,UINT32 ToLogicalLineNumber,UINT32 FileId)297ff4a156dSchristos LsWriteSourceLines (
298ff4a156dSchristos     UINT32                  ToLineNumber,
299ff4a156dSchristos     UINT32                  ToLogicalLineNumber,
300ff4a156dSchristos     UINT32                  FileId)
301ff4a156dSchristos {
302ff4a156dSchristos 
303ff4a156dSchristos     /* Nothing to do for these file types */
304ff4a156dSchristos 
305ff4a156dSchristos     if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
306ff4a156dSchristos         (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
307ff4a156dSchristos     {
308ff4a156dSchristos         return;
309ff4a156dSchristos     }
310ff4a156dSchristos 
3114c4e8184Schristos     AslGbl_CurrentLine = ToLogicalLineNumber;
312ff4a156dSchristos 
313ff4a156dSchristos     /* Flush any hex bytes remaining from the last opcode */
314ff4a156dSchristos 
315ff4a156dSchristos     LsFlushListingBuffer (FileId);
316ff4a156dSchristos 
317ff4a156dSchristos     /* Read lines and write them as long as we are not caught up */
318ff4a156dSchristos 
3194c4e8184Schristos     if (AslGbl_SourceLine < AslGbl_CurrentLine)
320ff4a156dSchristos     {
321ff4a156dSchristos         /*
322ff4a156dSchristos          * If we just completed writing some AML hex bytes, output a linefeed
323ff4a156dSchristos          * to add some whitespace for readability.
324ff4a156dSchristos          */
3254c4e8184Schristos         if (AslGbl_HexBytesWereWritten)
326ff4a156dSchristos         {
327ff4a156dSchristos             FlPrintFile (FileId, "\n");
3284c4e8184Schristos             AslGbl_HexBytesWereWritten = FALSE;
329ff4a156dSchristos         }
330ff4a156dSchristos 
331ff4a156dSchristos         if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
332ff4a156dSchristos         {
333ff4a156dSchristos             FlPrintFile (FileId, "    /*\n");
334ff4a156dSchristos         }
335ff4a156dSchristos 
336ff4a156dSchristos         /* Write one line at a time until we have reached the target line # */
337ff4a156dSchristos 
3384c4e8184Schristos         while ((AslGbl_SourceLine < AslGbl_CurrentLine) &&
339ff4a156dSchristos                 LsWriteOneSourceLine (FileId))
340ff4a156dSchristos         { ; }
341ff4a156dSchristos 
342ff4a156dSchristos         if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
343ff4a156dSchristos         {
344ff4a156dSchristos             FlPrintFile (FileId, "     */");
345ff4a156dSchristos         }
346ff4a156dSchristos 
347ff4a156dSchristos         FlPrintFile (FileId, "\n");
348ff4a156dSchristos     }
349ff4a156dSchristos }
350ff4a156dSchristos 
351ff4a156dSchristos 
352ff4a156dSchristos /*******************************************************************************
353ff4a156dSchristos  *
354ff4a156dSchristos  * FUNCTION:    LsWriteOneSourceLine
355ff4a156dSchristos  *
356ff4a156dSchristos  * PARAMETERS:  FileId          - ID of current listing file
357ff4a156dSchristos  *
358ff4a156dSchristos  * RETURN:      FALSE on EOF (input source file), TRUE otherwise
359ff4a156dSchristos  *
360ff4a156dSchristos  * DESCRIPTION: Read one line from the input source file and echo it to the
361ff4a156dSchristos  *              listing file, prefixed with the line number, and if the source
362ff4a156dSchristos  *              file contains include files, prefixed with the current filename
363ff4a156dSchristos  *
364ff4a156dSchristos  ******************************************************************************/
365ff4a156dSchristos 
366ff4a156dSchristos UINT32
LsWriteOneSourceLine(UINT32 FileId)367ff4a156dSchristos LsWriteOneSourceLine (
368ff4a156dSchristos     UINT32                  FileId)
369ff4a156dSchristos {
370ff4a156dSchristos     UINT8                   FileByte;
371ff4a156dSchristos     UINT32                  Column = 0;
372ff4a156dSchristos     UINT32                  Index = 16;
373ff4a156dSchristos     BOOLEAN                 StartOfLine = FALSE;
374ff4a156dSchristos     BOOLEAN                 ProcessLongLine = FALSE;
375ff4a156dSchristos 
376ff4a156dSchristos 
3774c4e8184Schristos     AslGbl_SourceLine++;
3784c4e8184Schristos     AslGbl_ListingNode->LineNumber++;
379ff4a156dSchristos 
380ff4a156dSchristos     /* Ignore lines that are completely blank (but count the line above) */
381ff4a156dSchristos 
382ff4a156dSchristos     if (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) != AE_OK)
383ff4a156dSchristos     {
384ff4a156dSchristos         return (0);
385ff4a156dSchristos     }
386ff4a156dSchristos     if (FileByte == '\n')
387ff4a156dSchristos     {
388ff4a156dSchristos         return (1);
389ff4a156dSchristos     }
390ff4a156dSchristos 
391ff4a156dSchristos     /*
392ff4a156dSchristos      * This is a non-empty line, we will print the entire line with
393ff4a156dSchristos      * the line number and possibly other prefixes and transforms.
394ff4a156dSchristos      */
395ff4a156dSchristos 
396ff4a156dSchristos     /* Line prefixes for special files, C and ASM output */
397ff4a156dSchristos 
398ff4a156dSchristos     if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
399ff4a156dSchristos     {
400ff4a156dSchristos         FlPrintFile (FileId, "     *");
401ff4a156dSchristos     }
402ff4a156dSchristos     if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
403ff4a156dSchristos     {
404ff4a156dSchristos         FlPrintFile (FileId, "; ");
405ff4a156dSchristos     }
406ff4a156dSchristos 
4074c4e8184Schristos     if (AslGbl_HasIncludeFiles)
408ff4a156dSchristos     {
409ff4a156dSchristos         /*
410ff4a156dSchristos          * This file contains "include" statements, print the current
411ff4a156dSchristos          * filename and line number within the current file
412ff4a156dSchristos          */
413ff4a156dSchristos         FlPrintFile (FileId, "%12s %5d%s",
4144c4e8184Schristos             AslGbl_ListingNode->Filename, AslGbl_ListingNode->LineNumber,
415ff4a156dSchristos             ASL_LISTING_LINE_PREFIX);
416ff4a156dSchristos     }
417ff4a156dSchristos     else
418ff4a156dSchristos     {
419ff4a156dSchristos         /* No include files, just print the line number */
420ff4a156dSchristos 
4214c4e8184Schristos         FlPrintFile (FileId, "%8u%s", AslGbl_SourceLine,
422ff4a156dSchristos             ASL_LISTING_LINE_PREFIX);
423ff4a156dSchristos     }
424ff4a156dSchristos 
425ff4a156dSchristos     /* Read the rest of this line (up to a newline or EOF) */
426ff4a156dSchristos 
427ff4a156dSchristos     do
428ff4a156dSchristos     {
429ff4a156dSchristos         if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
430ff4a156dSchristos         {
431ff4a156dSchristos             if (FileByte == '/')
432ff4a156dSchristos             {
433ff4a156dSchristos                 FileByte = '*';
434ff4a156dSchristos             }
435ff4a156dSchristos         }
436ff4a156dSchristos 
437ff4a156dSchristos         /* Split long input lines for readability in the listing */
438ff4a156dSchristos 
439ff4a156dSchristos         Column++;
440ff4a156dSchristos         if (Column >= 128)
441ff4a156dSchristos         {
442ff4a156dSchristos             if (!ProcessLongLine)
443ff4a156dSchristos             {
444ff4a156dSchristos                 if ((FileByte != '}') &&
445ff4a156dSchristos                     (FileByte != '{'))
446ff4a156dSchristos                 {
447ff4a156dSchristos                     goto WriteByte;
448ff4a156dSchristos                 }
449ff4a156dSchristos 
450ff4a156dSchristos                 ProcessLongLine = TRUE;
451ff4a156dSchristos             }
452ff4a156dSchristos 
453ff4a156dSchristos             if (FileByte == '{')
454ff4a156dSchristos             {
455ff4a156dSchristos                 FlPrintFile (FileId, "\n%*s{\n", Index, " ");
456ff4a156dSchristos                 StartOfLine = TRUE;
457ff4a156dSchristos                 Index += 4;
458ff4a156dSchristos                 continue;
459ff4a156dSchristos             }
460ff4a156dSchristos 
461ff4a156dSchristos             else if (FileByte == '}')
462ff4a156dSchristos             {
463ff4a156dSchristos                 if (!StartOfLine)
464ff4a156dSchristos                 {
465ff4a156dSchristos                     FlPrintFile (FileId, "\n");
466ff4a156dSchristos                 }
467ff4a156dSchristos 
468ff4a156dSchristos                 StartOfLine = TRUE;
469ff4a156dSchristos                 Index -= 4;
470ff4a156dSchristos                 FlPrintFile (FileId, "%*s}\n", Index, " ");
471ff4a156dSchristos                 continue;
472ff4a156dSchristos             }
473ff4a156dSchristos 
474ff4a156dSchristos             /* Ignore spaces/tabs at the start of line */
475ff4a156dSchristos 
476ff4a156dSchristos             else if ((FileByte == ' ') && StartOfLine)
477ff4a156dSchristos             {
478ff4a156dSchristos                 continue;
479ff4a156dSchristos             }
480ff4a156dSchristos 
481ff4a156dSchristos             else if (StartOfLine)
482ff4a156dSchristos             {
483ff4a156dSchristos                 StartOfLine = FALSE;
484ff4a156dSchristos                 FlPrintFile (FileId, "%*s", Index, " ");
485ff4a156dSchristos             }
486ff4a156dSchristos 
487ff4a156dSchristos WriteByte:
488ff4a156dSchristos             FlWriteFile (FileId, &FileByte, 1);
489ff4a156dSchristos             if (FileByte == '\n')
490ff4a156dSchristos             {
491ff4a156dSchristos                 /*
492ff4a156dSchristos                  * This line has been completed.
493ff4a156dSchristos                  * Check if an error occurred on this source line during the compile.
494ff4a156dSchristos                  * If so, we print the error message after the source line.
495ff4a156dSchristos                  */
4964c4e8184Schristos                 LsCheckException (AslGbl_SourceLine, FileId);
497ff4a156dSchristos                 return (1);
498ff4a156dSchristos             }
499ff4a156dSchristos         }
500ff4a156dSchristos         else
501ff4a156dSchristos         {
502ff4a156dSchristos             FlWriteFile (FileId, &FileByte, 1);
503ff4a156dSchristos             if (FileByte == '\n')
504ff4a156dSchristos             {
505ff4a156dSchristos                 /*
506ff4a156dSchristos                  * This line has been completed.
507ff4a156dSchristos                  * Check if an error occurred on this source line during the compile.
508ff4a156dSchristos                  * If so, we print the error message after the source line.
509ff4a156dSchristos                  */
5104c4e8184Schristos                 LsCheckException (AslGbl_SourceLine, FileId);
511ff4a156dSchristos                 return (1);
512ff4a156dSchristos             }
513ff4a156dSchristos         }
514ff4a156dSchristos 
515ff4a156dSchristos     } while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK);
516ff4a156dSchristos 
517ff4a156dSchristos     /* EOF on the input file was reached */
518ff4a156dSchristos 
519ff4a156dSchristos     return (0);
520ff4a156dSchristos }
521ff4a156dSchristos 
522ff4a156dSchristos 
523ff4a156dSchristos /*******************************************************************************
524ff4a156dSchristos  *
525ff4a156dSchristos  * FUNCTION:    LsFlushListingBuffer
526ff4a156dSchristos  *
527ff4a156dSchristos  * PARAMETERS:  FileId          - ID of the listing file
528ff4a156dSchristos  *
529ff4a156dSchristos  * RETURN:      None
530ff4a156dSchristos  *
531ff4a156dSchristos  * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code
532ff4a156dSchristos  *              buffer. Usually called at the termination of a single line
533ff4a156dSchristos  *              of source code or when the buffer is full.
534ff4a156dSchristos  *
535ff4a156dSchristos  ******************************************************************************/
536ff4a156dSchristos 
537ff4a156dSchristos void
LsFlushListingBuffer(UINT32 FileId)538ff4a156dSchristos LsFlushListingBuffer (
539ff4a156dSchristos     UINT32                  FileId)
540ff4a156dSchristos {
541ff4a156dSchristos     UINT32                  i;
542ff4a156dSchristos 
543ff4a156dSchristos 
5444c4e8184Schristos     if (AslGbl_CurrentHexColumn == 0)
545ff4a156dSchristos     {
546ff4a156dSchristos         return;
547ff4a156dSchristos     }
548ff4a156dSchristos 
549ff4a156dSchristos     /* Write the hex bytes */
550ff4a156dSchristos 
551ff4a156dSchristos     switch (FileId)
552ff4a156dSchristos     {
553ff4a156dSchristos     case ASL_FILE_LISTING_OUTPUT:
554ff4a156dSchristos 
5554c4e8184Schristos         for (i = 0; i < AslGbl_CurrentHexColumn; i++)
556ff4a156dSchristos         {
5574c4e8184Schristos             FlPrintFile (FileId, "%2.2X ", AslGbl_AmlBuffer[i]);
558ff4a156dSchristos         }
559ff4a156dSchristos 
5604c4e8184Schristos         for (i = 0; i < ((HEX_LISTING_LINE_SIZE - AslGbl_CurrentHexColumn) * 3); i++)
561ff4a156dSchristos         {
562ff4a156dSchristos             FlWriteFile (FileId, ".", 1);
563ff4a156dSchristos         }
564ff4a156dSchristos 
565ff4a156dSchristos         /* Write the ASCII character associated with each of the bytes */
566ff4a156dSchristos 
5674c4e8184Schristos         LsDumpAscii (FileId, AslGbl_CurrentHexColumn, AslGbl_AmlBuffer);
568ff4a156dSchristos         break;
569ff4a156dSchristos 
570ff4a156dSchristos 
571ff4a156dSchristos     case ASL_FILE_ASM_SOURCE_OUTPUT:
572ff4a156dSchristos 
5734c4e8184Schristos         for (i = 0; i < AslGbl_CurrentHexColumn; i++)
574ff4a156dSchristos         {
575ff4a156dSchristos             if (i > 0)
576ff4a156dSchristos             {
577ff4a156dSchristos                 FlPrintFile (FileId, ",");
578ff4a156dSchristos             }
57971e38f1dSchristos 
5804c4e8184Schristos             FlPrintFile (FileId, "0%2.2Xh", AslGbl_AmlBuffer[i]);
581ff4a156dSchristos         }
582ff4a156dSchristos 
5834c4e8184Schristos         for (i = 0; i < ((HEX_LISTING_LINE_SIZE - AslGbl_CurrentHexColumn) * 5); i++)
584ff4a156dSchristos         {
585ff4a156dSchristos             FlWriteFile (FileId, " ", 1);
586ff4a156dSchristos         }
587ff4a156dSchristos 
588ff4a156dSchristos         FlPrintFile (FileId, "  ;%8.8X",
5894c4e8184Schristos             AslGbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
590ff4a156dSchristos 
591ff4a156dSchristos         /* Write the ASCII character associated with each of the bytes */
592ff4a156dSchristos 
5934c4e8184Schristos         LsDumpAscii (FileId, AslGbl_CurrentHexColumn, AslGbl_AmlBuffer);
594ff4a156dSchristos         break;
595ff4a156dSchristos 
596ff4a156dSchristos 
597ff4a156dSchristos     case ASL_FILE_C_SOURCE_OUTPUT:
598ff4a156dSchristos 
5994c4e8184Schristos         for (i = 0; i < AslGbl_CurrentHexColumn; i++)
600ff4a156dSchristos         {
6014c4e8184Schristos             FlPrintFile (FileId, "0x%2.2X,", AslGbl_AmlBuffer[i]);
602ff4a156dSchristos         }
603ff4a156dSchristos 
604ff4a156dSchristos         /* Pad hex output with spaces if line is shorter than max line size */
605ff4a156dSchristos 
6064c4e8184Schristos         for (i = 0; i < ((HEX_LISTING_LINE_SIZE - AslGbl_CurrentHexColumn) * 5); i++)
607ff4a156dSchristos         {
608ff4a156dSchristos             FlWriteFile (FileId, " ", 1);
609ff4a156dSchristos         }
610ff4a156dSchristos 
611ff4a156dSchristos         /* AML offset for the start of the line */
612ff4a156dSchristos 
613ff4a156dSchristos         FlPrintFile (FileId, "    /* %8.8X",
6144c4e8184Schristos             AslGbl_CurrentAmlOffset - AslGbl_CurrentHexColumn);
615ff4a156dSchristos 
616ff4a156dSchristos         /* Write the ASCII character associated with each of the bytes */
617ff4a156dSchristos 
6184c4e8184Schristos         LsDumpAsciiInComment (FileId, AslGbl_CurrentHexColumn, AslGbl_AmlBuffer);
619ff4a156dSchristos         FlPrintFile (FileId, " */");
620ff4a156dSchristos         break;
621ff4a156dSchristos 
622ff4a156dSchristos     default:
623ff4a156dSchristos 
624ff4a156dSchristos         /* No other types supported */
625ff4a156dSchristos 
626ff4a156dSchristos         return;
627ff4a156dSchristos     }
628ff4a156dSchristos 
629ff4a156dSchristos     FlPrintFile (FileId, "\n");
630ff4a156dSchristos 
6314c4e8184Schristos     AslGbl_CurrentHexColumn = 0;
6324c4e8184Schristos     AslGbl_HexBytesWereWritten = TRUE;
633ff4a156dSchristos }
634ff4a156dSchristos 
635ff4a156dSchristos 
636ff4a156dSchristos /*******************************************************************************
637ff4a156dSchristos  *
638ff4a156dSchristos  * FUNCTION:    LsPushNode
639ff4a156dSchristos  *
640ff4a156dSchristos  * PARAMETERS:  Filename        - Pointer to the include filename
641ff4a156dSchristos  *
642ff4a156dSchristos  * RETURN:      None
643ff4a156dSchristos  *
644ff4a156dSchristos  * DESCRIPTION: Push a listing node on the listing/include file stack. This
645ff4a156dSchristos  *              stack enables tracking of include files (infinitely nested)
646ff4a156dSchristos  *              and resumption of the listing of the parent file when the
647ff4a156dSchristos  *              include file is finished.
648ff4a156dSchristos  *
649ff4a156dSchristos  ******************************************************************************/
650ff4a156dSchristos 
651ff4a156dSchristos void
LsPushNode(char * Filename)652ff4a156dSchristos LsPushNode (
653ff4a156dSchristos     char                    *Filename)
654ff4a156dSchristos {
655ff4a156dSchristos     ASL_LISTING_NODE        *Lnode;
656ff4a156dSchristos 
657ff4a156dSchristos 
658ff4a156dSchristos     /* Create a new node */
659ff4a156dSchristos 
660ff4a156dSchristos     Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));
661ff4a156dSchristos 
662ff4a156dSchristos     /* Initialize */
663ff4a156dSchristos 
664ff4a156dSchristos     Lnode->Filename = Filename;
665ff4a156dSchristos     Lnode->LineNumber = 0;
666ff4a156dSchristos 
667ff4a156dSchristos     /* Link (push) */
668ff4a156dSchristos 
6694c4e8184Schristos     Lnode->Next = AslGbl_ListingNode;
6704c4e8184Schristos     AslGbl_ListingNode = Lnode;
671ff4a156dSchristos }
672ff4a156dSchristos 
673ff4a156dSchristos 
674ff4a156dSchristos /*******************************************************************************
675ff4a156dSchristos  *
676ff4a156dSchristos  * FUNCTION:    LsPopNode
677ff4a156dSchristos  *
678ff4a156dSchristos  * PARAMETERS:  None
679ff4a156dSchristos  *
680ff4a156dSchristos  * RETURN:      List head after current head is popped off
681ff4a156dSchristos  *
682ff4a156dSchristos  * DESCRIPTION: Pop the current head of the list, free it, and return the
683ff4a156dSchristos  *              next node on the stack (the new current node).
684ff4a156dSchristos  *
685ff4a156dSchristos  ******************************************************************************/
686ff4a156dSchristos 
687ff4a156dSchristos ASL_LISTING_NODE *
LsPopNode(void)688ff4a156dSchristos LsPopNode (
689ff4a156dSchristos     void)
690ff4a156dSchristos {
691ff4a156dSchristos     ASL_LISTING_NODE        *Lnode;
692ff4a156dSchristos 
693ff4a156dSchristos 
694ff4a156dSchristos     /* Just grab the node at the head of the list */
695ff4a156dSchristos 
6964c4e8184Schristos     Lnode = AslGbl_ListingNode;
697ff4a156dSchristos     if ((!Lnode) ||
698ff4a156dSchristos         (!Lnode->Next))
699ff4a156dSchristos     {
700ff4a156dSchristos         AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,
701ff4a156dSchristos             "Could not pop empty listing stack");
7024c4e8184Schristos         return (AslGbl_ListingNode);
703ff4a156dSchristos     }
704ff4a156dSchristos 
7054c4e8184Schristos     AslGbl_ListingNode = Lnode->Next;
706ff4a156dSchristos     ACPI_FREE (Lnode);
707ff4a156dSchristos 
708ff4a156dSchristos     /* New "Current" node is the new head */
709ff4a156dSchristos 
7104c4e8184Schristos     return (AslGbl_ListingNode);
711ff4a156dSchristos }
712