asllistsup.c revision 249112
1249109Sjkim/******************************************************************************
2249109Sjkim *
3249109Sjkim * Module Name: asllistsup - Listing file support utilities
4249109Sjkim *
5249109Sjkim *****************************************************************************/
6249109Sjkim
7249109Sjkim/*
8249109Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9249109Sjkim * All rights reserved.
10249109Sjkim *
11249109Sjkim * Redistribution and use in source and binary forms, with or without
12249109Sjkim * modification, are permitted provided that the following conditions
13249109Sjkim * are met:
14249109Sjkim * 1. Redistributions of source code must retain the above copyright
15249109Sjkim *    notice, this list of conditions, and the following disclaimer,
16249109Sjkim *    without modification.
17249109Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18249109Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19249109Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20249109Sjkim *    including a substantially similar Disclaimer requirement for further
21249109Sjkim *    binary redistribution.
22249109Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23249109Sjkim *    of any contributors may be used to endorse or promote products derived
24249109Sjkim *    from this software without specific prior written permission.
25249109Sjkim *
26249109Sjkim * Alternatively, this software may be distributed under the terms of the
27249109Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28249109Sjkim * Software Foundation.
29249109Sjkim *
30249109Sjkim * NO WARRANTY
31249109Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32249109Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33249109Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34249109Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35249109Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36249109Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37249109Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38249109Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39249109Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40249109Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41249109Sjkim * POSSIBILITY OF SUCH DAMAGES.
42249109Sjkim */
43249109Sjkim
44249112Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45249109Sjkim#include "aslcompiler.y.h"
46249109Sjkim
47249109Sjkim
48249109Sjkim#define _COMPONENT          ACPI_COMPILER
49249109Sjkim        ACPI_MODULE_NAME    ("aslistsup")
50249109Sjkim
51249109Sjkim
52249109Sjkim/*******************************************************************************
53249109Sjkim *
54249109Sjkim * FUNCTION:    LsDumpAscii
55249109Sjkim *
56249109Sjkim * PARAMETERS:  FileId          - ID of current listing file
57249109Sjkim *              Count           - Number of bytes to convert
58249109Sjkim *              Buffer          - Buffer of bytes to convert
59249109Sjkim *
60249109Sjkim * RETURN:      None
61249109Sjkim *
62249109Sjkim * DESCRIPTION: Convert hex bytes to ascii
63249109Sjkim *
64249109Sjkim ******************************************************************************/
65249109Sjkim
66249109Sjkimvoid
67249109SjkimLsDumpAscii (
68249109Sjkim    UINT32                  FileId,
69249109Sjkim    UINT32                  Count,
70249109Sjkim    UINT8                   *Buffer)
71249109Sjkim{
72249109Sjkim    UINT8                   BufChar;
73249109Sjkim    UINT32                  i;
74249109Sjkim
75249109Sjkim
76249109Sjkim    FlPrintFile (FileId, "    \"");
77249109Sjkim    for (i = 0; i < Count; i++)
78249109Sjkim    {
79249109Sjkim        BufChar = Buffer[i];
80249109Sjkim        if (isprint (BufChar))
81249109Sjkim        {
82249109Sjkim            FlPrintFile (FileId, "%c", BufChar);
83249109Sjkim        }
84249109Sjkim        else
85249109Sjkim        {
86249109Sjkim            /* Not a printable character, just put out a dot */
87249109Sjkim
88249109Sjkim            FlPrintFile (FileId, ".");
89249109Sjkim        }
90249109Sjkim    }
91249109Sjkim    FlPrintFile (FileId, "\"");
92249109Sjkim}
93249109Sjkim
94249109Sjkim
95249109Sjkim/*******************************************************************************
96249109Sjkim *
97249109Sjkim * FUNCTION:    LsDumpAsciiInComment
98249109Sjkim *
99249109Sjkim * PARAMETERS:  FileId          - ID of current listing file
100249109Sjkim *              Count           - Number of bytes to convert
101249109Sjkim *              Buffer          - Buffer of bytes to convert
102249109Sjkim *
103249109Sjkim * RETURN:      None
104249109Sjkim *
105249109Sjkim * DESCRIPTION: Convert hex bytes to ascii
106249109Sjkim *
107249109Sjkim ******************************************************************************/
108249109Sjkim
109249109Sjkimvoid
110249109SjkimLsDumpAsciiInComment (
111249109Sjkim    UINT32                  FileId,
112249109Sjkim    UINT32                  Count,
113249109Sjkim    UINT8                   *Buffer)
114249109Sjkim{
115249109Sjkim    UINT8                   BufChar = 0;
116249109Sjkim    UINT8                   LastChar;
117249109Sjkim    UINT32                  i;
118249109Sjkim
119249109Sjkim
120249109Sjkim    FlPrintFile (FileId, "    \"");
121249109Sjkim    for (i = 0; i < Count; i++)
122249109Sjkim    {
123249109Sjkim        LastChar = BufChar;
124249109Sjkim        BufChar = Buffer[i];
125249109Sjkim
126249109Sjkim        if (isprint (BufChar))
127249109Sjkim        {
128249109Sjkim            /* Handle embedded C comment sequences */
129249109Sjkim
130249109Sjkim            if (((LastChar == '*') && (BufChar == '/')) ||
131249109Sjkim                ((LastChar == '/') && (BufChar == '*')))
132249109Sjkim            {
133249109Sjkim                /* Insert a space to break the sequence */
134249109Sjkim
135249109Sjkim                FlPrintFile (FileId, ".", BufChar);
136249109Sjkim            }
137249109Sjkim
138249109Sjkim            FlPrintFile (FileId, "%c", BufChar);
139249109Sjkim        }
140249109Sjkim        else
141249109Sjkim        {
142249109Sjkim            /* Not a printable character, just put out a dot */
143249109Sjkim
144249109Sjkim            FlPrintFile (FileId, ".");
145249109Sjkim        }
146249109Sjkim    }
147249109Sjkim
148249109Sjkim    FlPrintFile (FileId, "\"");
149249109Sjkim}
150249109Sjkim
151249109Sjkim
152249109Sjkim/*******************************************************************************
153249109Sjkim *
154249109Sjkim * FUNCTION:    LsCheckException
155249109Sjkim *
156249109Sjkim * PARAMETERS:  LineNumber          - Current logical (cumulative) line #
157249109Sjkim *              FileId              - ID of output listing file
158249109Sjkim *
159249109Sjkim * RETURN:      None
160249109Sjkim *
161249109Sjkim * DESCRIPTION: Check if there is an exception for this line, and if there is,
162249109Sjkim *              put it in the listing immediately. Handles multiple errors
163249109Sjkim *              per line. Gbl_NextError points to the next error in the
164249109Sjkim *              sorted (by line #) list of compile errors/warnings.
165249109Sjkim *
166249109Sjkim ******************************************************************************/
167249109Sjkim
168249109Sjkimvoid
169249109SjkimLsCheckException (
170249109Sjkim    UINT32                  LineNumber,
171249109Sjkim    UINT32                  FileId)
172249109Sjkim{
173249109Sjkim
174249109Sjkim    if ((!Gbl_NextError) ||
175249109Sjkim        (LineNumber < Gbl_NextError->LogicalLineNumber ))
176249109Sjkim    {
177249109Sjkim        return;
178249109Sjkim    }
179249109Sjkim
180249109Sjkim    /* Handle multiple errors per line */
181249109Sjkim
182249109Sjkim    if (FileId == ASL_FILE_LISTING_OUTPUT)
183249109Sjkim    {
184249109Sjkim        while (Gbl_NextError &&
185249109Sjkim              (LineNumber >= Gbl_NextError->LogicalLineNumber))
186249109Sjkim        {
187249109Sjkim            AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n");
188249109Sjkim
189249109Sjkim            Gbl_NextError = Gbl_NextError->Next;
190249109Sjkim        }
191249109Sjkim
192249109Sjkim        FlPrintFile (FileId, "\n");
193249109Sjkim    }
194249109Sjkim}
195249109Sjkim
196249109Sjkim
197249109Sjkim/*******************************************************************************
198249109Sjkim *
199249109Sjkim * FUNCTION:    LsWriteListingHexBytes
200249109Sjkim *
201249109Sjkim * PARAMETERS:  Buffer          - AML code buffer
202249109Sjkim *              Length          - Number of AML bytes to write
203249109Sjkim *              FileId          - ID of current listing file.
204249109Sjkim *
205249109Sjkim * RETURN:      None
206249109Sjkim *
207249109Sjkim * DESCRIPTION: Write the contents of the AML buffer to the listing file via
208249109Sjkim *              the listing buffer. The listing buffer is flushed every 16
209249109Sjkim *              AML bytes.
210249109Sjkim *
211249109Sjkim ******************************************************************************/
212249109Sjkim
213249109Sjkimvoid
214249109SjkimLsWriteListingHexBytes (
215249109Sjkim    UINT8                   *Buffer,
216249109Sjkim    UINT32                  Length,
217249109Sjkim    UINT32                  FileId)
218249109Sjkim{
219249109Sjkim    UINT32                  i;
220249109Sjkim
221249109Sjkim
222249109Sjkim    /* Transfer all requested bytes */
223249109Sjkim
224249109Sjkim    for (i = 0; i < Length; i++)
225249109Sjkim    {
226249109Sjkim        /* Print line header when buffer is empty */
227249109Sjkim
228249109Sjkim        if (Gbl_CurrentHexColumn == 0)
229249109Sjkim        {
230249109Sjkim            if (Gbl_HasIncludeFiles)
231249109Sjkim            {
232249109Sjkim                FlPrintFile (FileId, "%*s", 10, " ");
233249109Sjkim            }
234249109Sjkim
235249109Sjkim            switch (FileId)
236249109Sjkim            {
237249109Sjkim            case ASL_FILE_LISTING_OUTPUT:
238249109Sjkim
239249109Sjkim                FlPrintFile (FileId, "%8.8X%s", Gbl_CurrentAmlOffset,
240249109Sjkim                    ASL_LISTING_LINE_PREFIX);
241249109Sjkim                break;
242249109Sjkim
243249109Sjkim            case ASL_FILE_ASM_SOURCE_OUTPUT:
244249109Sjkim
245249109Sjkim                FlPrintFile (FileId, "    db ");
246249109Sjkim                break;
247249109Sjkim
248249109Sjkim            case ASL_FILE_C_SOURCE_OUTPUT:
249249109Sjkim
250249109Sjkim                FlPrintFile (FileId, "        ");
251249109Sjkim                break;
252249109Sjkim
253249109Sjkim            default:
254249109Sjkim                /* No other types supported */
255249109Sjkim                return;
256249109Sjkim            }
257249109Sjkim        }
258249109Sjkim
259249109Sjkim        /* Transfer AML byte and update counts */
260249109Sjkim
261249109Sjkim        Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i];
262249109Sjkim
263249109Sjkim        Gbl_CurrentHexColumn++;
264249109Sjkim        Gbl_CurrentAmlOffset++;
265249109Sjkim
266249109Sjkim        /* Flush buffer when it is full */
267249109Sjkim
268249109Sjkim        if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)
269249109Sjkim        {
270249109Sjkim            LsFlushListingBuffer (FileId);
271249109Sjkim        }
272249109Sjkim    }
273249109Sjkim}
274249109Sjkim
275249109Sjkim
276249109Sjkim/*******************************************************************************
277249109Sjkim *
278249109Sjkim * FUNCTION:    LsWriteSourceLines
279249109Sjkim *
280249109Sjkim * PARAMETERS:  ToLineNumber            -
281249109Sjkim *              ToLogicalLineNumber     - Write up to this source line number
282249109Sjkim *              FileId                  - ID of current listing file
283249109Sjkim *
284249109Sjkim * RETURN:      None
285249109Sjkim *
286249109Sjkim * DESCRIPTION: Read then write source lines to the listing file until we have
287249109Sjkim *              reached the specified logical (cumulative) line number. This
288249109Sjkim *              automatically echos out comment blocks and other non-AML
289249109Sjkim *              generating text until we get to the actual AML-generating line
290249109Sjkim *              of ASL code specified by the logical line number.
291249109Sjkim *
292249109Sjkim ******************************************************************************/
293249109Sjkim
294249109Sjkimvoid
295249109SjkimLsWriteSourceLines (
296249109Sjkim    UINT32                  ToLineNumber,
297249109Sjkim    UINT32                  ToLogicalLineNumber,
298249109Sjkim    UINT32                  FileId)
299249109Sjkim{
300249109Sjkim
301249109Sjkim    /* Nothing to do for these file types */
302249109Sjkim
303249109Sjkim    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
304249109Sjkim        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
305249109Sjkim    {
306249109Sjkim        return;
307249109Sjkim    }
308249109Sjkim
309249109Sjkim    Gbl_CurrentLine = ToLogicalLineNumber;
310249109Sjkim
311249109Sjkim    /* Flush any hex bytes remaining from the last opcode */
312249109Sjkim
313249109Sjkim    LsFlushListingBuffer (FileId);
314249109Sjkim
315249109Sjkim    /* Read lines and write them as long as we are not caught up */
316249109Sjkim
317249109Sjkim    if (Gbl_SourceLine < Gbl_CurrentLine)
318249109Sjkim    {
319249109Sjkim        /*
320249109Sjkim         * If we just completed writing some AML hex bytes, output a linefeed
321249109Sjkim         * to add some whitespace for readability.
322249109Sjkim         */
323249109Sjkim        if (Gbl_HexBytesWereWritten)
324249109Sjkim        {
325249109Sjkim            FlPrintFile (FileId, "\n");
326249109Sjkim            Gbl_HexBytesWereWritten = FALSE;
327249109Sjkim        }
328249109Sjkim
329249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
330249109Sjkim        {
331249109Sjkim            FlPrintFile (FileId, "    /*\n");
332249109Sjkim        }
333249109Sjkim
334249109Sjkim        /* Write one line at a time until we have reached the target line # */
335249109Sjkim
336249109Sjkim        while ((Gbl_SourceLine < Gbl_CurrentLine) &&
337249109Sjkim                LsWriteOneSourceLine (FileId))
338249109Sjkim        { ; }
339249109Sjkim
340249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
341249109Sjkim        {
342249109Sjkim            FlPrintFile (FileId, "     */");
343249109Sjkim        }
344249109Sjkim
345249109Sjkim        FlPrintFile (FileId, "\n");
346249109Sjkim    }
347249109Sjkim}
348249109Sjkim
349249109Sjkim
350249109Sjkim/*******************************************************************************
351249109Sjkim *
352249109Sjkim * FUNCTION:    LsWriteOneSourceLine
353249109Sjkim *
354249109Sjkim * PARAMETERS:  FileId          - ID of current listing file
355249109Sjkim *
356249109Sjkim * RETURN:      FALSE on EOF (input source file), TRUE otherwise
357249109Sjkim *
358249109Sjkim * DESCRIPTION: Read one line from the input source file and echo it to the
359249109Sjkim *              listing file, prefixed with the line number, and if the source
360249109Sjkim *              file contains include files, prefixed with the current filename
361249109Sjkim *
362249109Sjkim ******************************************************************************/
363249109Sjkim
364249109SjkimUINT32
365249109SjkimLsWriteOneSourceLine (
366249109Sjkim    UINT32                  FileId)
367249109Sjkim{
368249109Sjkim    UINT8                   FileByte;
369249109Sjkim    UINT32                  Column = 0;
370249109Sjkim    UINT32                  Index = 16;
371249109Sjkim    BOOLEAN                 StartOfLine = FALSE;
372249109Sjkim    BOOLEAN                 ProcessLongLine = FALSE;
373249109Sjkim
374249109Sjkim
375249109Sjkim    Gbl_SourceLine++;
376249109Sjkim    Gbl_ListingNode->LineNumber++;
377249109Sjkim
378249109Sjkim    /* Ignore lines that are completely blank (but count the line above) */
379249109Sjkim
380249109Sjkim    if (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) != AE_OK)
381249109Sjkim    {
382249109Sjkim        return (0);
383249109Sjkim    }
384249109Sjkim    if (FileByte == '\n')
385249109Sjkim    {
386249109Sjkim        return (1);
387249109Sjkim    }
388249109Sjkim
389249109Sjkim    /*
390249109Sjkim     * This is a non-empty line, we will print the entire line with
391249109Sjkim     * the line number and possibly other prefixes and transforms.
392249109Sjkim     */
393249109Sjkim
394249109Sjkim    /* Line prefixes for special files, C and ASM output */
395249109Sjkim
396249109Sjkim    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
397249109Sjkim    {
398249109Sjkim        FlPrintFile (FileId, "     *");
399249109Sjkim    }
400249109Sjkim    if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
401249109Sjkim    {
402249109Sjkim        FlPrintFile (FileId, "; ");
403249109Sjkim    }
404249109Sjkim
405249109Sjkim    if (Gbl_HasIncludeFiles)
406249109Sjkim    {
407249109Sjkim        /*
408249109Sjkim         * This file contains "include" statements, print the current
409249109Sjkim         * filename and line number within the current file
410249109Sjkim         */
411249109Sjkim        FlPrintFile (FileId, "%12s %5d%s",
412249109Sjkim            Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber,
413249109Sjkim            ASL_LISTING_LINE_PREFIX);
414249109Sjkim    }
415249109Sjkim    else
416249109Sjkim    {
417249109Sjkim        /* No include files, just print the line number */
418249109Sjkim
419249109Sjkim        FlPrintFile (FileId, "%8u%s", Gbl_SourceLine,
420249109Sjkim            ASL_LISTING_LINE_PREFIX);
421249109Sjkim    }
422249109Sjkim
423249109Sjkim    /* Read the rest of this line (up to a newline or EOF) */
424249109Sjkim
425249109Sjkim    do
426249109Sjkim    {
427249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
428249109Sjkim        {
429249109Sjkim            if (FileByte == '/')
430249109Sjkim            {
431249109Sjkim                FileByte = '*';
432249109Sjkim            }
433249109Sjkim        }
434249109Sjkim
435249109Sjkim        /* Split long input lines for readability in the listing */
436249109Sjkim
437249109Sjkim        Column++;
438249109Sjkim        if (Column >= 128)
439249109Sjkim        {
440249109Sjkim            if (!ProcessLongLine)
441249109Sjkim            {
442249109Sjkim                if ((FileByte != '}') &&
443249109Sjkim                    (FileByte != '{'))
444249109Sjkim                {
445249109Sjkim                    goto WriteByte;
446249109Sjkim                }
447249109Sjkim
448249109Sjkim                ProcessLongLine = TRUE;
449249109Sjkim            }
450249109Sjkim
451249109Sjkim            if (FileByte == '{')
452249109Sjkim            {
453249109Sjkim                FlPrintFile (FileId, "\n%*s{\n", Index, " ");
454249109Sjkim                StartOfLine = TRUE;
455249109Sjkim                Index += 4;
456249109Sjkim                continue;
457249109Sjkim            }
458249109Sjkim
459249109Sjkim            else if (FileByte == '}')
460249109Sjkim            {
461249109Sjkim                if (!StartOfLine)
462249109Sjkim                {
463249109Sjkim                    FlPrintFile (FileId, "\n");
464249109Sjkim                }
465249109Sjkim
466249109Sjkim                StartOfLine = TRUE;
467249109Sjkim                Index -= 4;
468249109Sjkim                FlPrintFile (FileId, "%*s}\n", Index, " ");
469249109Sjkim                continue;
470249109Sjkim            }
471249109Sjkim
472249109Sjkim            /* Ignore spaces/tabs at the start of line */
473249109Sjkim
474249109Sjkim            else if ((FileByte == ' ') && StartOfLine)
475249109Sjkim            {
476249109Sjkim                continue;
477249109Sjkim            }
478249109Sjkim
479249109Sjkim            else if (StartOfLine)
480249109Sjkim            {
481249109Sjkim                StartOfLine = FALSE;
482249109Sjkim                FlPrintFile (FileId, "%*s", Index, " ");
483249109Sjkim            }
484249109Sjkim
485249109SjkimWriteByte:
486249109Sjkim            FlWriteFile (FileId, &FileByte, 1);
487249109Sjkim            if (FileByte == '\n')
488249109Sjkim            {
489249109Sjkim                /*
490249109Sjkim                 * This line has been completed.
491249109Sjkim                 * Check if an error occurred on this source line during the compile.
492249109Sjkim                 * If so, we print the error message after the source line.
493249109Sjkim                 */
494249109Sjkim                LsCheckException (Gbl_SourceLine, FileId);
495249109Sjkim                return (1);
496249109Sjkim            }
497249109Sjkim        }
498249109Sjkim        else
499249109Sjkim        {
500249109Sjkim            FlWriteFile (FileId, &FileByte, 1);
501249109Sjkim            if (FileByte == '\n')
502249109Sjkim            {
503249109Sjkim                /*
504249109Sjkim                 * This line has been completed.
505249109Sjkim                 * Check if an error occurred on this source line during the compile.
506249109Sjkim                 * If so, we print the error message after the source line.
507249109Sjkim                 */
508249109Sjkim                LsCheckException (Gbl_SourceLine, FileId);
509249109Sjkim                return (1);
510249109Sjkim            }
511249109Sjkim        }
512249109Sjkim
513249109Sjkim    } while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK);
514249109Sjkim
515249109Sjkim    /* EOF on the input file was reached */
516249109Sjkim
517249109Sjkim    return (0);
518249109Sjkim}
519249109Sjkim
520249109Sjkim
521249109Sjkim/*******************************************************************************
522249109Sjkim *
523249109Sjkim * FUNCTION:    LsFlushListingBuffer
524249109Sjkim *
525249109Sjkim * PARAMETERS:  FileId          - ID of the listing file
526249109Sjkim *
527249109Sjkim * RETURN:      None
528249109Sjkim *
529249109Sjkim * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code
530249109Sjkim *              buffer. Usually called at the termination of a single line
531249109Sjkim *              of source code or when the buffer is full.
532249109Sjkim *
533249109Sjkim ******************************************************************************/
534249109Sjkim
535249109Sjkimvoid
536249109SjkimLsFlushListingBuffer (
537249109Sjkim    UINT32                  FileId)
538249109Sjkim{
539249109Sjkim    UINT32                  i;
540249109Sjkim
541249109Sjkim
542249109Sjkim    if (Gbl_CurrentHexColumn == 0)
543249109Sjkim    {
544249109Sjkim        return;
545249109Sjkim    }
546249109Sjkim
547249109Sjkim    /* Write the hex bytes */
548249109Sjkim
549249109Sjkim    switch (FileId)
550249109Sjkim    {
551249109Sjkim    case ASL_FILE_LISTING_OUTPUT:
552249109Sjkim
553249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
554249109Sjkim        {
555249109Sjkim            FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]);
556249109Sjkim        }
557249109Sjkim
558249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++)
559249109Sjkim        {
560249109Sjkim            FlWriteFile (FileId, ".", 1);
561249109Sjkim        }
562249109Sjkim
563249109Sjkim        /* Write the ASCII character associated with each of the bytes */
564249109Sjkim
565249109Sjkim        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
566249109Sjkim        break;
567249109Sjkim
568249109Sjkim
569249109Sjkim    case ASL_FILE_ASM_SOURCE_OUTPUT:
570249109Sjkim
571249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
572249109Sjkim        {
573249109Sjkim            if (i > 0)
574249109Sjkim            {
575249109Sjkim                FlPrintFile (FileId, ",");
576249109Sjkim            }
577249109Sjkim            FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]);
578249109Sjkim        }
579249109Sjkim
580249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
581249109Sjkim        {
582249109Sjkim            FlWriteFile (FileId, " ", 1);
583249109Sjkim        }
584249109Sjkim
585249109Sjkim        FlPrintFile (FileId, "  ;%8.8X",
586249109Sjkim            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
587249109Sjkim
588249109Sjkim        /* Write the ASCII character associated with each of the bytes */
589249109Sjkim
590249109Sjkim        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
591249109Sjkim        break;
592249109Sjkim
593249109Sjkim
594249109Sjkim    case ASL_FILE_C_SOURCE_OUTPUT:
595249109Sjkim
596249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
597249109Sjkim        {
598249109Sjkim            FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]);
599249109Sjkim        }
600249109Sjkim
601249109Sjkim        /* Pad hex output with spaces if line is shorter than max line size */
602249109Sjkim
603249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
604249109Sjkim        {
605249109Sjkim            FlWriteFile (FileId, " ", 1);
606249109Sjkim        }
607249109Sjkim
608249109Sjkim        /* AML offset for the start of the line */
609249109Sjkim
610249109Sjkim        FlPrintFile (FileId, "    /* %8.8X",
611249109Sjkim            Gbl_CurrentAmlOffset - Gbl_CurrentHexColumn);
612249109Sjkim
613249109Sjkim        /* Write the ASCII character associated with each of the bytes */
614249109Sjkim
615249109Sjkim        LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
616249109Sjkim        FlPrintFile (FileId, " */");
617249109Sjkim        break;
618249109Sjkim
619249109Sjkim    default:
620249109Sjkim        /* No other types supported */
621249109Sjkim        return;
622249109Sjkim    }
623249109Sjkim
624249109Sjkim    FlPrintFile (FileId, "\n");
625249109Sjkim
626249109Sjkim    Gbl_CurrentHexColumn = 0;
627249109Sjkim    Gbl_HexBytesWereWritten = TRUE;
628249109Sjkim}
629249109Sjkim
630249109Sjkim
631249109Sjkim/*******************************************************************************
632249109Sjkim *
633249109Sjkim * FUNCTION:    LsPushNode
634249109Sjkim *
635249109Sjkim * PARAMETERS:  Filename        - Pointer to the include filename
636249109Sjkim *
637249109Sjkim * RETURN:      None
638249109Sjkim *
639249109Sjkim * DESCRIPTION: Push a listing node on the listing/include file stack. This
640249109Sjkim *              stack enables tracking of include files (infinitely nested)
641249109Sjkim *              and resumption of the listing of the parent file when the
642249109Sjkim *              include file is finished.
643249109Sjkim *
644249109Sjkim ******************************************************************************/
645249109Sjkim
646249109Sjkimvoid
647249109SjkimLsPushNode (
648249109Sjkim    char                    *Filename)
649249109Sjkim{
650249109Sjkim    ASL_LISTING_NODE        *Lnode;
651249109Sjkim
652249109Sjkim
653249109Sjkim    /* Create a new node */
654249109Sjkim
655249109Sjkim    Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));
656249109Sjkim
657249109Sjkim    /* Initialize */
658249109Sjkim
659249109Sjkim    Lnode->Filename = Filename;
660249109Sjkim    Lnode->LineNumber = 0;
661249109Sjkim
662249109Sjkim    /* Link (push) */
663249109Sjkim
664249109Sjkim    Lnode->Next = Gbl_ListingNode;
665249109Sjkim    Gbl_ListingNode = Lnode;
666249109Sjkim}
667249109Sjkim
668249109Sjkim
669249109Sjkim/*******************************************************************************
670249109Sjkim *
671249109Sjkim * FUNCTION:    LsPopNode
672249109Sjkim *
673249109Sjkim * PARAMETERS:  None
674249109Sjkim *
675249109Sjkim * RETURN:      List head after current head is popped off
676249109Sjkim *
677249109Sjkim * DESCRIPTION: Pop the current head of the list, free it, and return the
678249109Sjkim *              next node on the stack (the new current node).
679249109Sjkim *
680249109Sjkim ******************************************************************************/
681249109Sjkim
682249109SjkimASL_LISTING_NODE *
683249109SjkimLsPopNode (
684249109Sjkim    void)
685249109Sjkim{
686249109Sjkim    ASL_LISTING_NODE        *Lnode;
687249109Sjkim
688249109Sjkim
689249109Sjkim    /* Just grab the node at the head of the list */
690249109Sjkim
691249109Sjkim    Lnode = Gbl_ListingNode;
692249109Sjkim    if ((!Lnode) ||
693249109Sjkim        (!Lnode->Next))
694249109Sjkim    {
695249109Sjkim        AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,
696249109Sjkim            "Could not pop empty listing stack");
697249109Sjkim        return (Gbl_ListingNode);
698249109Sjkim    }
699249109Sjkim
700249109Sjkim    Gbl_ListingNode = Lnode->Next;
701249109Sjkim    ACPI_FREE (Lnode);
702249109Sjkim
703249109Sjkim    /* New "Current" node is the new head */
704249109Sjkim
705249109Sjkim    return (Gbl_ListingNode);
706249109Sjkim}
707