Fixed compatibility of output.
[AROS.git] / arch / all-pc / acpica / source / common / adfile.c
blobdd5abee39849f3f8bc8b949adcf2a88c4798f065
1 /******************************************************************************
3 * Module Name: adfile - Application-level disassembler file support routines
5 *****************************************************************************/
7 /*
8 * Copyright (C) 2000 - 2013, Intel Corp.
9 * All rights reserved.
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.
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.
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.
45 #include "acpi.h"
46 #include "accommon.h"
47 #include "acapps.h"
49 #include <stdio.h>
52 #define _COMPONENT ACPI_TOOLS
53 ACPI_MODULE_NAME ("adfile")
55 /* Local prototypes */
57 static INT32
58 AdWriteBuffer (
59 char *Filename,
60 char *Buffer,
61 UINT32 Length);
63 static char FilenameBuf[20];
66 /******************************************************************************
68 * FUNCTION: AfGenerateFilename
70 * PARAMETERS: Prefix - prefix string
71 * TableId - The table ID
73 * RETURN: Pointer to the completed string
75 * DESCRIPTION: Build an output filename from an ACPI table ID string
77 ******************************************************************************/
79 char *
80 AdGenerateFilename (
81 char *Prefix,
82 char *TableId)
84 UINT32 i;
85 UINT32 j;
88 for (i = 0; Prefix[i]; i++)
90 FilenameBuf[i] = Prefix[i];
93 FilenameBuf[i] = '_';
94 i++;
96 for (j = 0; j < 8 && (TableId[j] != ' ') && (TableId[j] != 0); i++, j++)
98 FilenameBuf[i] = TableId[j];
101 FilenameBuf[i] = 0;
102 strcat (FilenameBuf, ACPI_TABLE_FILE_SUFFIX);
103 return (FilenameBuf);
107 /******************************************************************************
109 * FUNCTION: AfWriteBuffer
111 * PARAMETERS: Filename - name of file
112 * Buffer - data to write
113 * Length - length of data
115 * RETURN: Actual number of bytes written
117 * DESCRIPTION: Open a file and write out a single buffer
119 ******************************************************************************/
121 static INT32
122 AdWriteBuffer (
123 char *Filename,
124 char *Buffer,
125 UINT32 Length)
127 FILE *File;
128 ACPI_SIZE Actual;
131 File = fopen (Filename, "wb");
132 if (!File)
134 printf ("Could not open file %s\n", Filename);
135 return (-1);
138 Actual = fwrite (Buffer, 1, (size_t) Length, File);
139 if (Actual != Length)
141 printf ("Could not write to file %s\n", Filename);
144 fclose (File);
145 return ((INT32) Actual);
149 /******************************************************************************
151 * FUNCTION: AfWriteTable
153 * PARAMETERS: Table - pointer to the ACPI table
154 * Length - length of the table
155 * TableName - the table signature
156 * OemTableID - from the table header
158 * RETURN: None
160 * DESCRIPTION: Dump the loaded tables to a file (or files)
162 ******************************************************************************/
164 void
165 AdWriteTable (
166 ACPI_TABLE_HEADER *Table,
167 UINT32 Length,
168 char *TableName,
169 char *OemTableId)
171 char *Filename;
174 Filename = AdGenerateFilename (TableName, OemTableId);
175 AdWriteBuffer (Filename, (char *) Table, Length);
177 AcpiOsPrintf ("Table [%s] written to \"%s\"\n", TableName, Filename);
181 /*******************************************************************************
183 * FUNCTION: FlGenerateFilename
185 * PARAMETERS: InputFilename - Original ASL source filename
186 * Suffix - New extension.
188 * RETURN: New filename containing the original base + the new suffix
190 * DESCRIPTION: Generate a new filename from the ASL source filename and a new
191 * extension. Used to create the *.LST, *.TXT, etc. files.
193 ******************************************************************************/
195 char *
196 FlGenerateFilename (
197 char *InputFilename,
198 char *Suffix)
200 char *Position;
201 char *NewFilename;
205 * Copy the original filename to a new buffer. Leave room for the worst case
206 * where we append the suffix, an added dot and the null terminator.
208 NewFilename = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE)
209 strlen (InputFilename) + strlen (Suffix) + 2);
210 strcpy (NewFilename, InputFilename);
212 /* Try to find the last dot in the filename */
214 Position = strrchr (NewFilename, '.');
215 if (Position)
217 /* Tack on the new suffix */
219 Position++;
220 *Position = 0;
221 strcat (Position, Suffix);
223 else
225 /* No dot, add one and then the suffix */
227 strcat (NewFilename, ".");
228 strcat (NewFilename, Suffix);
231 return (NewFilename);
235 /*******************************************************************************
237 * FUNCTION: FlStrdup
239 * DESCRIPTION: Local strdup function
241 ******************************************************************************/
243 static char *
244 FlStrdup (
245 char *String)
247 char *NewString;
250 NewString = ACPI_ALLOCATE ((ACPI_SIZE) strlen (String) + 1);
251 if (!NewString)
253 return (NULL);
256 strcpy (NewString, String);
257 return (NewString);
261 /*******************************************************************************
263 * FUNCTION: FlSplitInputPathname
265 * PARAMETERS: InputFilename - The user-specified ASL source file to be
266 * compiled
267 * OutDirectoryPath - Where the directory path prefix is
268 * returned
269 * OutFilename - Where the filename part is returned
271 * RETURN: Status
273 * DESCRIPTION: Split the input path into a directory and filename part
274 * 1) Directory part used to open include files
275 * 2) Filename part used to generate output filenames
277 ******************************************************************************/
279 ACPI_STATUS
280 FlSplitInputPathname (
281 char *InputPath,
282 char **OutDirectoryPath,
283 char **OutFilename)
285 char *Substring;
286 char *DirectoryPath;
287 char *Filename;
290 *OutDirectoryPath = NULL;
292 if (!InputPath)
294 return (AE_OK);
297 /* Get the path to the input filename's directory */
299 DirectoryPath = FlStrdup (InputPath);
300 if (!DirectoryPath)
302 return (AE_NO_MEMORY);
305 /* Convert backslashes to slashes in the entire path */
307 UtConvertBackslashes (DirectoryPath);
309 /* Backup to last slash or colon */
311 Substring = strrchr (DirectoryPath, '/');
312 if (!Substring)
314 Substring = strrchr (DirectoryPath, ':');
317 /* Extract the simple filename */
319 if (!Substring)
321 Filename = FlStrdup (DirectoryPath);
322 DirectoryPath[0] = 0;
324 else
326 Filename = FlStrdup (Substring + 1);
327 *(Substring+1) = 0;
330 if (!Filename)
332 ACPI_FREE (DirectoryPath);
333 return (AE_NO_MEMORY);
336 *OutDirectoryPath = DirectoryPath;
338 if (OutFilename)
340 *OutFilename = Filename;
341 return (AE_OK);
344 ACPI_FREE (Filename);
345 return (AE_OK);