GraphicsMagick: ReadBlobString(): Use fgets() in order to get mu...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.11080.1667154185.1350.graphicsmagick-commit@lists.sourceforge.net>
changeset 7b165ce82542 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=7b165ce82542
summary: ReadBlobString(): Use fgets() in order to get much better performance.

diffstat:

 ChangeLog                              |    5 +
 VisualMagick/installer/inc/version.isx |    4 +-
 magick/blob.c                          |  120 +++++++++++++++++++++++++++++---
 magick/version.h                       |    4 +-
 www/Changelog.html                     |    7 +
 5 files changed, 122 insertions(+), 18 deletions(-)

diffs (192 lines):

diff -r c5a31f5a35ec -r 7b165ce82542 ChangeLog
--- a/ChangeLog	Sat Oct 29 17:41:33 2022 -0500
+++ b/ChangeLog	Sun Oct 30 13:22:52 2022 -0500
@@ -1,3 +1,8 @@
+2022-10-30  Bob Friesenhahn  <[email protected]>
+
+	* magick/blob.c (ReadBlobString): Use fgets() in order to get much
+	better performance.
+
 2022-10-29  Bob Friesenhahn  <[email protected]>
 
 	* coders/xpm.c (ReadXPMImage): Improve read performance by using
diff -r c5a31f5a35ec -r 7b165ce82542 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx	Sat Oct 29 17:41:33 2022 -0500
+++ b/VisualMagick/installer/inc/version.isx	Sun Oct 30 13:22:52 2022 -0500
@@ -10,5 +10,5 @@
 
 #define public MagickPackageName "GraphicsMagick"
 #define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020221029"
-#define public MagickPackageReleaseDate "snapshot-20221029"
+#define public MagickPackageVersionAddendum ".020221030"
+#define public MagickPackageReleaseDate "snapshot-20221030"
diff -r c5a31f5a35ec -r 7b165ce82542 magick/blob.c
--- a/magick/blob.c	Sat Oct 29 17:41:33 2022 -0500
+++ b/magick/blob.c	Sun Oct 30 13:22:52 2022 -0500
@@ -4517,28 +4517,120 @@
 */
 MagickExport char *ReadBlobString(Image *image,char *string)
 {
+  BlobInfo
+    * restrict blob;
+
+  size_t
+    i = 0;
+
   int
     c;
 
-  register unsigned int
-    i;
-
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
-  for (i=0; i < (MaxTextExtent-1); i++)
-  {
-    c=ReadBlobByte(image);
-    if (c == EOF)
+  assert(string != (char *) NULL);
+
+  blob=image->blob;
+
+  string[0] = '\0';
+
+  /*
+    Check if we will encounter read limit (assume that we will read
+    MaxTextExtent-1 characters)
+  */
+  if ((blob->read_total + MaxTextExtent-1) > blob->read_limit)
+    {
+      blob->read_total = blob->read_limit;
+      if (MagickFalse == blob->eof)
+        {
+          blob->eof=MagickTrue;
+          if (blob->read_limit <= blob->read_total)
+            {
+              ThrowException(&image->exception,ResourceLimitError,ReadLimitExceeded,
+                             image->filename);
+            }
+        }
+      return((char *) NULL);
+    }
+
+  switch (blob->type)
+    {
+    case UndefinedStream:
+      break;
+    case FileStream:
+    case StandardStream:
+    case PipeStream:
       {
-        if (i == 0)
-          return((char *) NULL);
+        if (fgets(string,MaxTextExtent,blob->handle.std) != NULL)
+          {
+            i = strlen(string);
+            blob->read_total += i;
+          }
+        else
+          {
+            if (!(blob->status) && ferror(blob->handle.std))
+              {
+                blob->status=1;
+                if (errno != 0)
+                  blob->first_errno=errno;
+              }
+            return((char *) NULL);
+          }
         break;
       }
-    string[i]=c;
-    if ((string[i] == '\n') || (string[i] == '\r'))
-      break;
-  }
-  string[i]='\0';
+    case ZipStream:
+      {
+#if defined(HasZLIB) && !defined(DISABLE_COMPRESSED_FILES)
+        if (gzgets(blob->handle.gz, string, MaxTextExtent) != NULL)
+          {
+            i = strlen(string);
+            blob->read_total += i;
+          }
+        else
+          {
+            int
+              gzerror_errnum=Z_OK;
+
+            (void) gzerror(blob->handle.gz,&gzerror_errnum);
+            if (gzerror_errnum != Z_OK)
+              {
+                blob->status=1;
+                if ((gzerror_errnum == Z_ERRNO) && (errno != 0))
+                  blob->first_errno=errno;
+              }
+            if (!blob->eof)
+              blob->eof = gzeof(blob->handle.gz);
+          }
+        break;
+#endif
+      }
+    default :
+      {
+        for (i=0; i < MaxTextExtent; i++)
+          {
+            c=ReadBlobByte(image);
+            if (c == EOF)
+              {
+                if (i == 0)
+                  return((char *) NULL);
+                break;
+              }
+            string[i]=c;
+            if (string[i] == '\n')
+              break;
+          }
+        i++;
+        string[i]='\0';
+      }
+    }
+
+  /* Strip trailing NL and CR */
+  while ((i > 0) && ((string[i-1] == '\r') || (string[i-1] == '\n')))
+    {
+      --i;
+      string[i] = 0;
+    }
+
   return(string);
 }
 
diff -r c5a31f5a35ec -r 7b165ce82542 magick/version.h
--- a/magick/version.h	Sat Oct 29 17:41:33 2022 -0500
+++ b/magick/version.h	Sun Oct 30 13:22:52 2022 -0500
@@ -38,8 +38,8 @@
 #define MagickLibVersion  0x272400
 #define MagickLibVersionText  "1.4"
 #define MagickLibVersionNumber 27,24,0
-#define MagickChangeDate   "20221029"
-#define MagickReleaseDate  "snapshot-20221029"
+#define MagickChangeDate   "20221030"
+#define MagickReleaseDate  "snapshot-20221030"
 
 /*
   The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines
diff -r c5a31f5a35ec -r 7b165ce82542 www/Changelog.html
--- a/www/Changelog.html	Sat Oct 29 17:41:33 2022 -0500
+++ b/www/Changelog.html	Sun Oct 30 13:22:52 2022 -0500
@@ -37,6 +37,13 @@
 </div>
 
 <div class="document">
+<p>2022-10-30  Bob Friesenhahn  &lt;<a class="reference external" href="mailto:bfriesen&#37;&#52;&#48;simple&#46;dallas&#46;tx&#46;us">bfriesen<span>&#64;</span>simple<span>&#46;</span>dallas<span>&#46;</span>tx<span>&#46;</span>us</a>&gt;</p>
+<blockquote>
+<ul class="simple">
+<li><p>magick/blob.c (ReadBlobString): Use fgets() in order to get much
+better performance.</p></li>
+</ul>
+</blockquote>
 <p>2022-10-29  Bob Friesenhahn  &lt;<a class="reference external" href="mailto:bfriesen&#37;&#52;&#48;simple&#46;dallas&#46;tx&#46;us">bfriesen<span>&#64;</span>simple<span>&#46;</span>dallas<span>&#46;</span>tx<span>&#46;</span>us</a>&gt;</p>
 <blockquote>
 <ul class="simple">
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.