2 * PROJECT: .inf file parser
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PROGRAMMER: Royce Mitchell III
6 * Ge van Geldorp <gvg@reactos.org>
9 /* INCLUDES *****************************************************************/
17 /* PUBLIC FUNCTIONS *********************************************************/
20 InfHostOpenBufferedFile(PHINF InfHandle
,
30 *ErrorLine
= (ULONG
)-1;
32 /* Allocate file buffer */
33 FileBuffer
= MALLOC(BufferSize
+ 1);
34 if (FileBuffer
== NULL
)
36 DPRINT1("MALLOC() failed\n");
37 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
40 MEMCPY(FileBuffer
, Buffer
, BufferSize
);
42 /* Append string terminator */
43 FileBuffer
[BufferSize
] = 0;
45 /* Allocate infcache header */
46 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
49 DPRINT1("MALLOC() failed\n");
51 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
54 /* Initialize inicache header */
58 /* Parse the inf buffer */
59 Status
= InfpParseBuffer (Cache
,
61 FileBuffer
+ BufferSize
,
63 if (!INF_SUCCESS(Status
))
69 /* Free file buffer */
72 *InfHandle
= (HINF
)Cache
;
74 return INF_SUCCESS(Status
) ? 0 : -1;
79 InfHostOpenFile(PHINF InfHandle
,
90 *ErrorLine
= (ULONG
)-1;
92 /* Open the inf file */
93 File
= fopen(FileName
, "rb");
96 DPRINT1("fopen() failed (errno %d)\n", errno
);
100 DPRINT("fopen() successful\n");
102 /* Query file size */
103 if (fseek(File
, (size_t)0, SEEK_END
))
105 DPRINT1("fseek() to EOF failed (errno %d)\n", errno
);
110 FileLength
= ftell(File
);
111 if ((ULONG
) -1 == FileLength
)
113 DPRINT1("ftell() failed (errno %d)\n", errno
);
117 DPRINT("File size: %u\n", (UINT
)FileLength
);
120 if (fseek(File
, (size_t)0, SEEK_SET
))
122 DPRINT1("fseek() to BOF failed (errno %d)\n", errno
);
127 /* Allocate file buffer */
128 FileBuffer
= MALLOC(FileLength
+ 1);
129 if (FileBuffer
== NULL
)
131 DPRINT1("MALLOC() failed\n");
137 if (FileLength
!= fread(FileBuffer
, (size_t)1, (size_t)FileLength
, File
))
139 DPRINT1("fread() failed (errno %d)\n", errno
);
146 /* Append string terminator */
147 FileBuffer
[FileLength
] = 0;
149 /* Allocate infcache header */
150 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
153 DPRINT1("MALLOC() failed\n");
158 /* Initialize inicache header */
162 /* Parse the inf buffer */
163 Status
= InfpParseBuffer (Cache
,
165 FileBuffer
+ FileLength
,
167 if (!INF_SUCCESS(Status
))
173 /* Free file buffer */
176 *InfHandle
= (HINF
)Cache
;
178 return INF_SUCCESS(Status
) ? 0 : -1;
183 InfHostCloseFile(HINF InfHandle
)
187 Cache
= (PINFCACHE
)InfHandle
;
194 while (Cache
->FirstSection
!= NULL
)
196 Cache
->FirstSection
= InfpFreeSection(Cache
->FirstSection
);
198 Cache
->LastSection
= NULL
;