Deleted Added
full compact
adfile.c (229989) adfile.c (235945)
1/******************************************************************************
2 *
3 * Module Name: adfile - Application-level disassembler file support routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2012, 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
1/******************************************************************************
2 *
3 * Module Name: adfile - Application-level disassembler file support routines
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2012, 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, '\\');
301 /* Convert backslashes to slashes in the entire path */
302
303 UtConvertBackslashes (DirectoryPath);
304
305 /* Backup to last slash or colon */
306
307 Substring = strrchr (DirectoryPath, '/');
302 if (!Substring)
303 {
308 if (!Substring)
309 {
304 Substring = strrchr (DirectoryPath, '/');
305 if (!Substring)
306 {
307 Substring = strrchr (DirectoryPath, ':');
308 }
310 Substring = strrchr (DirectoryPath, ':');
309 }
310
311 }
312
313 /* Extract the simple filename */
314
311 if (!Substring)
312 {
315 if (!Substring)
316 {
317 Filename = FlStrdup (DirectoryPath);
313 DirectoryPath[0] = 0;
318 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;
319 }
320 else
321 {
322 Filename = FlStrdup (Substring + 1);
323 *(Substring+1) = 0;
324 }
325
326 if (!Filename)
327 {
328 return (AE_NO_MEMORY);
329 }
330
331 *OutDirectoryPath = DirectoryPath;
332 *OutFilename = Filename;
329
330 return (AE_OK);
331}
332
333
333 return (AE_OK);
334}
335
336