Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: dtio.c - File I/O support for data table compiler
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116. #define __DTIO_C__
  117.  
  118. #include "aslcompiler.h"
  119. #include "dtcompiler.h"
  120.  
  121. #define _COMPONENT          DT_COMPILER
  122.         ACPI_MODULE_NAME    ("dtio")
  123.  
  124.  
  125. /******************************************************************************
  126.  *
  127.  * FUNCTION:    DtIsComment
  128.  *
  129.  * PARAMETERS:  Line                - Current source code line
  130.  *
  131.  * RETURN:      TRUE if comment, FALSE otherwise
  132.  *
  133.  * DESCRIPTION: Detect a comment in the source module
  134.  *
  135.  *****************************************************************************/
  136.  
  137. /* TBD: Temporary: very simple code to detect comments */
  138.  
  139. static int
  140. DtIsComment(
  141.     char                    *Line)
  142. {
  143.  
  144.     if (!ACPI_STRNCMP (Line, "/*", 2) ||
  145.         !ACPI_STRNCMP (Line, " *", 2))
  146.     {
  147.         return 1;
  148.     }
  149.  
  150.     return 0;
  151. }
  152.  
  153.  
  154. /******************************************************************************
  155.  *
  156.  * FUNCTION:    DtTrim
  157.  *
  158.  * PARAMETERS:  String              - Current source code line to trim
  159.  *
  160.  * RETURN:      Trimmed line. Must be freed by caller.
  161.  *
  162.  * DESCRIPTION: Trim left and right spaces
  163.  *
  164.  *****************************************************************************/
  165.  
  166. static char *
  167. DtTrim (
  168.     char                    *String)
  169. {
  170.     char                    *Start;
  171.     char                    *End;
  172.     char                    *ReturnString;
  173.     ACPI_SIZE               Length;
  174.  
  175.  
  176.     /* Skip lines that start with a space */
  177.  
  178.     if (!ACPI_STRCMP (String, " "))
  179.     {
  180.         ReturnString = UtLocalCalloc (1);
  181.         return (ReturnString);
  182.     }
  183.  
  184.     /* Setup pointers to start and end of input string */
  185.  
  186.     Start = String;
  187.     End = String + ACPI_STRLEN (String) - 1;
  188.  
  189.     /* Find first non-whitespace character */
  190.  
  191.     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
  192.     {
  193.         Start++;
  194.     }
  195.  
  196.     /* Find last non-space character */
  197.  
  198.     while (End >= Start)
  199.     {
  200.         if (*End == '\r' || *End == '\n')
  201.         {
  202.             End--;
  203.             continue;
  204.         }
  205.  
  206.         if (*End != ' ')
  207.         {
  208.             break;
  209.         }
  210.  
  211.         End--;
  212.     }
  213.  
  214.     /* Remove any quotes around the string */
  215.  
  216.     if (*Start == '\"')
  217.     {
  218.         Start++;
  219.     }
  220.     if (*End == '\"')
  221.     {
  222.         End--;
  223.     }
  224.  
  225.     /* Create the trimmed return string */
  226.  
  227.     Length = ACPI_PTR_DIFF (End, Start) + 1;
  228.     ReturnString = UtLocalCalloc (Length + 1);
  229.     if (ACPI_STRLEN (Start))
  230.     {
  231.         ACPI_STRNCPY (ReturnString, Start, Length);
  232.     }
  233.  
  234.     ReturnString[Length] = 0;
  235.     return (ReturnString);
  236. }
  237.  
  238.  
  239. /******************************************************************************
  240.  *
  241.  * FUNCTION:    DtLinkField
  242.  *
  243.  * PARAMETERS:  Field               - New field object to link
  244.  *
  245.  * RETURN:      None
  246.  *
  247.  * DESCRIPTION: Link one field name and value to the list
  248.  *
  249.  *****************************************************************************/
  250.  
  251. static void
  252. DtLinkField (
  253.     DT_FIELD                *Field)
  254. {
  255.     DT_FIELD                *Prev;
  256.     DT_FIELD                *Next;
  257.  
  258.  
  259.     Prev = Next = Gbl_FieldList;
  260.  
  261.     while (Next)
  262.     {
  263.         Prev = Next;
  264.         Next = Next->Next;
  265.     }
  266.  
  267.     if (Prev)
  268.     {
  269.         Prev->Next = Field;
  270.     }
  271.     else
  272.     {
  273.         Gbl_FieldList = Field;
  274.     }
  275. }
  276.  
  277.  
  278. /******************************************************************************
  279.  *
  280.  * FUNCTION:    DtParseLine
  281.  *
  282.  * PARAMETERS:  LineBuffer          - Current source code line
  283.  *              Line                - Current line number in the source
  284.  *              Offset              - Current byte offset of the line
  285.  *
  286.  * RETURN:      None
  287.  *
  288.  * DESCRIPTION: Parse one source line
  289.  *
  290.  *****************************************************************************/
  291.  
  292. static void
  293. DtParseLine (
  294.     char                    *LineBuffer,
  295.     UINT32                  Line,
  296.     UINT32                  Offset)
  297. {
  298.     char                    *Start;
  299.     char                    *End;
  300.     char                    *TmpName;
  301.     char                    *TmpValue;
  302.     char                    *Name;
  303.     char                    *Value;
  304.     char                    *Colon;
  305.     UINT32                  Length;
  306.     DT_FIELD                *Field;
  307.     UINT32                  Column;
  308.     UINT32                  NameColumn;
  309.  
  310.  
  311.     if (!LineBuffer || DtIsComment (LineBuffer))
  312.     {
  313.         return;
  314.     }
  315.  
  316.     Colon = strchr (LineBuffer, ':');
  317.     if (!Colon || *(Colon - 1) != ' ')
  318.     {
  319.         return;
  320.     }
  321.  
  322.     Start = LineBuffer;
  323.     End = Colon;
  324.  
  325.     while (Start < Colon)
  326.     {
  327.         if (*Start == ' ')
  328.         {
  329.             Start++;
  330.             continue;
  331.         }
  332.  
  333.         /* Found left bracket, go to the right bracket */
  334.  
  335.         if (*Start == '[')
  336.         {
  337.             while (Start < Colon && *Start != ']')
  338.             {
  339.                 Start++;
  340.             }
  341.  
  342.             if (Start == Colon)
  343.             {
  344.                 MYDEBUG ("ERROR: right bracket reaches colon position\n");
  345.                 break;
  346.             }
  347.  
  348.             Start++;
  349.             continue;
  350.         }
  351.  
  352.         break;
  353.     }
  354.  
  355.     /*
  356.      * There are two column values. One for the field name,
  357.      * and one for the field value.
  358.      */
  359.     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
  360.     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
  361.  
  362.     Length = ACPI_PTR_DIFF (End, Start);
  363.  
  364.     TmpName = UtLocalCalloc (Length + 1);
  365.     ACPI_STRNCPY (TmpName, Start, Length);
  366.     Name = DtTrim (TmpName);
  367.     ACPI_FREE (TmpName);
  368.  
  369.     Start = End = (Colon + 1);
  370.  
  371.     while (*End)
  372.     {
  373.         /* Found left quotation, go to the right quotation and break */
  374.  
  375.         if (*End == '"')
  376.         {
  377.             End++;
  378.             while (*End && *End != '"')
  379.             {
  380.                 End++;
  381.             }
  382.  
  383.             End++;
  384.             break;
  385.         }
  386.  
  387.         if (*End == '(' ||
  388.             *End == '<' ||
  389.             *End == '/')
  390.         {
  391.             break;
  392.         }
  393.  
  394.         End++;
  395.     }
  396.  
  397.     Length = ACPI_PTR_DIFF (End, Start);
  398.     TmpValue = UtLocalCalloc (Length + 1);
  399.     ACPI_STRNCPY (TmpValue, Start, Length);
  400.     Value = DtTrim (TmpValue);
  401.     ACPI_FREE (TmpValue);
  402.  
  403.     if (Name && Value)
  404.     {
  405.         Field = UtLocalCalloc (sizeof (DT_FIELD));
  406.         Field->Name = Name;
  407.         Field->Value = Value;
  408.         Field->Line = Line;
  409.         Field->ByteOffset = Offset;
  410.         Field->NameColumn = NameColumn;
  411.         Field->Column = Column;
  412.  
  413.         DtLinkField (Field);
  414.     }
  415. }
  416.  
  417.  
  418. /******************************************************************************
  419.  *
  420.  * FUNCTION:    DtScanFile
  421.  *
  422.  * PARAMETERS:  Handle              - Open file handle for the source file
  423.  *
  424.  * RETURN:      Pointer to start of the constructed parse tree.
  425.  *
  426.  * DESCRIPTION: Scan source file, link all field name and value
  427.  *              to the global parse tree: Gbl_FieldList
  428.  *
  429.  *****************************************************************************/
  430.  
  431. DT_FIELD *
  432. DtScanFile (
  433.     FILE                    *Handle)
  434. {
  435.     UINT32                  Line = 0;
  436.     UINT32                  Offset = 0;
  437.  
  438.  
  439.     /* Get the file size */
  440.  
  441.     Gbl_InputByteCount = DtGetFileSize (Handle);
  442.  
  443.     /* Scan line-by-line */
  444.  
  445.     while (fgets (Gbl_CurrentLineBuffer, ASL_LINE_BUFFER_SIZE, Handle))
  446.     {
  447.         Line++;
  448.         Gbl_CurrentLineNumber++;
  449.         DtParseLine (Gbl_CurrentLineBuffer, Line, Offset);
  450.  
  451.         Offset = (UINT32) ftell (Handle);
  452.     }
  453.  
  454.     return (Gbl_FieldList);
  455. }
  456.  
  457.  
  458. /*
  459.  * Output functions
  460.  */
  461.  
  462.  
  463. /******************************************************************************
  464.  *
  465.  * FUNCTION:    DtWriteBinary
  466.  *
  467.  * PARAMETERS:  DT_WALK_CALLBACK
  468.  *
  469.  * RETURN:      Status
  470.  *
  471.  * DESCRIPTION: Write one subtable of a binary ACPI table
  472.  *
  473.  *****************************************************************************/
  474.  
  475. static void
  476. DtWriteBinary (
  477.     DT_SUBTABLE             *Subtable,
  478.     void                    *Context,
  479.     void                    *ReturnValue)
  480. {
  481.  
  482.     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
  483. }
  484.  
  485.  
  486. /******************************************************************************
  487.  *
  488.  * FUNCTION:    DtOutputBinary
  489.  *
  490.  * PARAMETERS:
  491.  *
  492.  * RETURN:      Status
  493.  *
  494.  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
  495.  *
  496.  *****************************************************************************/
  497.  
  498. void
  499. DtOutputBinary (
  500.     DT_SUBTABLE             *RootTable)
  501. {
  502.  
  503.     if (!RootTable)
  504.     {
  505.         return;
  506.     }
  507.  
  508.     /* Walk the entire parse tree, emitting the binary data */
  509.  
  510.     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
  511.     Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
  512. }
  513.