Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninfhostgen.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
1.7.6.1
|