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 57 static INT32 58 AdWriteBuffer ( 59 char *Filename, 60 char *Buffer, 61 UINT32 Length); 62 63 static 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 79 char * 80 AdGenerateFilename ( 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 121 static INT32 122 AdWriteBuffer ( 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 159 void 160 AdWriteTable ( 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 190 char * 191 FlGenerateFilename ( 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 238 static char * 239 FlStrdup ( 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 274 ACPI_STATUS 275 FlSplitInputPathname ( 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