Use ByteBuffer in the PS coder and moved shared Ghostscript logic to ghostscript-private.h.
diff --git a/coders/ghostscript-private.h b/coders/ghostscript-private.h index 0483fd0..3905220 100644 --- a/coders/ghostscript-private.h +++ b/coders/ghostscript-private.h
@@ -204,4 +204,55 @@ return(MagickFalse); } +static void ReadGhostScriptXMPProfile(ByteBuffer *buffer,StringInfo **profile) +{ +#define BeginXMPPacket "?xpacket begin=" +#define EndXMPPacket "<?xpacket end=" + + int + c; + + MagickBooleanType + found_end; + + register char + *p; + + size_t + length; + + ssize_t + count; + + if (*profile != (StringInfo *) NULL) + return; + if (CompareByteBuffer(BeginXMPPacket,buffer,strlen(BeginXMPPacket)) == MagickFalse) + return; + length=8192; + *profile=AcquireStringInfo(length); + found_end=MagickFalse; + p=(char *) GetStringInfoDatum(*profile); + *p++='<'; + count=1; + for (c=ReadByteBuffer(buffer); c != EOF; c=ReadByteBuffer(buffer)) + { + if (count == (ssize_t) length) + { + length<<=1; + SetStringInfoLength(*profile,length); + p=(char *) GetStringInfoDatum(*profile)+count; + } + count++; + *p++=(char) c; + if (found_end == MagickFalse) + found_end=CompareByteBuffer(EndXMPPacket,buffer,strlen(EndXMPPacket)); + else + { + if (c == (int) '>') + break; + } + } + SetStringInfoLength(*profile,(size_t) count); +} + #endif \ No newline at end of file