1/******************************************************************************
2 *
3 * Module Name: adfile - Application-level disassembler file support routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2011, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45#include <contrib/dev/acpica/include/acpi.h>
46#include <contrib/dev/acpica/include/accommon.h>
47#include <contrib/dev/acpica/include/acapps.h>
48
49#include <stdio.h>
50
51
52#define _COMPONENT          ACPI_TOOLS
53        ACPI_MODULE_NAME    ("adfile")
54
55/* Local prototypes */
56
57static INT32
58AdWriteBuffer (
59    char                    *Filename,
60    char                    *Buffer,
61    UINT32                  Length);
62
63static char                 FilenameBuf[20];
64
65
66/******************************************************************************
67 *
68 * FUNCTION:    AfGenerateFilename
69 *
70 * PARAMETERS:  Prefix              - prefix string
71 *              TableId             - The table ID
72 *
73 * RETURN:      Pointer to the completed string
74 *
75 * DESCRIPTION: Build an output filename from an ACPI table ID string
76 *
77 ******************************************************************************/
78
79char *
80AdGenerateFilename (
81    char                    *Prefix,
82    char                    *TableId)
83{
84    UINT32                  i;
85    UINT32                  j;
86
87
88    for (i = 0; Prefix[i]; i++)
89    {
90        FilenameBuf[i] = Prefix[i];
91    }
92
93    FilenameBuf[i] = '_';
94    i++;
95
96    for (j = 0; j < 8 && (TableId[j] != ' ') && (TableId[j] != 0); i++, j++)
97    {
98        FilenameBuf[i] = TableId[j];
99    }
100
101    FilenameBuf[i] = 0;
102    strcat (FilenameBuf, ACPI_TABLE_FILE_SUFFIX);
103    return FilenameBuf;
104}
105
106
107/******************************************************************************
108 *
109 * FUNCTION:    AfWriteBuffer
110 *
111 * PARAMETERS:  Filename            - name of file
112 *              Buffer              - data to write
113 *              Length              - length of data
114 *
115 * RETURN:      Actual number of bytes written
116 *
117 * DESCRIPTION: Open a file and write out a single buffer
118 *
119 ******************************************************************************/
120
121static INT32
122AdWriteBuffer (
123    char                    *Filename,
124    char                    *Buffer,
125    UINT32                  Length)
126{
127    FILE                    *fp;
128    ACPI_SIZE               Actual;
129
130
131    fp = fopen (Filename, "wb");
132    if (!fp)
133    {
134        printf ("Couldn't open %s\n", Filename);
135        return (-1);
136    }
137
138    Actual = fwrite (Buffer, (size_t) Length, 1, fp);
139    fclose (fp);
140    return ((INT32) Actual);
141}
142
143
144/******************************************************************************
145 *
146 * FUNCTION:    AfWriteTable
147 *
148 * PARAMETERS:  Table               - pointer to the ACPI table
149 *              Length              - length of the table
150 *              TableName           - the table signature
151 *              OemTableID          - from the table header
152 *
153 * RETURN:      None
154 *
155 * DESCRIPTION: Dump the loaded tables to a file (or files)
156 *
157 ******************************************************************************/
158
159void
160AdWriteTable (
161    ACPI_TABLE_HEADER       *Table,
162    UINT32                  Length,
163    char                    *TableName,
164    char                    *OemTableId)
165{
166    char                    *Filename;
167
168
169    Filename = AdGenerateFilename (TableName, OemTableId);
170    AdWriteBuffer (Filename, (char *) Table, Length);
171
172    AcpiOsPrintf ("Table [%s] written to \"%s\"\n", TableName, Filename);
173}
174
175
176/*******************************************************************************
177 *
178 * FUNCTION:    FlGenerateFilename
179 *
180 * PARAMETERS:  InputFilename       - Original ASL source filename
181 *              Suffix              - New extension.
182 *
183 * RETURN:      New filename containing the original base + the new suffix
184 *
185 * DESCRIPTION: Generate a new filename from the ASL source filename and a new
186 *              extension.  Used to create the *.LST, *.TXT, etc. files.
187 *
188 ******************************************************************************/
189
190char *
191FlGenerateFilename (
192    char                    *InputFilename,
193    char                    *Suffix)
194{
195    char                    *Position;
196    char                    *NewFilename;
197
198
199    /*
200     * Copy the original filename to a new buffer. Leave room for the worst case
201     * where we append the suffix, an added dot and the null terminator.
202     */
203    NewFilename = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE)
204        strlen (InputFilename) + strlen (Suffix) + 2);
205    strcpy (NewFilename, InputFilename);
206
207    /* Try to find the last dot in the filename */
208
209    Position = strrchr (NewFilename, '.');
210    if (Position)
211    {
212        /* Tack on the new suffix */
213
214        Position++;
215        *Position = 0;
216        strcat (Position, Suffix);
217    }
218    else
219    {
220        /* No dot, add one and then the suffix */
221
222        strcat (NewFilename, ".");
223        strcat (NewFilename, Suffix);
224    }
225
226    return NewFilename;
227}
228
229
230/*******************************************************************************
231 *
232 * FUNCTION:    FlStrdup
233 *
234 * DESCRIPTION: Local strdup function
235 *
236 ******************************************************************************/
237
238static char *
239FlStrdup (
240    char                *String)
241{
242    char                *NewString;
243
244
245    NewString = ACPI_ALLOCATE ((ACPI_SIZE) strlen (String) + 1);
246    if (!NewString)
247    {
248        return (NULL);
249    }
250
251    strcpy (NewString, String);
252    return (NewString);
253}
254
255
256/*******************************************************************************
257 *
258 * FUNCTION:    FlSplitInputPathname
259 *
260 * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
261 *                                    compiled
262 *              OutDirectoryPath    - Where the directory path prefix is
263 *                                    returned
264 *              OutFilename         - Where the filename part is returned
265 *
266 * RETURN:      Status
267 *
268 * DESCRIPTION: Split the input path into a directory and filename part
269 *              1) Directory part used to open include files
270 *              2) Filename part used to generate output filenames
271 *
272 ******************************************************************************/
273
274ACPI_STATUS
275FlSplitInputPathname (
276    char                    *InputPath,
277    char                    **OutDirectoryPath,
278    char                    **OutFilename)
279{
280    char                    *Substring;
281    char                    *DirectoryPath;
282    char                    *Filename;
283
284
285    *OutDirectoryPath = NULL;
286    *OutFilename = NULL;
287
288    if (!InputPath)
289    {
290        return (AE_OK);
291    }
292
293    /* Get the path to the input filename's directory */
294
295    DirectoryPath = FlStrdup (InputPath);
296    if (!DirectoryPath)
297    {
298        return (AE_NO_MEMORY);
299    }
300
301    Substring = strrchr (DirectoryPath, '\\');
302    if (!Substring)
303    {
304        Substring = strrchr (DirectoryPath, '/');
305        if (!Substring)
306        {
307            Substring = strrchr (DirectoryPath, ':');
308        }
309    }
310
311    if (!Substring)
312    {
313        DirectoryPath[0] = 0;
314        Filename = FlStrdup (InputPath);
315    }
316    else
317    {
318        Filename = FlStrdup (Substring + 1);
319        *(Substring+1) = 0;
320    }
321
322    if (!Filename)
323    {
324        return (AE_NO_MEMORY);
325    }
326
327    *OutDirectoryPath = DirectoryPath;
328    *OutFilename = Filename;
329
330    return (AE_OK);
331}
332
333
334