]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
xml_fetch_content_from_file: Read in whole file in one go
authorPedro Alves <palves@redhat.com>
Thu, 19 Oct 2017 14:25:59 +0000 (15:25 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 19 Oct 2017 14:25:59 +0000 (15:25 +0100)
There doesn't seem to be a good reason we're reading the file one
chunk at a time.

gdb/ChangeLog:
2017-10-19  Pedro Alves  <palves@redhat.com>

* xml-support.c (xml_fetch_content_from_file): Don't read in
chunks.  Instead use fseek to determine the file's size, and read
it in one go.

gdb/ChangeLog
gdb/xml-support.c

index bbb0aab41910b55f83c3f8dda2113b5c18780a01..9e7c342cc858a7f630766d84d6a5deee11fcf297 100644 (file)
@@ -1,3 +1,9 @@
+2017-10-19  Pedro Alves  <palves@redhat.com>
+
+       * xml-support.c (xml_fetch_content_from_file): Don't read in
+       chunks.  Instead use fseek to determine the file's size, and read
+       it in one go.
+
 2017-11-18  Keith Seitz  <keiths@redhat.com>
 
        * c-exp.y (oper): Canonicalize conversion operators of user-defined
index 42a4c918d6d80a1b7219da312ec346c55498453d..1f53d7af54c48af9d37da669f21d0186e2a43b67 100644 (file)
@@ -998,7 +998,6 @@ xml_fetch_content_from_file (const char *filename, void *baton)
 {
   const char *dirname = (const char *) baton;
   gdb_file_up file;
-  size_t len, offset;
 
   if (dirname && *dirname)
     {
@@ -1015,34 +1014,25 @@ xml_fetch_content_from_file (const char *filename, void *baton)
   if (file == NULL)
     return NULL;
 
-  /* Read in the whole file, one chunk at a time.  */
-  len = 4096;
-  offset = 0;
-  gdb::unique_xmalloc_ptr<char> text ((char *) xmalloc (len));
-  while (1)
-    {
-      size_t bytes_read;
+  /* Read in the whole file.  */
 
-      /* Continue reading where the last read left off.  Leave at least
-        one byte so that we can NUL-terminate the result.  */
-      bytes_read = fread (text.get () + offset, 1, len - offset - 1,
-                         file.get ());
-      if (ferror (file.get ()))
-       {
-         warning (_("Read error from \"%s\""), filename);
-         return NULL;
-       }
+  size_t len;
 
-      offset += bytes_read;
+  if (fseek (file.get (), 0, SEEK_END) == -1)
+    perror_with_name (_("seek to end of file"));
+  len = ftell (file.get ());
+  rewind (file.get ());
 
-      if (feof (file.get ()))
-       break;
+  gdb::unique_xmalloc_ptr<char> text ((char *) xmalloc (len + 1));
 
-      len = len * 2;
-      text.reset ((char *) xrealloc (text.release (), len));
+  fread (text.get (), 1, len, file.get ());
+  if (ferror (file.get ()))
+    {
+      warning (_("Read error from \"%s\""), filename);
+      return NULL;
     }
 
-  text.get ()[offset] = '\0';
+  text.get ()[len] = '\0';
   return text;
 }