/* check if the pointer points to an end of line */
inline static int is_eol( struct parser *parser, const CHAR *ptr )
{
- return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == '\r' /*'\n'*/);
+ return (ptr >= parser->end ||
+ *ptr == CONTROL_Z ||
+ *ptr == '\n' ||
+ (*ptr == '\r' && *(ptr + 1) == '\n'));
}
{
switch(*p)
{
-// case '\n':
case '\r':
- p++;
+ continue;
+
+ case '\n':
parser->line_pos++;
close_current_line( parser );
break;
+
case ';':
push_state( parser, LINE_START );
set_state( parser, COMMENT );
return p + 1;
+
case '[':
parser->start = p + 1;
set_state( parser, SECTION_NAME );
return p + 1;
+
default:
if (!isspace(*p))
{
{
switch(*p)
{
-// case '\n':
case '\r':
+ continue;
+
+ case '\n':
parser->line_pos++;
-// parser->start = p + 1;
- parser->start = p + 2;
+ parser->start = p + 1;
set_state( parser, LEADING_SPACES );
-// return p + 1;
- return p + 2;
+ return p + 1;
+
case '\\':
continue;
+
case ';':
push_state( parser, EOL_BACKSLASH );
set_state( parser, COMMENT );
return p + 1;
+
default:
if (isspace(*p))
continue;
/* PUBLIC FUNCTIONS *********************************************************/
NTSTATUS
+InfOpenBufferedFile(PHINF InfHandle,
+ PVOID Buffer,
+ ULONG BufferSize,
+ PULONG ErrorLine)
+{
+ NTSTATUS Status;
+ PINFCACHE Cache;
+ PCHAR FileBuffer;
+
+ *InfHandle = NULL;
+ *ErrorLine = (ULONG)-1;
+
+ /* Allocate file buffer */
+ FileBuffer = RtlAllocateHeap(ProcessHeap,
+ 0,
+ BufferSize + 1);
+ if (FileBuffer == NULL)
+ {
+ DPRINT1("RtlAllocateHeap() failed\n");
+ return(STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlCopyMemory(FileBuffer, Buffer, BufferSize);
+
+ /* Append string terminator */
+ FileBuffer[BufferSize] = 0;
+
+ /* Allocate infcache header */
+ Cache = (PINFCACHE)RtlAllocateHeap(ProcessHeap,
+ 0,
+ sizeof(INFCACHE));
+ if (Cache == NULL)
+ {
+ DPRINT("RtlAllocateHeap() failed\n");
+ RtlFreeHeap(ProcessHeap,
+ 0,
+ FileBuffer);
+ return(STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ /* Initialize inicache header */
+ RtlZeroMemory(Cache,
+ sizeof(INFCACHE));
+
+ /* Parse the inf buffer */
+ Status = InfpParseBuffer (Cache,
+ FileBuffer,
+ FileBuffer + BufferSize,
+ ErrorLine);
+ if (!NT_SUCCESS(Status))
+ {
+ RtlFreeHeap(ProcessHeap,
+ 0,
+ Cache);
+ Cache = NULL;
+ }
+
+ /* Free file buffer */
+ RtlFreeHeap(ProcessHeap,
+ 0,
+ FileBuffer);
+
+ *InfHandle = (HINF)Cache;
+
+ return(Status);
+}
+
+
+NTSTATUS
InfOpenFile(PHINF InfHandle,
PUNICODE_STRING FileName,
PULONG ErrorLine)