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