xref: /freebsd/sys/contrib/dev/acpica/compiler/dtio.c (revision a88e22b7ad0a8400875be9c3d02d09d0a8010b9c)
1*a88e22b7SJung-uk Kim /******************************************************************************
2*a88e22b7SJung-uk Kim  *
3*a88e22b7SJung-uk Kim  * Module Name: dtio.c - File I/O support for data table compiler
4*a88e22b7SJung-uk Kim  *
5*a88e22b7SJung-uk Kim  *****************************************************************************/
6*a88e22b7SJung-uk Kim 
7*a88e22b7SJung-uk Kim /******************************************************************************
8*a88e22b7SJung-uk Kim  *
9*a88e22b7SJung-uk Kim  * 1. Copyright Notice
10*a88e22b7SJung-uk Kim  *
11*a88e22b7SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12*a88e22b7SJung-uk Kim  * All rights reserved.
13*a88e22b7SJung-uk Kim  *
14*a88e22b7SJung-uk Kim  * 2. License
15*a88e22b7SJung-uk Kim  *
16*a88e22b7SJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17*a88e22b7SJung-uk Kim  * rights.  You may have additional license terms from the party that provided
18*a88e22b7SJung-uk Kim  * you this software, covering your right to use that party's intellectual
19*a88e22b7SJung-uk Kim  * property rights.
20*a88e22b7SJung-uk Kim  *
21*a88e22b7SJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*a88e22b7SJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23*a88e22b7SJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*a88e22b7SJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*a88e22b7SJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26*a88e22b7SJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27*a88e22b7SJung-uk Kim  *
28*a88e22b7SJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*a88e22b7SJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30*a88e22b7SJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*a88e22b7SJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32*a88e22b7SJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33*a88e22b7SJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34*a88e22b7SJung-uk Kim  * to or modifications of the Original Intel Code.  No other license or right
35*a88e22b7SJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36*a88e22b7SJung-uk Kim  *
37*a88e22b7SJung-uk Kim  * The above copyright and patent license is granted only if the following
38*a88e22b7SJung-uk Kim  * conditions are met:
39*a88e22b7SJung-uk Kim  *
40*a88e22b7SJung-uk Kim  * 3. Conditions
41*a88e22b7SJung-uk Kim  *
42*a88e22b7SJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44*a88e22b7SJung-uk Kim  * Code or modification with rights to further distribute source must include
45*a88e22b7SJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46*a88e22b7SJung-uk Kim  * and the following Disclaimer and Export Compliance provision.  In addition,
47*a88e22b7SJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48*a88e22b7SJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49*a88e22b7SJung-uk Kim  * Code and the date of any change.  Licensee must include in that file the
50*a88e22b7SJung-uk Kim  * documentation of any changes made by any predecessor Licensee.  Licensee
51*a88e22b7SJung-uk Kim  * must include a prominent statement that the modification is derived,
52*a88e22b7SJung-uk Kim  * directly or indirectly, from Original Intel Code.
53*a88e22b7SJung-uk Kim  *
54*a88e22b7SJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56*a88e22b7SJung-uk Kim  * Code or modification without rights to further distribute source must
57*a88e22b7SJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58*a88e22b7SJung-uk Kim  * documentation and/or other materials provided with distribution.  In
59*a88e22b7SJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60*a88e22b7SJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61*a88e22b7SJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62*a88e22b7SJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63*a88e22b7SJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64*a88e22b7SJung-uk Kim  * make.
65*a88e22b7SJung-uk Kim  *
66*a88e22b7SJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*a88e22b7SJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68*a88e22b7SJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*a88e22b7SJung-uk Kim  * provision in the documentation and/or other materials provided with the
70*a88e22b7SJung-uk Kim  * distribution.
71*a88e22b7SJung-uk Kim  *
72*a88e22b7SJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73*a88e22b7SJung-uk Kim  * Intel Code.
74*a88e22b7SJung-uk Kim  *
75*a88e22b7SJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*a88e22b7SJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*a88e22b7SJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78*a88e22b7SJung-uk Kim  * without prior written authorization from Intel.
79*a88e22b7SJung-uk Kim  *
80*a88e22b7SJung-uk Kim  * 4. Disclaimer and Export Compliance
81*a88e22b7SJung-uk Kim  *
82*a88e22b7SJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*a88e22b7SJung-uk Kim  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*a88e22b7SJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85*a88e22b7SJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86*a88e22b7SJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87*a88e22b7SJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*a88e22b7SJung-uk Kim  * PARTICULAR PURPOSE.
89*a88e22b7SJung-uk Kim  *
90*a88e22b7SJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*a88e22b7SJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*a88e22b7SJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*a88e22b7SJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*a88e22b7SJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*a88e22b7SJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96*a88e22b7SJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*a88e22b7SJung-uk Kim  * LIMITED REMEDY.
98*a88e22b7SJung-uk Kim  *
99*a88e22b7SJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*a88e22b7SJung-uk Kim  * software or system incorporating such software without first obtaining any
101*a88e22b7SJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102*a88e22b7SJung-uk Kim  * any other agency or department of the United States Government.  In the
103*a88e22b7SJung-uk Kim  * event Licensee exports any such software from the United States or
104*a88e22b7SJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105*a88e22b7SJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106*a88e22b7SJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107*a88e22b7SJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*a88e22b7SJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109*a88e22b7SJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110*a88e22b7SJung-uk Kim  * United States government or any agency thereof requires an export license,
111*a88e22b7SJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112*a88e22b7SJung-uk Kim  * such license, approval or letter.
113*a88e22b7SJung-uk Kim  *
114*a88e22b7SJung-uk Kim  *****************************************************************************/
115*a88e22b7SJung-uk Kim 
116*a88e22b7SJung-uk Kim #define __DTIO_C__
117*a88e22b7SJung-uk Kim 
118*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
119*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
120*a88e22b7SJung-uk Kim 
121*a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
122*a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dtio")
123*a88e22b7SJung-uk Kim 
124*a88e22b7SJung-uk Kim 
125*a88e22b7SJung-uk Kim /* Local prototypes */
126*a88e22b7SJung-uk Kim 
127*a88e22b7SJung-uk Kim static char *
128*a88e22b7SJung-uk Kim DtTrim (
129*a88e22b7SJung-uk Kim     char                    *String);
130*a88e22b7SJung-uk Kim 
131*a88e22b7SJung-uk Kim static void
132*a88e22b7SJung-uk Kim DtLinkField (
133*a88e22b7SJung-uk Kim     DT_FIELD                *Field);
134*a88e22b7SJung-uk Kim 
135*a88e22b7SJung-uk Kim static void
136*a88e22b7SJung-uk Kim DtParseLine (
137*a88e22b7SJung-uk Kim     char                    *LineBuffer,
138*a88e22b7SJung-uk Kim     UINT32                  Line,
139*a88e22b7SJung-uk Kim     UINT32                  Offset);
140*a88e22b7SJung-uk Kim 
141*a88e22b7SJung-uk Kim static UINT32
142*a88e22b7SJung-uk Kim DtGetNextLine (
143*a88e22b7SJung-uk Kim     FILE                    *Handle);
144*a88e22b7SJung-uk Kim 
145*a88e22b7SJung-uk Kim static void
146*a88e22b7SJung-uk Kim DtWriteBinary (
147*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
148*a88e22b7SJung-uk Kim     void                    *Context,
149*a88e22b7SJung-uk Kim     void                    *ReturnValue);
150*a88e22b7SJung-uk Kim 
151*a88e22b7SJung-uk Kim 
152*a88e22b7SJung-uk Kim /* States for DtGetNextLine */
153*a88e22b7SJung-uk Kim 
154*a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT              0
155*a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING      1
156*a88e22b7SJung-uk Kim #define DT_START_COMMENT            2
157*a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT   3
158*a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT      4
159*a88e22b7SJung-uk Kim #define DT_END_COMMENT              5
160*a88e22b7SJung-uk Kim 
161*a88e22b7SJung-uk Kim UINT32  Gbl_NextLineOffset;
162*a88e22b7SJung-uk Kim 
163*a88e22b7SJung-uk Kim 
164*a88e22b7SJung-uk Kim /******************************************************************************
165*a88e22b7SJung-uk Kim  *
166*a88e22b7SJung-uk Kim  * FUNCTION:    DtTrim
167*a88e22b7SJung-uk Kim  *
168*a88e22b7SJung-uk Kim  * PARAMETERS:  String              - Current source code line to trim
169*a88e22b7SJung-uk Kim  *
170*a88e22b7SJung-uk Kim  * RETURN:      Trimmed line. Must be freed by caller.
171*a88e22b7SJung-uk Kim  *
172*a88e22b7SJung-uk Kim  * DESCRIPTION: Trim left and right spaces
173*a88e22b7SJung-uk Kim  *
174*a88e22b7SJung-uk Kim  *****************************************************************************/
175*a88e22b7SJung-uk Kim 
176*a88e22b7SJung-uk Kim static char *
177*a88e22b7SJung-uk Kim DtTrim (
178*a88e22b7SJung-uk Kim     char                    *String)
179*a88e22b7SJung-uk Kim {
180*a88e22b7SJung-uk Kim     char                    *Start;
181*a88e22b7SJung-uk Kim     char                    *End;
182*a88e22b7SJung-uk Kim     char                    *ReturnString;
183*a88e22b7SJung-uk Kim     ACPI_SIZE               Length;
184*a88e22b7SJung-uk Kim 
185*a88e22b7SJung-uk Kim 
186*a88e22b7SJung-uk Kim     /* Skip lines that start with a space */
187*a88e22b7SJung-uk Kim 
188*a88e22b7SJung-uk Kim     if (!ACPI_STRCMP (String, " "))
189*a88e22b7SJung-uk Kim     {
190*a88e22b7SJung-uk Kim         ReturnString = UtLocalCalloc (1);
191*a88e22b7SJung-uk Kim         return (ReturnString);
192*a88e22b7SJung-uk Kim     }
193*a88e22b7SJung-uk Kim 
194*a88e22b7SJung-uk Kim     /* Setup pointers to start and end of input string */
195*a88e22b7SJung-uk Kim 
196*a88e22b7SJung-uk Kim     Start = String;
197*a88e22b7SJung-uk Kim     End = String + ACPI_STRLEN (String) - 1;
198*a88e22b7SJung-uk Kim 
199*a88e22b7SJung-uk Kim     /* Find first non-whitespace character */
200*a88e22b7SJung-uk Kim 
201*a88e22b7SJung-uk Kim     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
202*a88e22b7SJung-uk Kim     {
203*a88e22b7SJung-uk Kim         Start++;
204*a88e22b7SJung-uk Kim     }
205*a88e22b7SJung-uk Kim 
206*a88e22b7SJung-uk Kim     /* Find last non-space character */
207*a88e22b7SJung-uk Kim 
208*a88e22b7SJung-uk Kim     while (End >= Start)
209*a88e22b7SJung-uk Kim     {
210*a88e22b7SJung-uk Kim         if (*End == '\r' || *End == '\n')
211*a88e22b7SJung-uk Kim         {
212*a88e22b7SJung-uk Kim             End--;
213*a88e22b7SJung-uk Kim             continue;
214*a88e22b7SJung-uk Kim         }
215*a88e22b7SJung-uk Kim 
216*a88e22b7SJung-uk Kim         if (*End != ' ')
217*a88e22b7SJung-uk Kim         {
218*a88e22b7SJung-uk Kim             break;
219*a88e22b7SJung-uk Kim         }
220*a88e22b7SJung-uk Kim 
221*a88e22b7SJung-uk Kim         End--;
222*a88e22b7SJung-uk Kim     }
223*a88e22b7SJung-uk Kim 
224*a88e22b7SJung-uk Kim     /* Remove any quotes around the string */
225*a88e22b7SJung-uk Kim 
226*a88e22b7SJung-uk Kim     if (*Start == '\"')
227*a88e22b7SJung-uk Kim     {
228*a88e22b7SJung-uk Kim         Start++;
229*a88e22b7SJung-uk Kim     }
230*a88e22b7SJung-uk Kim     if (*End == '\"')
231*a88e22b7SJung-uk Kim     {
232*a88e22b7SJung-uk Kim         End--;
233*a88e22b7SJung-uk Kim     }
234*a88e22b7SJung-uk Kim 
235*a88e22b7SJung-uk Kim     /* Create the trimmed return string */
236*a88e22b7SJung-uk Kim 
237*a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start) + 1;
238*a88e22b7SJung-uk Kim     ReturnString = UtLocalCalloc (Length + 1);
239*a88e22b7SJung-uk Kim     if (ACPI_STRLEN (Start))
240*a88e22b7SJung-uk Kim     {
241*a88e22b7SJung-uk Kim         ACPI_STRNCPY (ReturnString, Start, Length);
242*a88e22b7SJung-uk Kim     }
243*a88e22b7SJung-uk Kim 
244*a88e22b7SJung-uk Kim     ReturnString[Length] = 0;
245*a88e22b7SJung-uk Kim     return (ReturnString);
246*a88e22b7SJung-uk Kim }
247*a88e22b7SJung-uk Kim 
248*a88e22b7SJung-uk Kim 
249*a88e22b7SJung-uk Kim /******************************************************************************
250*a88e22b7SJung-uk Kim  *
251*a88e22b7SJung-uk Kim  * FUNCTION:    DtLinkField
252*a88e22b7SJung-uk Kim  *
253*a88e22b7SJung-uk Kim  * PARAMETERS:  Field               - New field object to link
254*a88e22b7SJung-uk Kim  *
255*a88e22b7SJung-uk Kim  * RETURN:      None
256*a88e22b7SJung-uk Kim  *
257*a88e22b7SJung-uk Kim  * DESCRIPTION: Link one field name and value to the list
258*a88e22b7SJung-uk Kim  *
259*a88e22b7SJung-uk Kim  *****************************************************************************/
260*a88e22b7SJung-uk Kim 
261*a88e22b7SJung-uk Kim static void
262*a88e22b7SJung-uk Kim DtLinkField (
263*a88e22b7SJung-uk Kim     DT_FIELD                *Field)
264*a88e22b7SJung-uk Kim {
265*a88e22b7SJung-uk Kim     DT_FIELD                *Prev;
266*a88e22b7SJung-uk Kim     DT_FIELD                *Next;
267*a88e22b7SJung-uk Kim 
268*a88e22b7SJung-uk Kim 
269*a88e22b7SJung-uk Kim     Prev = Next = Gbl_FieldList;
270*a88e22b7SJung-uk Kim 
271*a88e22b7SJung-uk Kim     while (Next)
272*a88e22b7SJung-uk Kim     {
273*a88e22b7SJung-uk Kim         Prev = Next;
274*a88e22b7SJung-uk Kim         Next = Next->Next;
275*a88e22b7SJung-uk Kim     }
276*a88e22b7SJung-uk Kim 
277*a88e22b7SJung-uk Kim     if (Prev)
278*a88e22b7SJung-uk Kim     {
279*a88e22b7SJung-uk Kim         Prev->Next = Field;
280*a88e22b7SJung-uk Kim     }
281*a88e22b7SJung-uk Kim     else
282*a88e22b7SJung-uk Kim     {
283*a88e22b7SJung-uk Kim         Gbl_FieldList = Field;
284*a88e22b7SJung-uk Kim     }
285*a88e22b7SJung-uk Kim }
286*a88e22b7SJung-uk Kim 
287*a88e22b7SJung-uk Kim 
288*a88e22b7SJung-uk Kim /******************************************************************************
289*a88e22b7SJung-uk Kim  *
290*a88e22b7SJung-uk Kim  * FUNCTION:    DtParseLine
291*a88e22b7SJung-uk Kim  *
292*a88e22b7SJung-uk Kim  * PARAMETERS:  LineBuffer          - Current source code line
293*a88e22b7SJung-uk Kim  *              Line                - Current line number in the source
294*a88e22b7SJung-uk Kim  *              Offset              - Current byte offset of the line
295*a88e22b7SJung-uk Kim  *
296*a88e22b7SJung-uk Kim  * RETURN:      None
297*a88e22b7SJung-uk Kim  *
298*a88e22b7SJung-uk Kim  * DESCRIPTION: Parse one source line
299*a88e22b7SJung-uk Kim  *
300*a88e22b7SJung-uk Kim  *****************************************************************************/
301*a88e22b7SJung-uk Kim 
302*a88e22b7SJung-uk Kim static void
303*a88e22b7SJung-uk Kim DtParseLine (
304*a88e22b7SJung-uk Kim     char                    *LineBuffer,
305*a88e22b7SJung-uk Kim     UINT32                  Line,
306*a88e22b7SJung-uk Kim     UINT32                  Offset)
307*a88e22b7SJung-uk Kim {
308*a88e22b7SJung-uk Kim     char                    *Start;
309*a88e22b7SJung-uk Kim     char                    *End;
310*a88e22b7SJung-uk Kim     char                    *TmpName;
311*a88e22b7SJung-uk Kim     char                    *TmpValue;
312*a88e22b7SJung-uk Kim     char                    *Name;
313*a88e22b7SJung-uk Kim     char                    *Value;
314*a88e22b7SJung-uk Kim     char                    *Colon;
315*a88e22b7SJung-uk Kim     UINT32                  Length;
316*a88e22b7SJung-uk Kim     DT_FIELD                *Field;
317*a88e22b7SJung-uk Kim     UINT32                  Column;
318*a88e22b7SJung-uk Kim     UINT32                  NameColumn;
319*a88e22b7SJung-uk Kim 
320*a88e22b7SJung-uk Kim 
321*a88e22b7SJung-uk Kim     if (!LineBuffer)
322*a88e22b7SJung-uk Kim     {
323*a88e22b7SJung-uk Kim         return;
324*a88e22b7SJung-uk Kim     }
325*a88e22b7SJung-uk Kim 
326*a88e22b7SJung-uk Kim     Colon = strchr (LineBuffer, ':');
327*a88e22b7SJung-uk Kim     if (!Colon || *(Colon - 1) != ' ')
328*a88e22b7SJung-uk Kim     {
329*a88e22b7SJung-uk Kim         return;
330*a88e22b7SJung-uk Kim     }
331*a88e22b7SJung-uk Kim 
332*a88e22b7SJung-uk Kim     Start = LineBuffer;
333*a88e22b7SJung-uk Kim     End = Colon;
334*a88e22b7SJung-uk Kim 
335*a88e22b7SJung-uk Kim     while (Start < Colon)
336*a88e22b7SJung-uk Kim     {
337*a88e22b7SJung-uk Kim         if (*Start == ' ')
338*a88e22b7SJung-uk Kim         {
339*a88e22b7SJung-uk Kim             Start++;
340*a88e22b7SJung-uk Kim             continue;
341*a88e22b7SJung-uk Kim         }
342*a88e22b7SJung-uk Kim 
343*a88e22b7SJung-uk Kim         /* Found left bracket, go to the right bracket */
344*a88e22b7SJung-uk Kim 
345*a88e22b7SJung-uk Kim         if (*Start == '[')
346*a88e22b7SJung-uk Kim         {
347*a88e22b7SJung-uk Kim             while (Start < Colon && *Start != ']')
348*a88e22b7SJung-uk Kim             {
349*a88e22b7SJung-uk Kim                 Start++;
350*a88e22b7SJung-uk Kim             }
351*a88e22b7SJung-uk Kim 
352*a88e22b7SJung-uk Kim             if (Start == Colon)
353*a88e22b7SJung-uk Kim             {
354*a88e22b7SJung-uk Kim                 MYDEBUG ("ERROR: right bracket reaches colon position\n");
355*a88e22b7SJung-uk Kim                 break;
356*a88e22b7SJung-uk Kim             }
357*a88e22b7SJung-uk Kim 
358*a88e22b7SJung-uk Kim             Start++;
359*a88e22b7SJung-uk Kim             continue;
360*a88e22b7SJung-uk Kim         }
361*a88e22b7SJung-uk Kim 
362*a88e22b7SJung-uk Kim         break;
363*a88e22b7SJung-uk Kim     }
364*a88e22b7SJung-uk Kim 
365*a88e22b7SJung-uk Kim     /*
366*a88e22b7SJung-uk Kim      * There are two column values. One for the field name,
367*a88e22b7SJung-uk Kim      * and one for the field value.
368*a88e22b7SJung-uk Kim      */
369*a88e22b7SJung-uk Kim     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
370*a88e22b7SJung-uk Kim     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
371*a88e22b7SJung-uk Kim 
372*a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
373*a88e22b7SJung-uk Kim 
374*a88e22b7SJung-uk Kim     TmpName = UtLocalCalloc (Length + 1);
375*a88e22b7SJung-uk Kim     ACPI_STRNCPY (TmpName, Start, Length);
376*a88e22b7SJung-uk Kim     Name = DtTrim (TmpName);
377*a88e22b7SJung-uk Kim     ACPI_FREE (TmpName);
378*a88e22b7SJung-uk Kim 
379*a88e22b7SJung-uk Kim     Start = End = (Colon + 1);
380*a88e22b7SJung-uk Kim 
381*a88e22b7SJung-uk Kim     while (*End)
382*a88e22b7SJung-uk Kim     {
383*a88e22b7SJung-uk Kim         /* Found left quotation, go to the right quotation and break */
384*a88e22b7SJung-uk Kim 
385*a88e22b7SJung-uk Kim         if (*End == '"')
386*a88e22b7SJung-uk Kim         {
387*a88e22b7SJung-uk Kim             End++;
388*a88e22b7SJung-uk Kim             while (*End && *End != '"')
389*a88e22b7SJung-uk Kim             {
390*a88e22b7SJung-uk Kim                 End++;
391*a88e22b7SJung-uk Kim             }
392*a88e22b7SJung-uk Kim 
393*a88e22b7SJung-uk Kim             End++;
394*a88e22b7SJung-uk Kim             break;
395*a88e22b7SJung-uk Kim         }
396*a88e22b7SJung-uk Kim 
397*a88e22b7SJung-uk Kim         if (*End == '(' ||
398*a88e22b7SJung-uk Kim             *End == '<' ||
399*a88e22b7SJung-uk Kim             *End == '/')
400*a88e22b7SJung-uk Kim         {
401*a88e22b7SJung-uk Kim             break;
402*a88e22b7SJung-uk Kim         }
403*a88e22b7SJung-uk Kim 
404*a88e22b7SJung-uk Kim         End++;
405*a88e22b7SJung-uk Kim     }
406*a88e22b7SJung-uk Kim 
407*a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
408*a88e22b7SJung-uk Kim     TmpValue = UtLocalCalloc (Length + 1);
409*a88e22b7SJung-uk Kim     ACPI_STRNCPY (TmpValue, Start, Length);
410*a88e22b7SJung-uk Kim     Value = DtTrim (TmpValue);
411*a88e22b7SJung-uk Kim     ACPI_FREE (TmpValue);
412*a88e22b7SJung-uk Kim 
413*a88e22b7SJung-uk Kim     if (Name && Value)
414*a88e22b7SJung-uk Kim     {
415*a88e22b7SJung-uk Kim         Field = UtLocalCalloc (sizeof (DT_FIELD));
416*a88e22b7SJung-uk Kim         Field->Name = Name;
417*a88e22b7SJung-uk Kim         Field->Value = Value;
418*a88e22b7SJung-uk Kim         Field->Line = Line;
419*a88e22b7SJung-uk Kim         Field->ByteOffset = Offset;
420*a88e22b7SJung-uk Kim         Field->NameColumn = NameColumn;
421*a88e22b7SJung-uk Kim         Field->Column = Column;
422*a88e22b7SJung-uk Kim 
423*a88e22b7SJung-uk Kim         DtLinkField (Field);
424*a88e22b7SJung-uk Kim     }
425*a88e22b7SJung-uk Kim }
426*a88e22b7SJung-uk Kim 
427*a88e22b7SJung-uk Kim 
428*a88e22b7SJung-uk Kim /******************************************************************************
429*a88e22b7SJung-uk Kim  *
430*a88e22b7SJung-uk Kim  * FUNCTION:    DtGetNextLine
431*a88e22b7SJung-uk Kim  *
432*a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
433*a88e22b7SJung-uk Kim  *
434*a88e22b7SJung-uk Kim  * RETURN:      Filled line buffer and offset of start-of-line (zero on EOF)
435*a88e22b7SJung-uk Kim  *
436*a88e22b7SJung-uk Kim  * DESCRIPTION: Get the next valid source line. Removes all comments.
437*a88e22b7SJung-uk Kim  *              Ignores empty lines.
438*a88e22b7SJung-uk Kim  *
439*a88e22b7SJung-uk Kim  * Handles both slash-asterisk and slash-slash comments.
440*a88e22b7SJung-uk Kim  * Also, quoted strings, but no escapes within.
441*a88e22b7SJung-uk Kim  *
442*a88e22b7SJung-uk Kim  * Line is returned in Gbl_CurrentLineBuffer.
443*a88e22b7SJung-uk Kim  * Line number in original file is returned in Gbl_CurrentLineNumber.
444*a88e22b7SJung-uk Kim  *
445*a88e22b7SJung-uk Kim  *****************************************************************************/
446*a88e22b7SJung-uk Kim 
447*a88e22b7SJung-uk Kim static UINT32
448*a88e22b7SJung-uk Kim DtGetNextLine (
449*a88e22b7SJung-uk Kim     FILE                    *Handle)
450*a88e22b7SJung-uk Kim {
451*a88e22b7SJung-uk Kim     UINT32                  State = DT_NORMAL_TEXT;
452*a88e22b7SJung-uk Kim     UINT32                  CurrentLineOffset;
453*a88e22b7SJung-uk Kim     UINT32                  i;
454*a88e22b7SJung-uk Kim     char                    c;
455*a88e22b7SJung-uk Kim 
456*a88e22b7SJung-uk Kim 
457*a88e22b7SJung-uk Kim     for (i = 0; i < ASL_LINE_BUFFER_SIZE;)
458*a88e22b7SJung-uk Kim     {
459*a88e22b7SJung-uk Kim         c = (char) getc (Handle);
460*a88e22b7SJung-uk Kim         if (c == EOF)
461*a88e22b7SJung-uk Kim         {
462*a88e22b7SJung-uk Kim             return (0);
463*a88e22b7SJung-uk Kim         }
464*a88e22b7SJung-uk Kim 
465*a88e22b7SJung-uk Kim         switch (State)
466*a88e22b7SJung-uk Kim         {
467*a88e22b7SJung-uk Kim         case DT_NORMAL_TEXT:
468*a88e22b7SJung-uk Kim 
469*a88e22b7SJung-uk Kim             /* Normal text, insert char into line buffer */
470*a88e22b7SJung-uk Kim 
471*a88e22b7SJung-uk Kim             Gbl_CurrentLineBuffer[i] = c;
472*a88e22b7SJung-uk Kim             switch (c)
473*a88e22b7SJung-uk Kim             {
474*a88e22b7SJung-uk Kim             case '/':
475*a88e22b7SJung-uk Kim                 State = DT_START_COMMENT;
476*a88e22b7SJung-uk Kim                 break;
477*a88e22b7SJung-uk Kim 
478*a88e22b7SJung-uk Kim             case '"':
479*a88e22b7SJung-uk Kim                 State = DT_START_QUOTED_STRING;
480*a88e22b7SJung-uk Kim                 i++;
481*a88e22b7SJung-uk Kim                 break;
482*a88e22b7SJung-uk Kim 
483*a88e22b7SJung-uk Kim             case '\n':
484*a88e22b7SJung-uk Kim                 CurrentLineOffset = Gbl_NextLineOffset;
485*a88e22b7SJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
486*a88e22b7SJung-uk Kim                 Gbl_CurrentLineNumber++;
487*a88e22b7SJung-uk Kim 
488*a88e22b7SJung-uk Kim                 /* Exit if line is complete. Ignore blank lines */
489*a88e22b7SJung-uk Kim 
490*a88e22b7SJung-uk Kim                 if (i != 0)
491*a88e22b7SJung-uk Kim                 {
492*a88e22b7SJung-uk Kim                     Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate line */
493*a88e22b7SJung-uk Kim                     return (CurrentLineOffset);
494*a88e22b7SJung-uk Kim                 }
495*a88e22b7SJung-uk Kim                 break;
496*a88e22b7SJung-uk Kim 
497*a88e22b7SJung-uk Kim             default:
498*a88e22b7SJung-uk Kim                 i++;
499*a88e22b7SJung-uk Kim                 break;
500*a88e22b7SJung-uk Kim             }
501*a88e22b7SJung-uk Kim             break;
502*a88e22b7SJung-uk Kim 
503*a88e22b7SJung-uk Kim         case DT_START_QUOTED_STRING:
504*a88e22b7SJung-uk Kim 
505*a88e22b7SJung-uk Kim             /* Insert raw chars until end of quoted string */
506*a88e22b7SJung-uk Kim 
507*a88e22b7SJung-uk Kim             Gbl_CurrentLineBuffer[i] = c;
508*a88e22b7SJung-uk Kim             i++;
509*a88e22b7SJung-uk Kim 
510*a88e22b7SJung-uk Kim             if (c == '"')
511*a88e22b7SJung-uk Kim             {
512*a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
513*a88e22b7SJung-uk Kim             }
514*a88e22b7SJung-uk Kim             break;
515*a88e22b7SJung-uk Kim 
516*a88e22b7SJung-uk Kim         case DT_START_COMMENT:
517*a88e22b7SJung-uk Kim 
518*a88e22b7SJung-uk Kim             /* Open comment if this character is an asterisk or slash */
519*a88e22b7SJung-uk Kim 
520*a88e22b7SJung-uk Kim             switch (c)
521*a88e22b7SJung-uk Kim             {
522*a88e22b7SJung-uk Kim             case '*':
523*a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
524*a88e22b7SJung-uk Kim                 break;
525*a88e22b7SJung-uk Kim 
526*a88e22b7SJung-uk Kim             case '/':
527*a88e22b7SJung-uk Kim                 State = DT_SLASH_SLASH_COMMENT;
528*a88e22b7SJung-uk Kim                 break;
529*a88e22b7SJung-uk Kim 
530*a88e22b7SJung-uk Kim             default:    /* Not a comment */
531*a88e22b7SJung-uk Kim                 i++;    /* Save the preceeding slash */
532*a88e22b7SJung-uk Kim                 Gbl_CurrentLineBuffer[i] = c;
533*a88e22b7SJung-uk Kim                 i++;
534*a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
535*a88e22b7SJung-uk Kim                 break;
536*a88e22b7SJung-uk Kim             }
537*a88e22b7SJung-uk Kim             break;
538*a88e22b7SJung-uk Kim 
539*a88e22b7SJung-uk Kim         case DT_SLASH_ASTERISK_COMMENT:
540*a88e22b7SJung-uk Kim 
541*a88e22b7SJung-uk Kim             /* Ignore chars until an asterisk-slash is found */
542*a88e22b7SJung-uk Kim 
543*a88e22b7SJung-uk Kim             switch (c)
544*a88e22b7SJung-uk Kim             {
545*a88e22b7SJung-uk Kim             case '\n':
546*a88e22b7SJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
547*a88e22b7SJung-uk Kim                 Gbl_CurrentLineNumber++;
548*a88e22b7SJung-uk Kim                 break;
549*a88e22b7SJung-uk Kim 
550*a88e22b7SJung-uk Kim             case '*':
551*a88e22b7SJung-uk Kim                 State = DT_END_COMMENT;
552*a88e22b7SJung-uk Kim                 break;
553*a88e22b7SJung-uk Kim 
554*a88e22b7SJung-uk Kim             default:
555*a88e22b7SJung-uk Kim                 break;
556*a88e22b7SJung-uk Kim             }
557*a88e22b7SJung-uk Kim             break;
558*a88e22b7SJung-uk Kim 
559*a88e22b7SJung-uk Kim         case DT_SLASH_SLASH_COMMENT:
560*a88e22b7SJung-uk Kim 
561*a88e22b7SJung-uk Kim             /* Ignore chars until end-of-line */
562*a88e22b7SJung-uk Kim 
563*a88e22b7SJung-uk Kim             if (c == '\n')
564*a88e22b7SJung-uk Kim             {
565*a88e22b7SJung-uk Kim                 /* We will exit via the NORMAL_TEXT path */
566*a88e22b7SJung-uk Kim 
567*a88e22b7SJung-uk Kim                 ungetc (c, Handle);
568*a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
569*a88e22b7SJung-uk Kim             }
570*a88e22b7SJung-uk Kim             break;
571*a88e22b7SJung-uk Kim 
572*a88e22b7SJung-uk Kim         case DT_END_COMMENT:
573*a88e22b7SJung-uk Kim 
574*a88e22b7SJung-uk Kim             /* End comment if this char is a slash */
575*a88e22b7SJung-uk Kim 
576*a88e22b7SJung-uk Kim             switch (c)
577*a88e22b7SJung-uk Kim             {
578*a88e22b7SJung-uk Kim             case '/':
579*a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
580*a88e22b7SJung-uk Kim                 break;
581*a88e22b7SJung-uk Kim 
582*a88e22b7SJung-uk Kim             default:
583*a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
584*a88e22b7SJung-uk Kim                 break;
585*a88e22b7SJung-uk Kim             }
586*a88e22b7SJung-uk Kim             break;
587*a88e22b7SJung-uk Kim 
588*a88e22b7SJung-uk Kim         default:
589*a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
590*a88e22b7SJung-uk Kim             return (0);
591*a88e22b7SJung-uk Kim         }
592*a88e22b7SJung-uk Kim     }
593*a88e22b7SJung-uk Kim 
594*a88e22b7SJung-uk Kim     printf ("ERROR - Input line is too long (max %u)\n", ASL_LINE_BUFFER_SIZE);
595*a88e22b7SJung-uk Kim     return (0);
596*a88e22b7SJung-uk Kim }
597*a88e22b7SJung-uk Kim 
598*a88e22b7SJung-uk Kim 
599*a88e22b7SJung-uk Kim /******************************************************************************
600*a88e22b7SJung-uk Kim  *
601*a88e22b7SJung-uk Kim  * FUNCTION:    DtScanFile
602*a88e22b7SJung-uk Kim  *
603*a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
604*a88e22b7SJung-uk Kim  *
605*a88e22b7SJung-uk Kim  * RETURN:      Pointer to start of the constructed parse tree.
606*a88e22b7SJung-uk Kim  *
607*a88e22b7SJung-uk Kim  * DESCRIPTION: Scan source file, link all field names and values
608*a88e22b7SJung-uk Kim  *              to the global parse tree: Gbl_FieldList
609*a88e22b7SJung-uk Kim  *
610*a88e22b7SJung-uk Kim  *****************************************************************************/
611*a88e22b7SJung-uk Kim 
612*a88e22b7SJung-uk Kim DT_FIELD *
613*a88e22b7SJung-uk Kim DtScanFile (
614*a88e22b7SJung-uk Kim     FILE                    *Handle)
615*a88e22b7SJung-uk Kim {
616*a88e22b7SJung-uk Kim     UINT32                  Offset;
617*a88e22b7SJung-uk Kim 
618*a88e22b7SJung-uk Kim 
619*a88e22b7SJung-uk Kim     ACPI_FUNCTION_NAME (DtScanFile);
620*a88e22b7SJung-uk Kim 
621*a88e22b7SJung-uk Kim 
622*a88e22b7SJung-uk Kim     /* Get the file size */
623*a88e22b7SJung-uk Kim 
624*a88e22b7SJung-uk Kim     Gbl_InputByteCount = DtGetFileSize (Handle);
625*a88e22b7SJung-uk Kim 
626*a88e22b7SJung-uk Kim     Gbl_CurrentLineNumber = 0;
627*a88e22b7SJung-uk Kim     Gbl_CurrentLineOffset = 0;
628*a88e22b7SJung-uk Kim     Gbl_NextLineOffset = 0;
629*a88e22b7SJung-uk Kim 
630*a88e22b7SJung-uk Kim     /* Scan line-by-line */
631*a88e22b7SJung-uk Kim 
632*a88e22b7SJung-uk Kim     while ((Offset = DtGetNextLine (Handle)))
633*a88e22b7SJung-uk Kim     {
634*a88e22b7SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
635*a88e22b7SJung-uk Kim             Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer));
636*a88e22b7SJung-uk Kim 
637*a88e22b7SJung-uk Kim         DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset);
638*a88e22b7SJung-uk Kim     }
639*a88e22b7SJung-uk Kim 
640*a88e22b7SJung-uk Kim     return (Gbl_FieldList);
641*a88e22b7SJung-uk Kim }
642*a88e22b7SJung-uk Kim 
643*a88e22b7SJung-uk Kim 
644*a88e22b7SJung-uk Kim /*
645*a88e22b7SJung-uk Kim  * Output functions
646*a88e22b7SJung-uk Kim  */
647*a88e22b7SJung-uk Kim 
648*a88e22b7SJung-uk Kim 
649*a88e22b7SJung-uk Kim /******************************************************************************
650*a88e22b7SJung-uk Kim  *
651*a88e22b7SJung-uk Kim  * FUNCTION:    DtWriteBinary
652*a88e22b7SJung-uk Kim  *
653*a88e22b7SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
654*a88e22b7SJung-uk Kim  *
655*a88e22b7SJung-uk Kim  * RETURN:      Status
656*a88e22b7SJung-uk Kim  *
657*a88e22b7SJung-uk Kim  * DESCRIPTION: Write one subtable of a binary ACPI table
658*a88e22b7SJung-uk Kim  *
659*a88e22b7SJung-uk Kim  *****************************************************************************/
660*a88e22b7SJung-uk Kim 
661*a88e22b7SJung-uk Kim static void
662*a88e22b7SJung-uk Kim DtWriteBinary (
663*a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
664*a88e22b7SJung-uk Kim     void                    *Context,
665*a88e22b7SJung-uk Kim     void                    *ReturnValue)
666*a88e22b7SJung-uk Kim {
667*a88e22b7SJung-uk Kim 
668*a88e22b7SJung-uk Kim     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
669*a88e22b7SJung-uk Kim }
670*a88e22b7SJung-uk Kim 
671*a88e22b7SJung-uk Kim 
672*a88e22b7SJung-uk Kim /******************************************************************************
673*a88e22b7SJung-uk Kim  *
674*a88e22b7SJung-uk Kim  * FUNCTION:    DtOutputBinary
675*a88e22b7SJung-uk Kim  *
676*a88e22b7SJung-uk Kim  * PARAMETERS:
677*a88e22b7SJung-uk Kim  *
678*a88e22b7SJung-uk Kim  * RETURN:      Status
679*a88e22b7SJung-uk Kim  *
680*a88e22b7SJung-uk Kim  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
681*a88e22b7SJung-uk Kim  *
682*a88e22b7SJung-uk Kim  *****************************************************************************/
683*a88e22b7SJung-uk Kim 
684*a88e22b7SJung-uk Kim void
685*a88e22b7SJung-uk Kim DtOutputBinary (
686*a88e22b7SJung-uk Kim     DT_SUBTABLE             *RootTable)
687*a88e22b7SJung-uk Kim {
688*a88e22b7SJung-uk Kim 
689*a88e22b7SJung-uk Kim     if (!RootTable)
690*a88e22b7SJung-uk Kim     {
691*a88e22b7SJung-uk Kim         return;
692*a88e22b7SJung-uk Kim     }
693*a88e22b7SJung-uk Kim 
694*a88e22b7SJung-uk Kim     /* Walk the entire parse tree, emitting the binary data */
695*a88e22b7SJung-uk Kim 
696*a88e22b7SJung-uk Kim     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
697*a88e22b7SJung-uk Kim     Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
698*a88e22b7SJung-uk Kim }
699