1249109Sjkim/******************************************************************************
2249109Sjkim *
3249109Sjkim * Module Name: asllistsup - Listing file support utilities
4249109Sjkim *
5249109Sjkim *****************************************************************************/
6249109Sjkim
7249109Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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    }
91306536Sjkim
92249109Sjkim    FlPrintFile (FileId, "\"");
93249109Sjkim}
94249109Sjkim
95249109Sjkim
96249109Sjkim/*******************************************************************************
97249109Sjkim *
98249109Sjkim * FUNCTION:    LsDumpAsciiInComment
99249109Sjkim *
100249109Sjkim * PARAMETERS:  FileId          - ID of current listing file
101249109Sjkim *              Count           - Number of bytes to convert
102249109Sjkim *              Buffer          - Buffer of bytes to convert
103249109Sjkim *
104249109Sjkim * RETURN:      None
105249109Sjkim *
106249109Sjkim * DESCRIPTION: Convert hex bytes to ascii
107249109Sjkim *
108249109Sjkim ******************************************************************************/
109249109Sjkim
110249109Sjkimvoid
111249109SjkimLsDumpAsciiInComment (
112249109Sjkim    UINT32                  FileId,
113249109Sjkim    UINT32                  Count,
114249109Sjkim    UINT8                   *Buffer)
115249109Sjkim{
116249109Sjkim    UINT8                   BufChar = 0;
117249109Sjkim    UINT8                   LastChar;
118249109Sjkim    UINT32                  i;
119249109Sjkim
120249109Sjkim
121249109Sjkim    FlPrintFile (FileId, "    \"");
122249109Sjkim    for (i = 0; i < Count; i++)
123249109Sjkim    {
124249109Sjkim        LastChar = BufChar;
125249109Sjkim        BufChar = Buffer[i];
126249109Sjkim
127249109Sjkim        if (isprint (BufChar))
128249109Sjkim        {
129249109Sjkim            /* Handle embedded C comment sequences */
130249109Sjkim
131249109Sjkim            if (((LastChar == '*') && (BufChar == '/')) ||
132249109Sjkim                ((LastChar == '/') && (BufChar == '*')))
133249109Sjkim            {
134249109Sjkim                /* Insert a space to break the sequence */
135249109Sjkim
136249109Sjkim                FlPrintFile (FileId, ".", BufChar);
137249109Sjkim            }
138249109Sjkim
139249109Sjkim            FlPrintFile (FileId, "%c", BufChar);
140249109Sjkim        }
141249109Sjkim        else
142249109Sjkim        {
143249109Sjkim            /* Not a printable character, just put out a dot */
144249109Sjkim
145249109Sjkim            FlPrintFile (FileId, ".");
146249109Sjkim        }
147249109Sjkim    }
148249109Sjkim
149249109Sjkim    FlPrintFile (FileId, "\"");
150249109Sjkim}
151249109Sjkim
152249109Sjkim
153249109Sjkim/*******************************************************************************
154249109Sjkim *
155249109Sjkim * FUNCTION:    LsCheckException
156249109Sjkim *
157249109Sjkim * PARAMETERS:  LineNumber          - Current logical (cumulative) line #
158249109Sjkim *              FileId              - ID of output listing file
159249109Sjkim *
160249109Sjkim * RETURN:      None
161249109Sjkim *
162249109Sjkim * DESCRIPTION: Check if there is an exception for this line, and if there is,
163249109Sjkim *              put it in the listing immediately. Handles multiple errors
164249109Sjkim *              per line. Gbl_NextError points to the next error in the
165249109Sjkim *              sorted (by line #) list of compile errors/warnings.
166249109Sjkim *
167249109Sjkim ******************************************************************************/
168249109Sjkim
169249109Sjkimvoid
170249109SjkimLsCheckException (
171249109Sjkim    UINT32                  LineNumber,
172249109Sjkim    UINT32                  FileId)
173249109Sjkim{
174249109Sjkim
175249109Sjkim    if ((!Gbl_NextError) ||
176249109Sjkim        (LineNumber < Gbl_NextError->LogicalLineNumber ))
177249109Sjkim    {
178249109Sjkim        return;
179249109Sjkim    }
180249109Sjkim
181249109Sjkim    /* Handle multiple errors per line */
182249109Sjkim
183249109Sjkim    if (FileId == ASL_FILE_LISTING_OUTPUT)
184249109Sjkim    {
185249109Sjkim        while (Gbl_NextError &&
186249109Sjkim              (LineNumber >= Gbl_NextError->LogicalLineNumber))
187249109Sjkim        {
188249109Sjkim            AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n");
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:
254250838Sjkim
255249109Sjkim                /* No other types supported */
256250838Sjkim
257249109Sjkim                return;
258249109Sjkim            }
259249109Sjkim        }
260249109Sjkim
261249109Sjkim        /* Transfer AML byte and update counts */
262249109Sjkim
263249109Sjkim        Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i];
264249109Sjkim
265249109Sjkim        Gbl_CurrentHexColumn++;
266249109Sjkim        Gbl_CurrentAmlOffset++;
267249109Sjkim
268249109Sjkim        /* Flush buffer when it is full */
269249109Sjkim
270249109Sjkim        if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)
271249109Sjkim        {
272249109Sjkim            LsFlushListingBuffer (FileId);
273249109Sjkim        }
274249109Sjkim    }
275249109Sjkim}
276249109Sjkim
277249109Sjkim
278249109Sjkim/*******************************************************************************
279249109Sjkim *
280249109Sjkim * FUNCTION:    LsWriteSourceLines
281249109Sjkim *
282249109Sjkim * PARAMETERS:  ToLineNumber            -
283249109Sjkim *              ToLogicalLineNumber     - Write up to this source line number
284249109Sjkim *              FileId                  - ID of current listing file
285249109Sjkim *
286249109Sjkim * RETURN:      None
287249109Sjkim *
288249109Sjkim * DESCRIPTION: Read then write source lines to the listing file until we have
289249109Sjkim *              reached the specified logical (cumulative) line number. This
290249109Sjkim *              automatically echos out comment blocks and other non-AML
291249109Sjkim *              generating text until we get to the actual AML-generating line
292249109Sjkim *              of ASL code specified by the logical line number.
293249109Sjkim *
294249109Sjkim ******************************************************************************/
295249109Sjkim
296249109Sjkimvoid
297249109SjkimLsWriteSourceLines (
298249109Sjkim    UINT32                  ToLineNumber,
299249109Sjkim    UINT32                  ToLogicalLineNumber,
300249109Sjkim    UINT32                  FileId)
301249109Sjkim{
302249109Sjkim
303249109Sjkim    /* Nothing to do for these file types */
304249109Sjkim
305249109Sjkim    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
306249109Sjkim        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
307249109Sjkim    {
308249109Sjkim        return;
309249109Sjkim    }
310249109Sjkim
311249109Sjkim    Gbl_CurrentLine = ToLogicalLineNumber;
312249109Sjkim
313249109Sjkim    /* Flush any hex bytes remaining from the last opcode */
314249109Sjkim
315249109Sjkim    LsFlushListingBuffer (FileId);
316249109Sjkim
317249109Sjkim    /* Read lines and write them as long as we are not caught up */
318249109Sjkim
319249109Sjkim    if (Gbl_SourceLine < Gbl_CurrentLine)
320249109Sjkim    {
321249109Sjkim        /*
322249109Sjkim         * If we just completed writing some AML hex bytes, output a linefeed
323249109Sjkim         * to add some whitespace for readability.
324249109Sjkim         */
325249109Sjkim        if (Gbl_HexBytesWereWritten)
326249109Sjkim        {
327249109Sjkim            FlPrintFile (FileId, "\n");
328249109Sjkim            Gbl_HexBytesWereWritten = FALSE;
329249109Sjkim        }
330249109Sjkim
331249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
332249109Sjkim        {
333249109Sjkim            FlPrintFile (FileId, "    /*\n");
334249109Sjkim        }
335249109Sjkim
336249109Sjkim        /* Write one line at a time until we have reached the target line # */
337249109Sjkim
338249109Sjkim        while ((Gbl_SourceLine < Gbl_CurrentLine) &&
339249109Sjkim                LsWriteOneSourceLine (FileId))
340249109Sjkim        { ; }
341249109Sjkim
342249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
343249109Sjkim        {
344249109Sjkim            FlPrintFile (FileId, "     */");
345249109Sjkim        }
346249109Sjkim
347249109Sjkim        FlPrintFile (FileId, "\n");
348249109Sjkim    }
349249109Sjkim}
350249109Sjkim
351249109Sjkim
352249109Sjkim/*******************************************************************************
353249109Sjkim *
354249109Sjkim * FUNCTION:    LsWriteOneSourceLine
355249109Sjkim *
356249109Sjkim * PARAMETERS:  FileId          - ID of current listing file
357249109Sjkim *
358249109Sjkim * RETURN:      FALSE on EOF (input source file), TRUE otherwise
359249109Sjkim *
360249109Sjkim * DESCRIPTION: Read one line from the input source file and echo it to the
361249109Sjkim *              listing file, prefixed with the line number, and if the source
362249109Sjkim *              file contains include files, prefixed with the current filename
363249109Sjkim *
364249109Sjkim ******************************************************************************/
365249109Sjkim
366249109SjkimUINT32
367249109SjkimLsWriteOneSourceLine (
368249109Sjkim    UINT32                  FileId)
369249109Sjkim{
370249109Sjkim    UINT8                   FileByte;
371249109Sjkim    UINT32                  Column = 0;
372249109Sjkim    UINT32                  Index = 16;
373249109Sjkim    BOOLEAN                 StartOfLine = FALSE;
374249109Sjkim    BOOLEAN                 ProcessLongLine = FALSE;
375249109Sjkim
376249109Sjkim
377249109Sjkim    Gbl_SourceLine++;
378249109Sjkim    Gbl_ListingNode->LineNumber++;
379249109Sjkim
380249109Sjkim    /* Ignore lines that are completely blank (but count the line above) */
381249109Sjkim
382249109Sjkim    if (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) != AE_OK)
383249109Sjkim    {
384249109Sjkim        return (0);
385249109Sjkim    }
386249109Sjkim    if (FileByte == '\n')
387249109Sjkim    {
388249109Sjkim        return (1);
389249109Sjkim    }
390249109Sjkim
391249109Sjkim    /*
392249109Sjkim     * This is a non-empty line, we will print the entire line with
393249109Sjkim     * the line number and possibly other prefixes and transforms.
394249109Sjkim     */
395249109Sjkim
396249109Sjkim    /* Line prefixes for special files, C and ASM output */
397249109Sjkim
398249109Sjkim    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
399249109Sjkim    {
400249109Sjkim        FlPrintFile (FileId, "     *");
401249109Sjkim    }
402249109Sjkim    if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
403249109Sjkim    {
404249109Sjkim        FlPrintFile (FileId, "; ");
405249109Sjkim    }
406249109Sjkim
407249109Sjkim    if (Gbl_HasIncludeFiles)
408249109Sjkim    {
409249109Sjkim        /*
410249109Sjkim         * This file contains "include" statements, print the current
411249109Sjkim         * filename and line number within the current file
412249109Sjkim         */
413249109Sjkim        FlPrintFile (FileId, "%12s %5d%s",
414249109Sjkim            Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber,
415249109Sjkim            ASL_LISTING_LINE_PREFIX);
416249109Sjkim    }
417249109Sjkim    else
418249109Sjkim    {
419249109Sjkim        /* No include files, just print the line number */
420249109Sjkim
421249109Sjkim        FlPrintFile (FileId, "%8u%s", Gbl_SourceLine,
422249109Sjkim            ASL_LISTING_LINE_PREFIX);
423249109Sjkim    }
424249109Sjkim
425249109Sjkim    /* Read the rest of this line (up to a newline or EOF) */
426249109Sjkim
427249109Sjkim    do
428249109Sjkim    {
429249109Sjkim        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
430249109Sjkim        {
431249109Sjkim            if (FileByte == '/')
432249109Sjkim            {
433249109Sjkim                FileByte = '*';
434249109Sjkim            }
435249109Sjkim        }
436249109Sjkim
437249109Sjkim        /* Split long input lines for readability in the listing */
438249109Sjkim
439249109Sjkim        Column++;
440249109Sjkim        if (Column >= 128)
441249109Sjkim        {
442249109Sjkim            if (!ProcessLongLine)
443249109Sjkim            {
444249109Sjkim                if ((FileByte != '}') &&
445249109Sjkim                    (FileByte != '{'))
446249109Sjkim                {
447249109Sjkim                    goto WriteByte;
448249109Sjkim                }
449249109Sjkim
450249109Sjkim                ProcessLongLine = TRUE;
451249109Sjkim            }
452249109Sjkim
453249109Sjkim            if (FileByte == '{')
454249109Sjkim            {
455249109Sjkim                FlPrintFile (FileId, "\n%*s{\n", Index, " ");
456249109Sjkim                StartOfLine = TRUE;
457249109Sjkim                Index += 4;
458249109Sjkim                continue;
459249109Sjkim            }
460249109Sjkim
461249109Sjkim            else if (FileByte == '}')
462249109Sjkim            {
463249109Sjkim                if (!StartOfLine)
464249109Sjkim                {
465249109Sjkim                    FlPrintFile (FileId, "\n");
466249109Sjkim                }
467249109Sjkim
468249109Sjkim                StartOfLine = TRUE;
469249109Sjkim                Index -= 4;
470249109Sjkim                FlPrintFile (FileId, "%*s}\n", Index, " ");
471249109Sjkim                continue;
472249109Sjkim            }
473249109Sjkim
474249109Sjkim            /* Ignore spaces/tabs at the start of line */
475249109Sjkim
476249109Sjkim            else if ((FileByte == ' ') && StartOfLine)
477249109Sjkim            {
478249109Sjkim                continue;
479249109Sjkim            }
480249109Sjkim
481249109Sjkim            else if (StartOfLine)
482249109Sjkim            {
483249109Sjkim                StartOfLine = FALSE;
484249109Sjkim                FlPrintFile (FileId, "%*s", Index, " ");
485249109Sjkim            }
486249109Sjkim
487249109SjkimWriteByte:
488249109Sjkim            FlWriteFile (FileId, &FileByte, 1);
489249109Sjkim            if (FileByte == '\n')
490249109Sjkim            {
491249109Sjkim                /*
492249109Sjkim                 * This line has been completed.
493249109Sjkim                 * Check if an error occurred on this source line during the compile.
494249109Sjkim                 * If so, we print the error message after the source line.
495249109Sjkim                 */
496249109Sjkim                LsCheckException (Gbl_SourceLine, FileId);
497249109Sjkim                return (1);
498249109Sjkim            }
499249109Sjkim        }
500249109Sjkim        else
501249109Sjkim        {
502249109Sjkim            FlWriteFile (FileId, &FileByte, 1);
503249109Sjkim            if (FileByte == '\n')
504249109Sjkim            {
505249109Sjkim                /*
506249109Sjkim                 * This line has been completed.
507249109Sjkim                 * Check if an error occurred on this source line during the compile.
508249109Sjkim                 * If so, we print the error message after the source line.
509249109Sjkim                 */
510249109Sjkim                LsCheckException (Gbl_SourceLine, FileId);
511249109Sjkim                return (1);
512249109Sjkim            }
513249109Sjkim        }
514249109Sjkim
515249109Sjkim    } while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK);
516249109Sjkim
517249109Sjkim    /* EOF on the input file was reached */
518249109Sjkim
519249109Sjkim    return (0);
520249109Sjkim}
521249109Sjkim
522249109Sjkim
523249109Sjkim/*******************************************************************************
524249109Sjkim *
525249109Sjkim * FUNCTION:    LsFlushListingBuffer
526249109Sjkim *
527249109Sjkim * PARAMETERS:  FileId          - ID of the listing file
528249109Sjkim *
529249109Sjkim * RETURN:      None
530249109Sjkim *
531249109Sjkim * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code
532249109Sjkim *              buffer. Usually called at the termination of a single line
533249109Sjkim *              of source code or when the buffer is full.
534249109Sjkim *
535249109Sjkim ******************************************************************************/
536249109Sjkim
537249109Sjkimvoid
538249109SjkimLsFlushListingBuffer (
539249109Sjkim    UINT32                  FileId)
540249109Sjkim{
541249109Sjkim    UINT32                  i;
542249109Sjkim
543249109Sjkim
544249109Sjkim    if (Gbl_CurrentHexColumn == 0)
545249109Sjkim    {
546249109Sjkim        return;
547249109Sjkim    }
548249109Sjkim
549249109Sjkim    /* Write the hex bytes */
550249109Sjkim
551249109Sjkim    switch (FileId)
552249109Sjkim    {
553249109Sjkim    case ASL_FILE_LISTING_OUTPUT:
554249109Sjkim
555249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
556249109Sjkim        {
557249109Sjkim            FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]);
558249109Sjkim        }
559249109Sjkim
560249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++)
561249109Sjkim        {
562249109Sjkim            FlWriteFile (FileId, ".", 1);
563249109Sjkim        }
564249109Sjkim
565249109Sjkim        /* Write the ASCII character associated with each of the bytes */
566249109Sjkim
567249109Sjkim        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
568249109Sjkim        break;
569249109Sjkim
570249109Sjkim
571249109Sjkim    case ASL_FILE_ASM_SOURCE_OUTPUT:
572249109Sjkim
573249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
574249109Sjkim        {
575249109Sjkim            if (i > 0)
576249109Sjkim            {
577249109Sjkim                FlPrintFile (FileId, ",");
578249109Sjkim            }
579306536Sjkim
580249109Sjkim            FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]);
581249109Sjkim        }
582249109Sjkim
583249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
584249109Sjkim        {
585249109Sjkim            FlWriteFile (FileId, " ", 1);
586249109Sjkim        }
587249109Sjkim
588249109Sjkim        FlPrintFile (FileId, "  ;%8.8X",
589249109Sjkim            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
590249109Sjkim
591249109Sjkim        /* Write the ASCII character associated with each of the bytes */
592249109Sjkim
593249109Sjkim        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
594249109Sjkim        break;
595249109Sjkim
596249109Sjkim
597249109Sjkim    case ASL_FILE_C_SOURCE_OUTPUT:
598249109Sjkim
599249109Sjkim        for (i = 0; i < Gbl_CurrentHexColumn; i++)
600249109Sjkim        {
601249109Sjkim            FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]);
602249109Sjkim        }
603249109Sjkim
604249109Sjkim        /* Pad hex output with spaces if line is shorter than max line size */
605249109Sjkim
606249109Sjkim        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
607249109Sjkim        {
608249109Sjkim            FlWriteFile (FileId, " ", 1);
609249109Sjkim        }
610249109Sjkim
611249109Sjkim        /* AML offset for the start of the line */
612249109Sjkim
613249109Sjkim        FlPrintFile (FileId, "    /* %8.8X",
614249109Sjkim            Gbl_CurrentAmlOffset - Gbl_CurrentHexColumn);
615249109Sjkim
616249109Sjkim        /* Write the ASCII character associated with each of the bytes */
617249109Sjkim
618249109Sjkim        LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
619249109Sjkim        FlPrintFile (FileId, " */");
620249109Sjkim        break;
621249109Sjkim
622249109Sjkim    default:
623250838Sjkim
624249109Sjkim        /* No other types supported */
625250838Sjkim
626249109Sjkim        return;
627249109Sjkim    }
628249109Sjkim
629249109Sjkim    FlPrintFile (FileId, "\n");
630249109Sjkim
631249109Sjkim    Gbl_CurrentHexColumn = 0;
632249109Sjkim    Gbl_HexBytesWereWritten = TRUE;
633249109Sjkim}
634249109Sjkim
635249109Sjkim
636249109Sjkim/*******************************************************************************
637249109Sjkim *
638249109Sjkim * FUNCTION:    LsPushNode
639249109Sjkim *
640249109Sjkim * PARAMETERS:  Filename        - Pointer to the include filename
641249109Sjkim *
642249109Sjkim * RETURN:      None
643249109Sjkim *
644249109Sjkim * DESCRIPTION: Push a listing node on the listing/include file stack. This
645249109Sjkim *              stack enables tracking of include files (infinitely nested)
646249109Sjkim *              and resumption of the listing of the parent file when the
647249109Sjkim *              include file is finished.
648249109Sjkim *
649249109Sjkim ******************************************************************************/
650249109Sjkim
651249109Sjkimvoid
652249109SjkimLsPushNode (
653249109Sjkim    char                    *Filename)
654249109Sjkim{
655249109Sjkim    ASL_LISTING_NODE        *Lnode;
656249109Sjkim
657249109Sjkim
658249109Sjkim    /* Create a new node */
659249109Sjkim
660249109Sjkim    Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));
661249109Sjkim
662249109Sjkim    /* Initialize */
663249109Sjkim
664249109Sjkim    Lnode->Filename = Filename;
665249109Sjkim    Lnode->LineNumber = 0;
666249109Sjkim
667249109Sjkim    /* Link (push) */
668249109Sjkim
669249109Sjkim    Lnode->Next = Gbl_ListingNode;
670249109Sjkim    Gbl_ListingNode = Lnode;
671249109Sjkim}
672249109Sjkim
673249109Sjkim
674249109Sjkim/*******************************************************************************
675249109Sjkim *
676249109Sjkim * FUNCTION:    LsPopNode
677249109Sjkim *
678249109Sjkim * PARAMETERS:  None
679249109Sjkim *
680249109Sjkim * RETURN:      List head after current head is popped off
681249109Sjkim *
682249109Sjkim * DESCRIPTION: Pop the current head of the list, free it, and return the
683249109Sjkim *              next node on the stack (the new current node).
684249109Sjkim *
685249109Sjkim ******************************************************************************/
686249109Sjkim
687249109SjkimASL_LISTING_NODE *
688249109SjkimLsPopNode (
689249109Sjkim    void)
690249109Sjkim{
691249109Sjkim    ASL_LISTING_NODE        *Lnode;
692249109Sjkim
693249109Sjkim
694249109Sjkim    /* Just grab the node at the head of the list */
695249109Sjkim
696249109Sjkim    Lnode = Gbl_ListingNode;
697249109Sjkim    if ((!Lnode) ||
698249109Sjkim        (!Lnode->Next))
699249109Sjkim    {
700249109Sjkim        AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,
701249109Sjkim            "Could not pop empty listing stack");
702249109Sjkim        return (Gbl_ListingNode);
703249109Sjkim    }
704249109Sjkim
705249109Sjkim    Gbl_ListingNode = Lnode->Next;
706249109Sjkim    ACPI_FREE (Lnode);
707249109Sjkim
708249109Sjkim    /* New "Current" node is the new head */
709249109Sjkim
710249109Sjkim    return (Gbl_ListingNode);
711249109Sjkim}
712