xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/aslfileio.c (revision 2c7d7e3ca2e4f0b675c6c58e614f6aede66c678e)
1ff4a156dSchristos /******************************************************************************
2ff4a156dSchristos  *
3ff4a156dSchristos  * Module Name: aslfileio - File I/O support
4ff4a156dSchristos  *
5ff4a156dSchristos  *****************************************************************************/
6ff4a156dSchristos 
7ff4a156dSchristos /*
8*2c7d7e3cSchristos  * Copyright (C) 2000 - 2023, Intel Corp.
9ff4a156dSchristos  * All rights reserved.
10ff4a156dSchristos  *
11ff4a156dSchristos  * Redistribution and use in source and binary forms, with or without
12ff4a156dSchristos  * modification, are permitted provided that the following conditions
13ff4a156dSchristos  * are met:
14ff4a156dSchristos  * 1. Redistributions of source code must retain the above copyright
15ff4a156dSchristos  *    notice, this list of conditions, and the following disclaimer,
16ff4a156dSchristos  *    without modification.
17ff4a156dSchristos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18ff4a156dSchristos  *    substantially similar to the "NO WARRANTY" disclaimer below
19ff4a156dSchristos  *    ("Disclaimer") and any redistribution must be conditioned upon
20ff4a156dSchristos  *    including a substantially similar Disclaimer requirement for further
21ff4a156dSchristos  *    binary redistribution.
22ff4a156dSchristos  * 3. Neither the names of the above-listed copyright holders nor the names
23ff4a156dSchristos  *    of any contributors may be used to endorse or promote products derived
24ff4a156dSchristos  *    from this software without specific prior written permission.
25ff4a156dSchristos  *
26ff4a156dSchristos  * Alternatively, this software may be distributed under the terms of the
27ff4a156dSchristos  * GNU General Public License ("GPL") version 2 as published by the Free
28ff4a156dSchristos  * Software Foundation.
29ff4a156dSchristos  *
30ff4a156dSchristos  * NO WARRANTY
31ff4a156dSchristos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32ff4a156dSchristos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3398244dcfSchristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34ff4a156dSchristos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35ff4a156dSchristos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36ff4a156dSchristos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37ff4a156dSchristos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38ff4a156dSchristos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39ff4a156dSchristos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40ff4a156dSchristos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41ff4a156dSchristos  * POSSIBILITY OF SUCH DAMAGES.
42ff4a156dSchristos  */
43ff4a156dSchristos 
44ff4a156dSchristos #include "aslcompiler.h"
45414ef032Schristos #include "acapps.h"
46ff4a156dSchristos 
47ff4a156dSchristos #define _COMPONENT          ACPI_COMPILER
48ff4a156dSchristos         ACPI_MODULE_NAME    ("aslfileio")
49ff4a156dSchristos 
50ff4a156dSchristos 
51ff4a156dSchristos /*******************************************************************************
52ff4a156dSchristos  *
53ff4a156dSchristos  * FUNCTION:    FlFileError
54ff4a156dSchristos  *
55ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
56ff4a156dSchristos  *              ErrorId             - Index into error message array
57ff4a156dSchristos  *
58ff4a156dSchristos  * RETURN:      None
59ff4a156dSchristos  *
60ff4a156dSchristos  * DESCRIPTION: Decode errno to an error message and add the entire error
61ff4a156dSchristos  *              to the error log.
62ff4a156dSchristos  *
63ff4a156dSchristos  ******************************************************************************/
64ff4a156dSchristos 
65ff4a156dSchristos void
FlFileError(UINT32 FileId,UINT8 ErrorId)66ff4a156dSchristos FlFileError (
67ff4a156dSchristos     UINT32                  FileId,
68ff4a156dSchristos     UINT8                   ErrorId)
69ff4a156dSchristos {
70ff4a156dSchristos 
717efa3256Schristos     snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename,
725b948c02Schristos         AslGbl_FileDescs[FileId].Description, strerror (errno));
7381bd9c9cSchristos 
747efa3256Schristos     AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
75ff4a156dSchristos }
76ff4a156dSchristos 
77ff4a156dSchristos 
78ff4a156dSchristos /*******************************************************************************
79ff4a156dSchristos  *
80ff4a156dSchristos  * FUNCTION:    FlOpenFile
81ff4a156dSchristos  *
82ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
83ff4a156dSchristos  *              Filename            - file pathname to open
84ff4a156dSchristos  *              Mode                - Open mode for fopen
85ff4a156dSchristos  *
86ff4a156dSchristos  * RETURN:      None
87ff4a156dSchristos  *
88ff4a156dSchristos  * DESCRIPTION: Open a file.
89ff4a156dSchristos  *              NOTE: Aborts compiler on any error.
90ff4a156dSchristos  *
91ff4a156dSchristos  ******************************************************************************/
92ff4a156dSchristos 
93ff4a156dSchristos void
FlOpenFile(UINT32 FileId,char * Filename,char * Mode)94ff4a156dSchristos FlOpenFile (
95ff4a156dSchristos     UINT32                  FileId,
96ff4a156dSchristos     char                    *Filename,
97ff4a156dSchristos     char                    *Mode)
98ff4a156dSchristos {
99ff4a156dSchristos     FILE                    *File;
100ff4a156dSchristos 
101ff4a156dSchristos 
1027efa3256Schristos     AslGbl_Files[FileId].Filename = Filename;
1037efa3256Schristos     AslGbl_Files[FileId].Handle = NULL;
104cb2bd8f0Schristos 
105ff4a156dSchristos     File = fopen (Filename, Mode);
106ff4a156dSchristos     if (!File)
107ff4a156dSchristos     {
108ff4a156dSchristos         FlFileError (FileId, ASL_MSG_OPEN);
109ff4a156dSchristos         AslAbort ();
110ff4a156dSchristos     }
111ff4a156dSchristos 
1127efa3256Schristos     AslGbl_Files[FileId].Handle = File;
113ff4a156dSchristos }
114ff4a156dSchristos 
115ff4a156dSchristos 
116ff4a156dSchristos /*******************************************************************************
117ff4a156dSchristos  *
118ff4a156dSchristos  * FUNCTION:    FlGetFileSize
119ff4a156dSchristos  *
120ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
121ff4a156dSchristos  *
122ff4a156dSchristos  * RETURN:      File Size
123ff4a156dSchristos  *
124414ef032Schristos  * DESCRIPTION: Get current file size. Uses common seek-to-EOF function.
125414ef032Schristos  *              File must be open. Aborts compiler on error.
126ff4a156dSchristos  *
127ff4a156dSchristos  ******************************************************************************/
128ff4a156dSchristos 
129ff4a156dSchristos UINT32
FlGetFileSize(UINT32 FileId)130ff4a156dSchristos FlGetFileSize (
131ff4a156dSchristos     UINT32                  FileId)
132ff4a156dSchristos {
133ff4a156dSchristos     UINT32                  FileSize;
134ff4a156dSchristos 
135ff4a156dSchristos 
1367efa3256Schristos     FileSize = CmGetFileSize (AslGbl_Files[FileId].Handle);
137414ef032Schristos     if (FileSize == ACPI_UINT32_MAX)
138414ef032Schristos     {
139414ef032Schristos         AslAbort();
140414ef032Schristos     }
141ff4a156dSchristos 
142ff4a156dSchristos     return (FileSize);
143ff4a156dSchristos }
144ff4a156dSchristos 
145ff4a156dSchristos 
146ff4a156dSchristos /*******************************************************************************
147ff4a156dSchristos  *
148ff4a156dSchristos  * FUNCTION:    FlReadFile
149ff4a156dSchristos  *
150ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
151ff4a156dSchristos  *              Buffer              - Where to place the data
152ff4a156dSchristos  *              Length              - Amount to read
153ff4a156dSchristos  *
154ff4a156dSchristos  * RETURN:      Status. AE_ERROR indicates EOF.
155ff4a156dSchristos  *
156ff4a156dSchristos  * DESCRIPTION: Read data from an open file.
157ff4a156dSchristos  *              NOTE: Aborts compiler on any error.
158ff4a156dSchristos  *
159ff4a156dSchristos  ******************************************************************************/
160ff4a156dSchristos 
161ff4a156dSchristos ACPI_STATUS
FlReadFile(UINT32 FileId,void * Buffer,UINT32 Length)162ff4a156dSchristos FlReadFile (
163ff4a156dSchristos     UINT32                  FileId,
164ff4a156dSchristos     void                    *Buffer,
165ff4a156dSchristos     UINT32                  Length)
166ff4a156dSchristos {
167ff4a156dSchristos     UINT32                  Actual;
168ff4a156dSchristos 
169ff4a156dSchristos 
170ff4a156dSchristos     /* Read and check for error */
171ff4a156dSchristos 
1727efa3256Schristos     Actual = fread (Buffer, 1, Length, AslGbl_Files[FileId].Handle);
173ff4a156dSchristos     if (Actual < Length)
174ff4a156dSchristos     {
1757efa3256Schristos         if (feof (AslGbl_Files[FileId].Handle))
176ff4a156dSchristos         {
177ff4a156dSchristos             /* End-of-file, just return error */
178ff4a156dSchristos 
179ff4a156dSchristos             return (AE_ERROR);
180ff4a156dSchristos         }
181ff4a156dSchristos 
182ff4a156dSchristos         FlFileError (FileId, ASL_MSG_READ);
183ff4a156dSchristos         AslAbort ();
184ff4a156dSchristos     }
185ff4a156dSchristos 
186ff4a156dSchristos     return (AE_OK);
187ff4a156dSchristos }
188ff4a156dSchristos 
189ff4a156dSchristos 
190ff4a156dSchristos /*******************************************************************************
191ff4a156dSchristos  *
192ff4a156dSchristos  * FUNCTION:    FlWriteFile
193ff4a156dSchristos  *
194ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
195ff4a156dSchristos  *              Buffer              - Data to write
196ff4a156dSchristos  *              Length              - Amount of data to write
197ff4a156dSchristos  *
198ff4a156dSchristos  * RETURN:      None
199ff4a156dSchristos  *
200ff4a156dSchristos  * DESCRIPTION: Write data to an open file.
201ff4a156dSchristos  *              NOTE: Aborts compiler on any error.
202ff4a156dSchristos  *
203ff4a156dSchristos  ******************************************************************************/
204ff4a156dSchristos 
205ff4a156dSchristos void
FlWriteFile(UINT32 FileId,void * Buffer,UINT32 Length)206ff4a156dSchristos FlWriteFile (
207ff4a156dSchristos     UINT32                  FileId,
208ff4a156dSchristos     void                    *Buffer,
209ff4a156dSchristos     UINT32                  Length)
210ff4a156dSchristos {
211ff4a156dSchristos     UINT32                  Actual;
212ff4a156dSchristos 
213ff4a156dSchristos 
214ff4a156dSchristos     /* Write and check for error */
215ff4a156dSchristos 
2167efa3256Schristos     Actual = fwrite ((char *) Buffer, 1, Length, AslGbl_Files[FileId].Handle);
217ff4a156dSchristos     if (Actual != Length)
218ff4a156dSchristos     {
219ff4a156dSchristos         FlFileError (FileId, ASL_MSG_WRITE);
220ff4a156dSchristos         AslAbort ();
221ff4a156dSchristos     }
2229b9ee194Schristos 
2237efa3256Schristos     if ((FileId == ASL_FILE_PREPROCESSOR) && AslGbl_PreprocessorOutputFlag)
2249b9ee194Schristos     {
2259b9ee194Schristos         /* Duplicate the output to the user preprocessor (.i) file */
2269b9ee194Schristos 
2279b9ee194Schristos         Actual = fwrite ((char *) Buffer, 1, Length,
2287efa3256Schristos             AslGbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle);
2299b9ee194Schristos         if (Actual != Length)
2309b9ee194Schristos         {
2319b9ee194Schristos             FlFileError (FileId, ASL_MSG_WRITE);
2329b9ee194Schristos             AslAbort ();
2339b9ee194Schristos         }
2349b9ee194Schristos     }
235ff4a156dSchristos }
236ff4a156dSchristos 
237ff4a156dSchristos 
238ff4a156dSchristos /*******************************************************************************
239ff4a156dSchristos  *
240ff4a156dSchristos  * FUNCTION:    FlPrintFile
241ff4a156dSchristos  *
242ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
243ff4a156dSchristos  *              Format              - Printf format string
244ff4a156dSchristos  *              ...                 - Printf arguments
245ff4a156dSchristos  *
246ff4a156dSchristos  * RETURN:      None
247ff4a156dSchristos  *
248ff4a156dSchristos  * DESCRIPTION: Formatted write to an open file.
249ff4a156dSchristos  *              NOTE: Aborts compiler on any error.
250ff4a156dSchristos  *
251ff4a156dSchristos  ******************************************************************************/
252ff4a156dSchristos 
253ff4a156dSchristos void
FlPrintFile(UINT32 FileId,char * Format,...)254ff4a156dSchristos FlPrintFile (
255ff4a156dSchristos     UINT32                  FileId,
256ff4a156dSchristos     char                    *Format,
257ff4a156dSchristos     ...)
258ff4a156dSchristos {
259ff4a156dSchristos     INT32                   Actual;
260ff4a156dSchristos     va_list                 Args;
261ff4a156dSchristos 
262ff4a156dSchristos 
263ff4a156dSchristos     va_start (Args, Format);
2647efa3256Schristos     Actual = vfprintf (AslGbl_Files[FileId].Handle, Format, Args);
265ff4a156dSchristos     va_end (Args);
266ff4a156dSchristos 
267ff4a156dSchristos     if (Actual == -1)
268ff4a156dSchristos     {
269ff4a156dSchristos         FlFileError (FileId, ASL_MSG_WRITE);
270ff4a156dSchristos         AslAbort ();
271ff4a156dSchristos     }
2729b9ee194Schristos 
27381bd9c9cSchristos     if ((FileId == ASL_FILE_PREPROCESSOR) &&
2747efa3256Schristos         AslGbl_PreprocessorOutputFlag)
2759b9ee194Schristos     {
2769b9ee194Schristos         /*
2779b9ee194Schristos          * Duplicate the output to the user preprocessor (.i) file,
2789b9ee194Schristos          * except: no #line directives.
2799b9ee194Schristos          */
2809b9ee194Schristos         if (!strncmp (Format, "#line", 5))
2819b9ee194Schristos         {
2829b9ee194Schristos             return;
2839b9ee194Schristos         }
2849b9ee194Schristos 
2859b9ee194Schristos         va_start (Args, Format);
2867efa3256Schristos         Actual = vfprintf (AslGbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle,
2879b9ee194Schristos             Format, Args);
2889b9ee194Schristos         va_end (Args);
2899b9ee194Schristos 
2909b9ee194Schristos         if (Actual == -1)
2919b9ee194Schristos         {
2929b9ee194Schristos             FlFileError (FileId, ASL_MSG_WRITE);
2939b9ee194Schristos             AslAbort ();
2949b9ee194Schristos         }
2959b9ee194Schristos     }
296ff4a156dSchristos }
297ff4a156dSchristos 
298ff4a156dSchristos 
299ff4a156dSchristos /*******************************************************************************
300ff4a156dSchristos  *
301ff4a156dSchristos  * FUNCTION:    FlSeekFile
302ff4a156dSchristos  *
303ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
304ff4a156dSchristos  *              Offset              - Absolute byte offset in file
305ff4a156dSchristos  *
306ff4a156dSchristos  * RETURN:      None
307ff4a156dSchristos  *
308ff4a156dSchristos  * DESCRIPTION: Seek to absolute offset.
309ff4a156dSchristos  *              NOTE: Aborts compiler on any error.
310ff4a156dSchristos  *
311ff4a156dSchristos  ******************************************************************************/
312ff4a156dSchristos 
313ff4a156dSchristos void
FlSeekFile(UINT32 FileId,long Offset)314ff4a156dSchristos FlSeekFile (
315ff4a156dSchristos     UINT32                  FileId,
316ff4a156dSchristos     long                    Offset)
317ff4a156dSchristos {
318ff4a156dSchristos     int                     Error;
319ff4a156dSchristos 
320ff4a156dSchristos 
3217efa3256Schristos     Error = fseek (AslGbl_Files[FileId].Handle, Offset, SEEK_SET);
322ff4a156dSchristos     if (Error)
323ff4a156dSchristos     {
324ff4a156dSchristos         FlFileError (FileId, ASL_MSG_SEEK);
325ff4a156dSchristos         AslAbort ();
326ff4a156dSchristos     }
327ff4a156dSchristos }
328ff4a156dSchristos 
329ff4a156dSchristos 
330ff4a156dSchristos /*******************************************************************************
331ff4a156dSchristos  *
332ff4a156dSchristos  * FUNCTION:    FlCloseFile
333ff4a156dSchristos  *
334ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
335ff4a156dSchristos  *
336ff4a156dSchristos  * RETURN:      None
337ff4a156dSchristos  *
338ff4a156dSchristos  * DESCRIPTION: Close an open file. Aborts compiler on error
339ff4a156dSchristos  *
340ff4a156dSchristos  ******************************************************************************/
341ff4a156dSchristos 
342ff4a156dSchristos void
FlCloseFile(UINT32 FileId)343ff4a156dSchristos FlCloseFile (
344ff4a156dSchristos     UINT32                  FileId)
345ff4a156dSchristos {
346ff4a156dSchristos     int                     Error;
347ff4a156dSchristos 
348ff4a156dSchristos 
3497efa3256Schristos     if (!AslGbl_Files[FileId].Handle)
350ff4a156dSchristos     {
351ff4a156dSchristos         return;
352ff4a156dSchristos     }
353ff4a156dSchristos 
3547efa3256Schristos     Error = fclose (AslGbl_Files[FileId].Handle);
355ff4a156dSchristos     if (Error)
356ff4a156dSchristos     {
357ff4a156dSchristos         FlFileError (FileId, ASL_MSG_CLOSE);
358ff4a156dSchristos         AslAbort ();
359ff4a156dSchristos     }
360ff4a156dSchristos 
361414ef032Schristos     /* Do not clear/free the filename string */
362414ef032Schristos 
3637efa3256Schristos     AslGbl_Files[FileId].Handle = NULL;
364ff4a156dSchristos     return;
365ff4a156dSchristos }
366ff4a156dSchristos 
367ff4a156dSchristos 
368ff4a156dSchristos /*******************************************************************************
369ff4a156dSchristos  *
370ff4a156dSchristos  * FUNCTION:    FlDeleteFile
371ff4a156dSchristos  *
372ff4a156dSchristos  * PARAMETERS:  FileId              - Index into file info array
373ff4a156dSchristos  *
374ff4a156dSchristos  * RETURN:      None
375ff4a156dSchristos  *
376ff4a156dSchristos  * DESCRIPTION: Delete a file.
377ff4a156dSchristos  *
378ff4a156dSchristos  ******************************************************************************/
379ff4a156dSchristos 
380ff4a156dSchristos void
FlDeleteFile(UINT32 FileId)381ff4a156dSchristos FlDeleteFile (
382ff4a156dSchristos     UINT32                  FileId)
383ff4a156dSchristos {
3847efa3256Schristos     ASL_FILE_INFO           *Info = &AslGbl_Files[FileId];
385ff4a156dSchristos 
386ff4a156dSchristos 
387ff4a156dSchristos     if (!Info->Filename)
388ff4a156dSchristos     {
389ff4a156dSchristos         return;
390ff4a156dSchristos     }
391ff4a156dSchristos 
392ff4a156dSchristos     if (remove (Info->Filename))
393ff4a156dSchristos     {
394ff4a156dSchristos         printf ("%s (%s file) ",
3955b948c02Schristos             Info->Filename, AslGbl_FileDescs[FileId].Description);
396ff4a156dSchristos         perror ("Could not delete");
397ff4a156dSchristos     }
398ff4a156dSchristos 
399ff4a156dSchristos     Info->Filename = NULL;
400ff4a156dSchristos     return;
401ff4a156dSchristos }
402