2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: .inf file parser
4 * FILE: lib/inflib/infhostgen.c
5 * PURPOSE: General .inf routines for use on the host build system
6 * PROGRAMMER: Royce Mitchell III
11 /* INCLUDES *****************************************************************/
21 /* PUBLIC FUNCTIONS *********************************************************/
24 InfHostOpenBufferedFile(PHINF InfHandle
,
26 unsigned long BufferSize
,
27 unsigned long *ErrorLine
)
34 *ErrorLine
= (unsigned long)-1;
36 /* Allocate file buffer */
37 FileBuffer
= MALLOC(BufferSize
+ 1);
38 if (FileBuffer
== NULL
)
40 DPRINT1("MALLOC() failed\n");
41 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
44 MEMCPY(FileBuffer
, Buffer
, BufferSize
);
46 /* Append string terminator */
47 FileBuffer
[BufferSize
] = 0;
49 /* Allocate infcache header */
50 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
53 DPRINT("MALLOC() failed\n");
55 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
58 /* Initialize inicache header */
62 /* Parse the inf buffer */
63 Status
= InfpParseBuffer (Cache
,
65 FileBuffer
+ BufferSize
,
67 if (!INF_SUCCESS(Status
))
73 /* Free file buffer */
76 *InfHandle
= (HINF
)Cache
;
78 return INF_SUCCESS(Status
) ? 0 : -1;
83 InfHostOpenFile(PHINF InfHandle
,
85 unsigned long *ErrorLine
)
89 unsigned long FileLength
;
94 *ErrorLine
= (unsigned long)-1;
96 /* Open the inf file */
97 File
= fopen(FileName
, "rb");
100 DPRINT("fopen() failed (errno %d)\n", errno
);
104 DPRINT("fopen() successful\n");
106 /* Query file size */
107 if (fseek(File
, 0, SEEK_END
))
109 DPRINT("fseek() to EOF failed (errno %d)\n", errno
);
114 FileLength
= ftell(File
);
115 if ((unsigned long) -1 == FileLength
)
117 DPRINT("ftell() failed (errno %d)\n", errno
);
121 DPRINT("File size: %lu\n", FileLength
);
124 if (fseek(File
, 0, SEEK_SET
))
126 DPRINT("fseek() to BOF failed (errno %d)\n", errno
);
131 /* Allocate file buffer */
132 FileBuffer
= MALLOC(FileLength
+ 1);
133 if (FileBuffer
== NULL
)
135 DPRINT1("MALLOC() failed\n");
141 if (FileLength
!= fread(FileBuffer
, 1, FileLength
, File
))
143 DPRINT("fread() failed (errno %d)\n", errno
);
150 /* Append string terminator */
151 FileBuffer
[FileLength
] = 0;
153 /* Allocate infcache header */
154 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
157 DPRINT("MALLOC() failed\n");
162 /* Initialize inicache header */
166 /* Parse the inf buffer */
167 Status
= InfpParseBuffer (Cache
,
169 FileBuffer
+ FileLength
,
171 if (!INF_SUCCESS(Status
))
177 /* Free file buffer */
180 *InfHandle
= (HINF
)Cache
;
182 return INF_SUCCESS(Status
) ? 0 : -1;
187 InfHostCloseFile(HINF InfHandle
)
191 Cache
= (PINFCACHE
)InfHandle
;
198 while (Cache
->FirstSection
!= NULL
)
200 Cache
->FirstSection
= InfpCacheFreeSection(Cache
->FirstSection
);
202 Cache
->LastSection
= NULL
;