bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] read-file: Avoid memory reallocations with seekable files.


From: Giuseppe Scrivano
Subject: [PATCH] read-file: Avoid memory reallocations with seekable files.
Date: Tue, 03 Aug 2010 15:50:18 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

Hi,

while using the read-file module, I found it can be optimized on
seekable files using the the file length as the initial buffer size; it
avoids some unnecessary reallocations.

Cheers,
Giuseppe



>From 41bc1ff07e437f524cf6cf235b9017aca1ed8a6a Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <address@hidden>
Date: Tue, 3 Aug 2010 15:40:19 +0200
Subject: [PATCH] read-file: Avoid memory reallocations with seekable files.

* lib/read-file.c (fread_file): With seekable files, use the file
length as the initial buffer size.
---
 ChangeLog       |    6 ++++++
 lib/read-file.c |   18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4d24a34..64a6042 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-08-03  Giuseppe Scrivano  <address@hidden>
+
+       read-file: Avoid memory reallocations with seekable files.
+       * lib/read-file.c (fread_file): With seekable files, use the file
+       length as the initial buffer size.
+
 2010-08-01  Bruno Haible  <address@hidden>
 
        Integrate the regex documentation.
diff --git a/lib/read-file.c b/lib/read-file.c
index 6b655db..b0ceb1f 100644
--- a/lib/read-file.c
+++ b/lib/read-file.c
@@ -38,6 +38,24 @@ fread_file (FILE * stream, size_t * length)
   size_t alloc = 0;
   size_t size = 0;
   int save_errno;
+  long pos;
+
+  if ((pos = fseek (stream, 0, SEEK_CUR)) == 0)
+    {
+      long size;
+
+      if (fseek (stream, 0, SEEK_END) < 0)
+        return NULL;
+
+      size = ftell (stream);
+      if (size < 0 || fseek (stream, pos, SEEK_SET) < 0)
+        return NULL;
+
+      alloc = size + 1;
+      buf = malloc (alloc);
+      if (!buf)
+        return NULL;
+    }
 
   for (;;)
     {
-- 
1.7.1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]