update for HEAD-2003091401
[reactos.git] / subsys / system / usetup / infcache.c
index 8289bd5..0fba4b7 100644 (file)
@@ -442,7 +442,10 @@ inline static int is_eof( struct parser *parser, const CHAR *ptr )
 /* 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'));
 }
 
 
@@ -560,20 +563,24 @@ static const CHAR *line_start_state( struct parser *parser, const CHAR *pos )
     {
       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))
              {
@@ -727,20 +734,23 @@ static const CHAR *eol_backslash_state( struct parser *parser, const CHAR *pos )
     {
       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;
@@ -884,6 +894,75 @@ InfpParseBuffer (PINFCACHE file,
 /* 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)