ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

infhostgen.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:    .inf file parser
00003  * LICENSE:    GPL - See COPYING in the top level directory
00004  * PROGRAMMER: Royce Mitchell III
00005  *             Eric Kohl
00006  *             Ge van Geldorp <gvg@reactos.org>
00007  */
00008 
00009 /* INCLUDES *****************************************************************/
00010 
00011 #include "inflib.h"
00012 #include "infhost.h"
00013 
00014 #define NDEBUG
00015 #include <debug.h>
00016 
00017 /* PUBLIC FUNCTIONS *********************************************************/
00018 
00019 int
00020 InfHostOpenBufferedFile(PHINF InfHandle,
00021                         void *Buffer,
00022                         ULONG BufferSize,
00023                         ULONG *ErrorLine)
00024 {
00025   INFSTATUS Status;
00026   PINFCACHE Cache;
00027   CHAR *FileBuffer;
00028 
00029   *InfHandle = NULL;
00030   *ErrorLine = (ULONG)-1;
00031 
00032   /* Allocate file buffer */
00033   FileBuffer = MALLOC(BufferSize + 1);
00034   if (FileBuffer == NULL)
00035     {
00036       DPRINT1("MALLOC() failed\n");
00037       return(INF_STATUS_INSUFFICIENT_RESOURCES);
00038     }
00039 
00040   MEMCPY(FileBuffer, Buffer, BufferSize);
00041 
00042   /* Append string terminator */
00043   FileBuffer[BufferSize] = 0;
00044 
00045   /* Allocate infcache header */
00046   Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE));
00047   if (Cache == NULL)
00048     {
00049       DPRINT1("MALLOC() failed\n");
00050       FREE(FileBuffer);
00051       return(INF_STATUS_INSUFFICIENT_RESOURCES);
00052     }
00053 
00054   /* Initialize inicache header */
00055   ZEROMEMORY(Cache,
00056              sizeof(INFCACHE));
00057 
00058   /* Parse the inf buffer */
00059   Status = InfpParseBuffer (Cache,
00060                 FileBuffer,
00061                 FileBuffer + BufferSize,
00062                 ErrorLine);
00063   if (!INF_SUCCESS(Status))
00064     {
00065       FREE(Cache);
00066       Cache = NULL;
00067     }
00068 
00069   /* Free file buffer */
00070   FREE(FileBuffer);
00071 
00072   *InfHandle = (HINF)Cache;
00073 
00074   return INF_SUCCESS(Status) ? 0 : -1;
00075 }
00076 
00077 
00078 int
00079 InfHostOpenFile(PHINF InfHandle,
00080                 const CHAR *FileName,
00081                 ULONG *ErrorLine)
00082 {
00083   FILE *File;
00084   CHAR *FileBuffer;
00085   ULONG FileLength;
00086   PINFCACHE Cache;
00087   INFSTATUS Status;
00088 
00089   *InfHandle = NULL;
00090   *ErrorLine = (ULONG)-1;
00091 
00092   /* Open the inf file */
00093   File = fopen(FileName, "rb");
00094   if (NULL == File)
00095     {
00096       DPRINT1("fopen() failed (errno %d)\n", errno);
00097       return -1;
00098     }
00099 
00100   DPRINT("fopen() successful\n");
00101 
00102   /* Query file size */
00103   if (fseek(File, (size_t)0, SEEK_END))
00104     {
00105       DPRINT1("fseek() to EOF failed (errno %d)\n", errno);
00106       fclose(File);
00107       return -1;
00108     }
00109 
00110   FileLength = (ULONG)ftell(File);
00111   if ((ULONG) -1 == FileLength)
00112     {
00113       DPRINT1("ftell() failed (errno %d)\n", errno);
00114       fclose(File);
00115       return -1;
00116     }
00117   DPRINT("File size: %u\n", (UINT)FileLength);
00118 
00119   /* Rewind */
00120   if (fseek(File, (size_t)0, SEEK_SET))
00121     {
00122       DPRINT1("fseek() to BOF failed (errno %d)\n", errno);
00123       fclose(File);
00124       return -1;
00125     }
00126 
00127   /* Allocate file buffer */
00128   FileBuffer = MALLOC(FileLength + 1);
00129   if (FileBuffer == NULL)
00130     {
00131       DPRINT1("MALLOC() failed\n");
00132       fclose(File);
00133       return -1;
00134     }
00135 
00136   /* Read file */
00137   if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File))
00138     {
00139       DPRINT1("fread() failed (errno %d)\n", errno);
00140       FREE(FileBuffer);
00141       fclose(File);
00142       return -1;
00143     }
00144 
00145   fclose(File);
00146 
00147   /* Append string terminator */
00148   FileBuffer[FileLength] = 0;
00149 
00150   /* Allocate infcache header */
00151   Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE));
00152   if (Cache == NULL)
00153     {
00154       DPRINT1("MALLOC() failed\n");
00155       FREE(FileBuffer);
00156       return -1;
00157     }
00158 
00159   /* Initialize inicache header */
00160   ZEROMEMORY(Cache,
00161              sizeof(INFCACHE));
00162 
00163   /* Parse the inf buffer */
00164   Status = InfpParseBuffer (Cache,
00165                 FileBuffer,
00166                 FileBuffer + FileLength,
00167                 ErrorLine);
00168   if (!INF_SUCCESS(Status))
00169     {
00170       FREE(Cache);
00171       Cache = NULL;
00172     }
00173 
00174   /* Free file buffer */
00175   FREE(FileBuffer);
00176 
00177   *InfHandle = (HINF)Cache;
00178 
00179   return INF_SUCCESS(Status) ? 0 : -1;
00180 }
00181 
00182 
00183 void
00184 InfHostCloseFile(HINF InfHandle)
00185 {
00186   PINFCACHE Cache;
00187 
00188   Cache = (PINFCACHE)InfHandle;
00189 
00190   if (Cache == NULL)
00191     {
00192       return;
00193     }
00194 
00195   while (Cache->FirstSection != NULL)
00196     {
00197       Cache->FirstSection = InfpFreeSection(Cache->FirstSection);
00198     }
00199   Cache->LastSection = NULL;
00200 
00201   FREE(Cache);
00202 }
00203 
00204 /* EOF */

Generated on Sat May 26 2012 04:35:14 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.