(swallow_file_in_memory): Slurp up the whole file at
authorJim Meyering <jim@meyering.net>
Sun, 7 Mar 1999 04:32:25 +0000 (04:32 +0000)
committerJim Meyering <jim@meyering.net>
Sun, 7 Mar 1999 04:32:25 +0000 (04:32 +0000)
once on MSDOS as well, but we have to relax the test for whether
reading it succeeded.

src/ptx.c

index 69105fc11d2a5d6f86df0a9d4f4c65fe2f9a1648..798261c359514bbd0493a8ad022bb0191008c33d 100644 (file)
--- a/src/ptx.c
+++ b/src/ptx.c
@@ -557,25 +557,33 @@ swallow_file_in_memory (const char *file_name, BLOCK *block)
   if (fstat (file_handle, &stat_block) < 0)
     error (EXIT_FAILURE, errno, file_name);
 
-#if !MSDOS
-
-  /* On MSDOS, we cannot predict in memory size from file size, because of
-     end of line conversions.  */
-
   if (S_ISREG (stat_block.st_mode))
     {
+      size_t in_memory_size;
+
       block->start = (char *) xmalloc ((size_t) stat_block.st_size);
 
-      if (read (file_handle, block->start, (size_t) stat_block.st_size)
+      if ((in_memory_size = read (file_handle,
+                                 block->start, (size_t) stat_block.st_size))
          != stat_block.st_size)
-       error (EXIT_FAILURE, errno, file_name);
+       {
+#if MSDOS
+         /* On MSDOS, in memory size may be smaller than the file
+            size, because of end of line conversions.  But it can
+            never be smaller than half the file size, because the
+            minimum is when all lines are empty and terminated by
+            CR+LF.  */
+         if (in_memory_size != (size_t)-1
+             && in_memory_size >= stat_block.st_size / 2)
+           block->start = (char *) xrealloc (block->start, in_memory_size);
+         else
+#endif /* not MSDOS */
 
-      block->end = block->start + stat_block.st_size;
+           error (EXIT_FAILURE, errno, file_name);
+       }
+      block->end = block->start + in_memory_size;
     }
   else
-
-#endif /* not MSDOS */
-
     {
       block->start = (char *) xmalloc ((size_t) 1 << SWALLOW_REALLOC_LOG);
       used_length = 0;