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 <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></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 <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></p> <blockquote> <ul class="simple">