2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % SSSSS TTTTT RRRR IIIII N N GGGG %
8 % SSS T RRRR I N N N G GGG %
9 % SS T R R I N NN G G %
10 % SSSSS T R R IIIII N N GGGG %
13 % MagickCore String Methods %
20 % Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the license. You may %
24 % obtain a copy of the license at %
26 % http://www.imagemagick.org/script/license.php %
28 % unless required by applicable law or agreed to in writing, software %
29 % distributed under the license is distributed on an "as is" basis, %
30 % without warranties or conditions of any kind, either express or implied. %
31 % See the license for the specific language governing permissions and %
32 % limitations under the license. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/exception.h"
46 #include "MagickCore/exception-private.h"
47 #include "MagickCore/list.h"
48 #include "MagickCore/locale_.h"
49 #include "MagickCore/log.h"
50 #include "MagickCore/memory_.h"
51 #include "MagickCore/nt-base-private.h"
52 #include "MagickCore/property.h"
53 #include "MagickCore/resource_.h"
54 #include "MagickCore/signature-private.h"
55 #include "MagickCore/string_.h"
56 #include "MagickCore/string-private.h"
57 #include "MagickCore/utility-private.h"
62 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
63 static const unsigned char
66 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
67 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
68 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
69 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
70 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
71 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
72 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
73 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
74 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
75 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
76 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
77 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
78 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
79 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
80 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
81 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
82 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
83 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
84 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
85 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
86 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
87 0xfc, 0xfd, 0xfe, 0xff,
92 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96 % A c q u i r e S t r i n g %
100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102 % AcquireString() allocates memory for a string and copies the source string
103 % to that memory location (and returns it).
105 % The returned string shoud be freed using DestoryString() or
106 % RelinquishMagickMemory() when finished.
108 % The format of the AcquireString method is:
110 % char *AcquireString(const char *source)
112 % A description of each parameter follows:
114 % o source: A character string.
117 MagickExport char *AcquireString(const char *source)
126 if (source != (char *) NULL)
127 length+=strlen(source);
128 if (~length < MaxTextExtent)
129 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
130 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
131 sizeof(*destination));
132 if (destination == (char *) NULL)
133 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
135 if (source != (char *) NULL)
136 (void) memcpy(destination,source,length*sizeof(*destination));
137 destination[length]='\0';
142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146 % A c q u i r e S t r i n g I n f o %
150 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152 % AcquireStringInfo() allocates the StringInfo structure.
154 % The format of the AcquireStringInfo method is:
156 % StringInfo *AcquireStringInfo(const size_t length)
158 % A description of each parameter follows:
160 % o length: the string length.
163 MagickExport StringInfo *AcquireStringInfo(const size_t length)
168 string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
169 if (string_info == (StringInfo *) NULL)
170 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
171 (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
172 string_info->signature=MagickSignature;
173 string_info->length=length;
174 if (string_info->length != 0)
176 string_info->datum=(unsigned char *) NULL;
177 if (~string_info->length >= (MaxTextExtent-1))
178 string_info->datum=(unsigned char *) AcquireQuantumMemory(
179 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
180 if (string_info->datum == (unsigned char *) NULL)
181 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
191 % B l o b T o S t r i n g I n f o %
195 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
197 % BlobToStringInfo() returns the contents of a blob as a string.
199 % The format of the BlobToStringInfo method is:
201 % StringInfo *BlobToStringInfo(const void *blob,const size_t length)
203 % A description of each parameter follows:
207 % o length: the length of the blob.
210 MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
215 string_info=AcquireStringInfo(0);
216 string_info->length=length;
217 if (~string_info->length >= (MaxTextExtent-1))
218 string_info->datum=(unsigned char *) AcquireQuantumMemory(
219 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
220 if (string_info->datum == (unsigned char *) NULL)
222 string_info=DestroyStringInfo(string_info);
223 return((StringInfo *) NULL);
225 if (blob != (const void *) NULL)
226 (void) memcpy(string_info->datum,blob,length);
231 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
235 % C l o n e S t r i n g %
239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
241 % CloneString() allocates memory for the destination string and copies
242 % the source string to that memory location.
244 % If source is a NULL pointer the destination will also be set to a NULL
245 % point (any existing string is freed). Otherwise the memory is allocated
246 % (or resized) and the source string copied into it.
248 % A pointer to the copy of the source string, or NULL is returned.
250 % The format of the CloneString method is:
252 % char *CloneString(char **destination,const char *source)
254 % A description of each parameter follows:
256 % o destination: A pointer to a character string.
258 % o source: A character string.
261 MagickExport char *CloneString(char **destination,const char *source)
266 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
267 assert(destination != (char **) NULL);
268 if (source == (const char *) NULL)
270 if (*destination != (char *) NULL)
271 *destination=DestroyString(*destination);
272 return(*destination);
274 if (*destination == (char *) NULL)
276 *destination=AcquireString(source);
277 return(*destination);
279 length=strlen(source);
280 if (~length < MaxTextExtent)
281 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
282 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
283 sizeof(**destination));
284 if (*destination == (char *) NULL)
285 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
287 (void) memcpy(*destination,source,length*sizeof(**destination));
288 (*destination)[length]='\0';
289 return(*destination);
293 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
297 % C l o n e S t r i n g I n f o %
301 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
303 % CloneStringInfo() clones a copy of the StringInfo structure.
305 % The format of the CloneStringInfo method is:
307 % StringInfo *CloneStringInfo(const StringInfo *string_info)
309 % A description of each parameter follows:
311 % o string_info: the string info.
314 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
319 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
320 assert(string_info != (StringInfo *) NULL);
321 assert(string_info->signature == MagickSignature);
322 clone_info=AcquireStringInfo(string_info->length);
323 if (string_info->length != 0)
324 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
333 % C o m p a r e S t r i n g I n f o %
337 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
339 % CompareStringInfo() compares the two datums target and source. It returns
340 % an integer less than, equal to, or greater than zero if target is found,
341 % respectively, to be less than, to match, or be greater than source.
343 % The format of the CompareStringInfo method is:
345 % int CompareStringInfo(const StringInfo *target,const StringInfo *source)
347 % A description of each parameter follows:
349 % o target: the target string.
351 % o source: the source string.
355 static inline size_t MagickMin(const size_t x,const size_t y)
362 MagickExport int CompareStringInfo(const StringInfo *target,
363 const StringInfo *source)
368 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
369 assert(target != (StringInfo *) NULL);
370 assert(target->signature == MagickSignature);
371 assert(source != (StringInfo *) NULL);
372 assert(source->signature == MagickSignature);
373 status=memcmp(target->datum,source->datum,MagickMin(target->length,
377 if (target->length == source->length)
379 return(target->length < source->length ? -1 : 1);
383 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
387 % C o n c a t e n a t e M a g i c k S t r i n g %
391 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
393 % ConcatenateMagickString() concatenates the source string to the destination
394 % string. The destination buffer is always null-terminated even if the
395 % string must be truncated.
397 % The format of the ConcatenateMagickString method is:
399 % size_t ConcatenateMagickString(char *destination,const char *source,
400 % const size_t length)
402 % A description of each parameter follows:
404 % o destination: the destination string.
406 % o source: the source string.
408 % o length: the length of the destination string.
411 MagickExport size_t ConcatenateMagickString(char *destination,
412 const char *source,const size_t length)
426 assert(destination != (char *) NULL);
427 assert(source != (const char *) NULL);
432 while ((i-- != 0) && (*q != '\0'))
434 count=(size_t) (q-destination);
437 return(count+strlen(p));
448 return(count+(p-source));
452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
456 % C o n c a t e n a t e S t r i n g %
460 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
462 % ConcatenateString() appends a copy of string source, including the
463 % terminating null character, to the end of string destination.
465 % The format of the ConcatenateString method is:
467 % MagickBooleanType ConcatenateString(char **destination,
468 % const char *source)
470 % A description of each parameter follows:
472 % o destination: A pointer to a character string.
474 % o source: A character string.
477 MagickExport MagickBooleanType ConcatenateString(char **destination,
485 assert(destination != (char **) NULL);
486 if (source == (const char *) NULL)
488 if (*destination == (char *) NULL)
490 *destination=AcquireString(source);
493 destination_length=strlen(*destination);
494 source_length=strlen(source);
495 length=destination_length;
496 if (~length < source_length)
497 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
498 length+=source_length;
499 if (~length < MaxTextExtent)
500 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
501 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
502 sizeof(**destination));
503 if (*destination == (char *) NULL)
504 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
505 if (source_length != 0)
506 (void) memcpy((*destination)+destination_length,source,source_length);
507 (*destination)[length]='\0';
512 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
516 % C o n c a t e n a t e S t r i n g I n f o %
520 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
522 % ConcatenateStringInfo() concatenates the source string to the destination
525 % The format of the ConcatenateStringInfo method is:
527 % void ConcatenateStringInfo(StringInfo *string_info,
528 % const StringInfo *source)
530 % A description of each parameter follows:
532 % o string_info: the string info.
534 % o source: the source string.
537 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
538 const StringInfo *source)
543 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
544 assert(string_info != (StringInfo *) NULL);
545 assert(string_info->signature == MagickSignature);
546 assert(source != (const StringInfo *) NULL);
547 length=string_info->length;
548 if (~length < source->length)
549 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
550 SetStringInfoLength(string_info,length+source->length);
551 (void) memcpy(string_info->datum+length,source->datum,source->length);
555 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
559 % C o n f i g u r e F i l e T o S t r i n g I n f o %
563 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
565 % ConfigureFileToStringInfo() returns the contents of a configure file as a
568 % The format of the ConfigureFileToStringInfo method is:
570 % StringInfo *ConfigureFileToStringInfo(const char *filename)
571 % ExceptionInfo *exception)
573 % A description of each parameter follows:
575 % o filename: the filename.
578 MagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
598 assert(filename != (const char *) NULL);
599 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
601 return((StringInfo *) NULL);
602 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
603 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
606 return((StringInfo *) NULL);
608 length=(size_t) offset;
609 string=(char *) NULL;
610 if (~length >= (MaxTextExtent-1))
611 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
612 if (string == (char *) NULL)
615 return((StringInfo *) NULL);
617 map=MapBlob(file,ReadMode,0,length);
618 if (map != (void *) NULL)
620 (void) memcpy(string,map,length);
621 (void) UnmapBlob(map,length);
631 (void) lseek(file,0,SEEK_SET);
632 for (i=0; i < length; i+=count)
634 count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
646 string=DestroyString(string);
647 return((StringInfo *) NULL);
652 string_info=AcquireStringInfo(0);
653 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
654 string_info->length=length;
655 string_info->datum=(unsigned char *) string;
660 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
664 % C o n s t a n t S t r i n g %
668 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
670 % ConstantString() allocates memory for a string and copies the source string
671 % to that memory location (and returns it). Use it for strings that you do
672 % do not expect to change over its lifetime.
674 % The format of the ConstantString method is:
676 % char *ConstantString(const char *source)
678 % A description of each parameter follows:
680 % o source: A character string.
683 MagickExport char *ConstantString(const char *source)
692 if (source != (char *) NULL)
693 length+=strlen(source);
694 destination=(char *) NULL;
696 destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
697 if (destination == (char *) NULL)
698 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
700 if (source != (char *) NULL)
701 (void) memcpy(destination,source,length*sizeof(*destination));
702 destination[length]='\0';
707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
711 % C o p y M a g i c k S t r i n g %
715 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
717 % CopyMagickString() copies the source string to the destination string. The
718 % destination buffer is always null-terminated even if the string must be
719 % truncated. The return value is the minimum of the source string length
720 % or the length parameter.
722 % The format of the CopyMagickString method is:
724 % size_t CopyMagickString(const char *destination,char *source,
725 % const size_t length)
727 % A description of each parameter follows:
729 % o destination: the destination string.
731 % o source: the source string.
733 % o length: the length of the destination string.
736 MagickExport size_t CopyMagickString(char *destination,const char *source,
748 if (source == (const char *) NULL)
752 for (n=length; n > 4; n-=4)
756 return((size_t) (p-source-1));
760 return((size_t) (p-source-1));
764 return((size_t) (p-source-1));
768 return((size_t) (p-source-1));
772 for (n--; n != 0; n--)
776 return((size_t) (p-source-1));
781 return((size_t) (p-source-1));
785 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
789 % D e s t r o y S t r i n g %
793 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
795 % DestroyString() destroys memory associated with a string.
797 % The format of the DestroyString method is:
799 % char *DestroyString(char *string)
801 % A description of each parameter follows:
803 % o string: the string.
806 MagickExport char *DestroyString(char *string)
808 return((char *) RelinquishMagickMemory(string));
812 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
816 % D e s t r o y S t r i n g I n f o %
820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
822 % DestroyStringInfo() destroys memory associated with the StringInfo structure.
824 % The format of the DestroyStringInfo method is:
826 % StringInfo *DestroyStringInfo(StringInfo *string_info)
828 % A description of each parameter follows:
830 % o string_info: the string info.
833 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
835 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
836 assert(string_info != (StringInfo *) NULL);
837 assert(string_info->signature == MagickSignature);
838 if (string_info->datum != (unsigned char *) NULL)
839 string_info->datum=(unsigned char *) RelinquishMagickMemory(
841 string_info->signature=(~MagickSignature);
842 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
847 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
851 % D e s t r o y S t r i n g L i s t %
855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
857 % DestroyStringList() zeros memory associated with a string list.
859 % The format of the DestroyStringList method is:
861 % char **DestroyStringList(char **list)
863 % A description of each parameter follows:
865 % o list: the string list.
868 MagickExport char **DestroyStringList(char **list)
873 assert(list != (char **) NULL);
874 for (i=0; list[i] != (char *) NULL; i++)
875 list[i]=DestroyString(list[i]);
876 list=(char **) RelinquishMagickMemory(list);
881 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
885 % E s c a p e S t r i n g %
889 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
891 % EscapeString() allocates memory for a backslash-escaped version of a
892 % source text string, copies the escaped version of the text to that
893 % memory location while adding backslash characters, and returns the
896 % The format of the EscapeString method is:
898 % char *EscapeString(const char *source,const char escape)
900 % A description of each parameter follows:
902 % o allocate_string: Method EscapeString returns the escaped string.
904 % o source: A character string.
906 % o escape: the quoted string termination character to escape (e.g. '"').
909 MagickExport char *EscapeString(const char *source,const char escape)
923 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
924 assert(source != (const char *) NULL);
925 length=strlen(source);
926 for (p=source; *p != '\0'; p++)
927 if ((*p == '\\') || (*p == escape))
930 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
933 destination=(char *) NULL;
934 if (~length >= (MaxTextExtent-1))
935 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
936 sizeof(*destination));
937 if (destination == (char *) NULL)
938 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
940 if (source != (char *) NULL)
943 for (p=source; *p != '\0'; p++)
945 if ((*p == '\\') || (*p == escape))
955 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
959 % F i l e T o S t r i n g %
963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
965 % FileToString() returns the contents of a file as a string.
967 % The format of the FileToString method is:
969 % char *FileToString(const char *filename,const size_t extent,
970 % ExceptionInfo *exception)
972 % A description of each parameter follows:
974 % o filename: the filename.
976 % o extent: Maximum length of the string.
978 % o exception: return any errors or warnings in this structure.
981 MagickExport char *FileToString(const char *filename,const size_t extent,
982 ExceptionInfo *exception)
987 assert(filename != (const char *) NULL);
988 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
989 assert(exception != (ExceptionInfo *) NULL);
990 return((char *) FileToBlob(filename,extent,&length,exception));
994 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
998 % F i l e T o S t r i n g I n f o %
1002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1004 % FileToStringInfo() returns the contents of a file as a string.
1006 % The format of the FileToStringInfo method is:
1008 % StringInfo *FileToStringInfo(const char *filename,const size_t extent,
1009 % ExceptionInfo *exception)
1011 % A description of each parameter follows:
1013 % o filename: the filename.
1015 % o extent: Maximum length of the string.
1017 % o exception: return any errors or warnings in this structure.
1020 MagickExport StringInfo *FileToStringInfo(const char *filename,
1021 const size_t extent,ExceptionInfo *exception)
1026 assert(filename != (const char *) NULL);
1027 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1028 assert(exception != (ExceptionInfo *) NULL);
1029 string_info=AcquireStringInfo(0);
1030 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1031 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1032 if (string_info->datum == (unsigned char *) NULL)
1034 string_info=DestroyStringInfo(string_info);
1035 return((StringInfo *) NULL);
1037 return(string_info);
1041 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1045 % F o r m a t M a g i c k S i z e %
1049 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1051 % FormatMagickSize() converts a size to a human readable format, for example,
1052 % 14k, 234m, 2.7g, or 3.0t. Scaling is done by repetitively dividing by
1055 % The format of the FormatMagickSize method is:
1057 % ssize_t FormatMagickSize(const MagickSizeType size,char *format)
1059 % A description of each parameter follows:
1061 % o size: convert this size to a human readable format.
1063 % o bi: use power of two rather than power of ten.
1065 % o format: human readable format.
1068 MagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1069 const MagickBooleanType bi,char *format)
1088 "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1090 *traditional_units[] =
1092 "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1096 units=traditional_units;
1097 if (bi != MagickFalse)
1102 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1103 length=(double) ((MagickOffsetType) size);
1105 length=(double) size;
1107 for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1109 for (j=2; j < 12; j++)
1111 count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
1113 if (strchr(format,'+') == (char *) NULL)
1120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1124 % F o r m a t M a g i c k T i m e %
1128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1130 % FormatMagickTime() returns the specified time in the Internet date/time
1131 % format and the length of the timestamp.
1133 % The format of the FormatMagickTime method is:
1135 % ssize_t FormatMagickTime(const time_t time,const size_t length,
1138 % A description of each parameter follows.
1140 % o time: the time since the Epoch (00:00:00 UTC, January 1, 1970),
1141 % measured in seconds.
1143 % o length: the maximum length of the string.
1145 % o timestamp: Return the Internet date/time here.
1148 MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1161 assert(timestamp != (char *) NULL);
1162 (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1163 (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1164 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1165 (void) localtime_r(&time,&local_time);
1171 my_time=localtime(&time);
1172 if (my_time != (struct tm *) NULL)
1173 (void) memcpy(&local_time,my_time,sizeof(local_time));
1176 #if defined(MAGICKCORE_HAVE_GMTIME_R)
1177 (void) gmtime_r(&time,&gm_time);
1183 my_time=gmtime(&time);
1184 if (my_time != (struct tm *) NULL)
1185 (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1188 timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1189 local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1190 gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1191 (local_time.tm_yday-gm_time.tm_yday)));
1192 count=FormatLocaleString(timestamp,length,
1193 "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1194 local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1195 local_time.tm_min,local_time.tm_sec,(long) timezone);
1200 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1204 % G e t E n v i r o n m e n t V a l u e %
1208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1210 % GetEnvironmentValue() returns the environment string that matches the
1213 % The format of the GetEnvironmentValue method is:
1215 % char *GetEnvironmentValue(const char *name)
1217 % A description of each parameter follows:
1219 % o name: the environment name.
1222 MagickExport char *GetEnvironmentValue(const char *name)
1227 environment=getenv(name);
1228 if (environment == (const char *) NULL)
1229 return((char *) NULL);
1230 return(ConstantString(environment));
1234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1238 % G e t S t r i n g I n f o D a t u m %
1242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1244 % GetStringInfoDatum() returns the datum associated with the string.
1246 % The format of the GetStringInfoDatum method is:
1248 % unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1250 % A description of each parameter follows:
1252 % o string_info: the string info.
1255 MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1257 assert(string_info != (StringInfo *) NULL);
1258 assert(string_info->signature == MagickSignature);
1259 return(string_info->datum);
1263 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1267 % G e t S t r i n g I n f o L e n g t h %
1271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1273 % GetStringInfoLength() returns the string length.
1275 % The format of the GetStringInfoLength method is:
1277 % size_t GetStringInfoLength(const StringInfo *string_info)
1279 % A description of each parameter follows:
1281 % o string_info: the string info.
1284 MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1286 assert(string_info != (StringInfo *) NULL);
1287 assert(string_info->signature == MagickSignature);
1288 return(string_info->length);
1292 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1296 % G e t S t r i n g I n f o P a t h %
1300 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1302 % GetStringInfoPath() returns the path associated with the string.
1304 % The format of the GetStringInfoPath method is:
1306 % const char *GetStringInfoPath(const StringInfo *string_info)
1308 % A description of each parameter follows:
1310 % o string_info: the string info.
1313 MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1315 assert(string_info != (StringInfo *) NULL);
1316 assert(string_info->signature == MagickSignature);
1317 return(string_info->path);
1321 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1325 + I n t e r p r e t S i P r e f i x V a l u e %
1329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1331 % InterpretSiPrefixValue() converts the initial portion of the string to a
1332 % double representation. It also recognizes SI prefixes (e.g. B, KB, MiB,
1335 % The format of the InterpretSiPrefixValue method is:
1337 % double InterpretSiPrefixValue(const char *value,char **sentinal)
1339 % A description of each parameter follows:
1341 % o value: the string value.
1343 % o sentinal: if sentinal is not NULL, return a pointer to the character
1344 % after the last character used in the conversion.
1347 MagickExport double InterpretSiPrefixValue(const char *restrict string,
1348 char **restrict sentinal)
1356 value=InterpretLocaleValue(string,&q);
1359 if ((*q >= 'E') && (*q <= 'z'))
1364 switch ((int) ((unsigned char) *q))
1366 case 'y': e=(-24.0); break;
1367 case 'z': e=(-21.0); break;
1368 case 'a': e=(-18.0); break;
1369 case 'f': e=(-15.0); break;
1370 case 'p': e=(-12.0); break;
1371 case 'n': e=(-9.0); break;
1372 case 'u': e=(-6.0); break;
1373 case 'm': e=(-3.0); break;
1374 case 'c': e=(-2.0); break;
1375 case 'd': e=(-1.0); break;
1376 case 'h': e=2.0; break;
1377 case 'k': e=3.0; break;
1378 case 'K': e=3.0; break;
1379 case 'M': e=6.0; break;
1380 case 'G': e=9.0; break;
1381 case 'T': e=12.0; break;
1382 case 'P': e=15.0; break;
1383 case 'E': e=18.0; break;
1384 case 'Z': e=21.0; break;
1385 case 'Y': e=24.0; break;
1386 default: e=0.0; break;
1388 if (e >= MagickEpsilon)
1392 value*=pow(2.0,e/0.3);
1405 if (sentinal != (char **) NULL)
1411 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1415 % I s S t r i n g T r u e %
1419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1421 % IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
1422 % "1". Any other string or undefined returns MagickFalse.
1424 % Typically this is used to look at strings (options or artifacts) which
1425 % has a default value of "false", when not defined.
1427 % The format of the IsStringTrue method is:
1429 % MagickBooleanType IsStringTrue(const char *value)
1431 % A description of each parameter follows:
1433 % o value: Specifies a pointer to a character array.
1436 MagickExport MagickBooleanType IsStringTrue(const char *value)
1438 if (value == (const char *) NULL)
1439 return(MagickFalse);
1440 if (LocaleCompare(value,"true") == 0)
1442 if (LocaleCompare(value,"on") == 0)
1444 if (LocaleCompare(value,"yes") == 0)
1446 if (LocaleCompare(value,"1") == 0)
1448 return(MagickFalse);
1452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1456 % I s S t r i n g N o t F a l s e %
1460 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1462 % IsStringNotFalse() returns MagickTrue, unless the string specifically
1463 % has a value that makes this false. that is if it has a value of
1464 % "false", "off", "no" or "0".
1466 % Typically this is used to look at strings (options or artifacts) which
1467 % has a default value of "true", when it has not been defined.
1469 % The format of the IsStringNotFalse method is:
1471 % MagickBooleanType IsStringNotFalse(const char *value)
1473 % A description of each parameter follows:
1475 % o value: Specifies a pointer to a character array.
1478 MagickExport MagickBooleanType IsStringNotFalse(const char *value)
1480 if (value == (const char *) NULL)
1482 if (LocaleCompare(value,"false") == 0)
1483 return(MagickFalse);
1484 if (LocaleCompare(value,"off") == 0)
1485 return(MagickFalse);
1486 if (LocaleCompare(value,"no") == 0)
1487 return(MagickFalse);
1488 if (LocaleCompare(value,"0") == 0)
1489 return(MagickFalse);
1494 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1498 % L o c a l e C o m p a r e %
1502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1504 % LocaleCompare() performs a case-insensitive comparison of two strings
1505 % byte-by-byte, according to the ordering of the current locale encoding.
1506 % LocaleCompare returns an integer greater than, equal to, or less than 0,
1507 % if the string pointed to by p is greater than, equal to, or less than the
1508 % string pointed to by q respectively. The sign of a non-zero return value
1509 % is determined by the sign of the difference between the values of the first
1510 % pair of bytes that differ in the strings being compared.
1512 % The format of the LocaleCompare method is:
1514 % int LocaleCompare(const char *p,const char *q)
1516 % A description of each parameter follows:
1518 % o p: A pointer to a character string.
1520 % o q: A pointer to a character string to compare to p.
1523 MagickExport int LocaleCompare(const char *p,const char *q)
1525 if ((p == (char *) NULL) && (q == (char *) NULL))
1527 if (p == (char *) NULL)
1529 if (q == (char *) NULL)
1531 #if defined(MAGICKCORE_HAVE_STRCASECMP)
1532 return(strcasecmp(p,q));
1541 c=(int) *((unsigned char *) p);
1542 d=(int) *((unsigned char *) q);
1543 if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1548 return(AsciiMap[c]-(int) AsciiMap[d]);
1554 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1558 % L o c a l e L o w e r %
1562 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1564 % LocaleLower() transforms all of the characters in the supplied
1565 % null-terminated string, changing all uppercase letters to lowercase.
1567 % The format of the LocaleLower method is:
1569 % void LocaleLower(char *string)
1571 % A description of each parameter follows:
1573 % o string: A pointer to the string to convert to lower-case Locale.
1576 MagickExport void LocaleLower(char *string)
1581 assert(string != (char *) NULL);
1582 for (q=string; *q != '\0'; q++)
1583 *q=(char) tolower((int) *q);
1587 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1591 % L o c a l e N C o m p a r e %
1595 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1597 % LocaleNCompare() performs a case-insensitive comparison of two
1598 % strings byte-by-byte, according to the ordering of the current locale
1599 % encoding. LocaleNCompare returns an integer greater than, equal to, or
1600 % less than 0, if the string pointed to by p is greater than, equal to, or
1601 % less than the string pointed to by q respectively. The sign of a non-zero
1602 % return value is determined by the sign of the difference between the
1603 % values of the first pair of bytes that differ in the strings being
1604 % compared. The LocaleNCompare method makes the same comparison as
1605 % LocaleCompare but looks at a maximum of n bytes. Bytes following a
1606 % null byte are not compared.
1608 % The format of the LocaleNCompare method is:
1610 % int LocaleNCompare(const char *p,const char *q,const size_t n)
1612 % A description of each parameter follows:
1614 % o p: A pointer to a character string.
1616 % o q: A pointer to a character string to compare to p.
1618 % o length: the number of characters to compare in strings p and q.
1621 MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1623 if ((p == (char *) NULL) && (q == (char *) NULL))
1625 if (p == (char *) NULL)
1627 if (q == (char *) NULL)
1629 #if defined(MAGICKCORE_HAVE_STRNCASECMP)
1630 return(strncasecmp(p,q,length));
1640 for (i=length; i != 0; i--)
1642 c=(int) *((unsigned char *) p);
1643 d=(int) *((unsigned char *) q);
1644 if (AsciiMap[c] != AsciiMap[d])
1645 return(AsciiMap[c]-(int) AsciiMap[d]);
1657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1661 % L o c a l e U p p e r %
1665 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1667 % LocaleUpper() transforms all of the characters in the supplied
1668 % null-terminated string, changing all lowercase letters to uppercase.
1670 % The format of the LocaleUpper method is:
1672 % void LocaleUpper(char *string)
1674 % A description of each parameter follows:
1676 % o string: A pointer to the string to convert to upper-case Locale.
1679 MagickExport void LocaleUpper(char *string)
1684 assert(string != (char *) NULL);
1685 for (q=string; *q != '\0'; q++)
1686 *q=(char) toupper((int) *q);
1690 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1694 % P r i n t S t r i n g I n f o %
1698 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1700 % PrintStringInfo() prints the string.
1702 % The format of the PrintStringInfo method is:
1704 % void PrintStringInfo(FILE *file,const char *id,
1705 % const StringInfo *string_info)
1707 % A description of each parameter follows:
1709 % o file: the file, typically stdout.
1711 % o id: the string id.
1713 % o string_info: the string info.
1716 MagickExport void PrintStringInfo(FILE *file,const char *id,
1717 const StringInfo *string_info)
1726 assert(id != (const char *) NULL);
1727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
1728 assert(string_info != (StringInfo *) NULL);
1729 assert(string_info->signature == MagickSignature);
1730 p=(char *) string_info->datum;
1731 for (i=0; i < string_info->length; i++)
1733 if (((int) ((unsigned char) *p) < 32) &&
1734 (isspace((int) ((unsigned char) *p)) == 0))
1738 if (i == string_info->length)
1740 (void) fputs((char *) string_info->datum,file);
1741 (void) fputc('\n',file);
1745 Convert string to a HEX list.
1747 p=(char *) string_info->datum;
1748 for (i=0; i < string_info->length; i+=0x14)
1750 (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1751 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1753 (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1754 if ((j % 0x04) == 0)
1755 (void) fputc(' ',file);
1757 for ( ; j <= 0x14; j++)
1759 (void) fputc(' ',file);
1760 (void) fputc(' ',file);
1761 if ((j % 0x04) == 0)
1762 (void) fputc(' ',file);
1764 (void) fputc(' ',file);
1765 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1767 if (isprint((int) ((unsigned char) *p)) != 0)
1768 (void) fputc(*p,file);
1770 (void) fputc('-',file);
1773 (void) fputc('\n',file);
1778 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1782 % R e s e t S t r i n g I n f o %
1786 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1788 % ResetStringInfo() reset the string to all null bytes.
1790 % The format of the ResetStringInfo method is:
1792 % void ResetStringInfo(StringInfo *string_info)
1794 % A description of each parameter follows:
1796 % o string_info: the string info.
1799 MagickExport void ResetStringInfo(StringInfo *string_info)
1801 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1802 assert(string_info != (StringInfo *) NULL);
1803 assert(string_info->signature == MagickSignature);
1804 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1812 % S e t S t r i n g I n f o %
1816 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1818 % SetStringInfo() copies the source string to the destination string.
1820 % The format of the SetStringInfo method is:
1822 % void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1824 % A description of each parameter follows:
1826 % o string_info: the string info.
1828 % o source: the source string.
1831 MagickExport void SetStringInfo(StringInfo *string_info,
1832 const StringInfo *source)
1834 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1835 assert(string_info != (StringInfo *) NULL);
1836 assert(string_info->signature == MagickSignature);
1837 assert(source != (StringInfo *) NULL);
1838 assert(source->signature == MagickSignature);
1839 if (string_info->length == 0)
1841 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1842 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1847 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1851 % S e t S t r i n g I n f o D a t u m %
1855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1857 % SetStringInfoDatum() copies bytes from the source string for the length of
1858 % the destination string.
1860 % The format of the SetStringInfoDatum method is:
1862 % void SetStringInfoDatum(StringInfo *string_info,
1863 % const unsigned char *source)
1865 % A description of each parameter follows:
1867 % o string_info: the string info.
1869 % o source: the source string.
1872 MagickExport void SetStringInfoDatum(StringInfo *string_info,
1873 const unsigned char *source)
1875 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1876 assert(string_info != (StringInfo *) NULL);
1877 assert(string_info->signature == MagickSignature);
1878 if (string_info->length != 0)
1879 (void) memcpy(string_info->datum,source,string_info->length);
1883 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1887 % S e t S t r i n g I n f o L e n g t h %
1891 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1893 % SetStringInfoLength() set the string length to the specified value.
1895 % The format of the SetStringInfoLength method is:
1897 % void SetStringInfoLength(StringInfo *string_info,const size_t length)
1899 % A description of each parameter follows:
1901 % o string_info: the string info.
1903 % o length: the string length.
1906 MagickExport void SetStringInfoLength(StringInfo *string_info,
1907 const size_t length)
1909 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1910 assert(string_info != (StringInfo *) NULL);
1911 assert(string_info->signature == MagickSignature);
1912 if (~length < MaxTextExtent)
1913 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1914 string_info->length=length;
1915 if (string_info->datum == (unsigned char *) NULL)
1916 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1917 MaxTextExtent,sizeof(*string_info->datum));
1919 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1920 length+MaxTextExtent,sizeof(*string_info->datum));
1921 if (string_info->datum == (unsigned char *) NULL)
1922 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1926 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1930 % S e t S t r i n g I n f o D a t u m %
1934 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1936 % SetStringInfoPath() sets the path associated with the string.
1938 % The format of the SetStringInfoPath method is:
1940 % void SetStringInfoPath(StringInfo *string_info,const char *path)
1942 % A description of each parameter follows:
1944 % o string_info: the string info.
1949 MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1951 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1952 assert(string_info != (StringInfo *) NULL);
1953 assert(string_info->signature == MagickSignature);
1954 assert(path != (const char *) NULL);
1955 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1959 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1963 % S p l i t S t r i n g I n f o %
1967 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1969 % SplitStringInfo() splits a string into two and returns it.
1971 % The format of the SplitStringInfo method is:
1973 % StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1975 % A description of each parameter follows:
1977 % o string_info: the string info.
1980 MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1981 const size_t offset)
1986 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1987 assert(string_info != (StringInfo *) NULL);
1988 assert(string_info->signature == MagickSignature);
1989 if (offset > string_info->length)
1990 return((StringInfo *) NULL);
1991 split_info=AcquireStringInfo(offset);
1992 SetStringInfo(split_info,string_info);
1993 (void) memmove(string_info->datum,string_info->datum+offset,
1994 string_info->length-offset+MaxTextExtent);
1995 SetStringInfoLength(string_info,string_info->length-offset);
2000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004 % S t r i n g I n f o T o S t r i n g %
2008 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2010 % StringInfoToString() converts a string info string to a C string.
2012 % The format of the StringInfoToString method is:
2014 % char *StringInfoToString(const StringInfo *string_info)
2016 % A description of each parameter follows:
2018 % o string_info: the string.
2021 MagickExport char *StringInfoToString(const StringInfo *string_info)
2029 string=(char *) NULL;
2030 length=string_info->length;
2031 if (~length >= (MaxTextExtent-1))
2032 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
2033 if (string == (char *) NULL)
2034 return((char *) NULL);
2035 (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
2036 string[length]='\0';
2041 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2045 % S t r i n g I n f o T o H e x S t r i n g %
2049 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2051 % StringInfoToHexString() converts a string info string to a C string.
2053 % The format of the StringInfoToHexString method is:
2055 % char *StringInfoToHexString(const StringInfo *string_info)
2057 % A description of each parameter follows:
2059 % o string_info: the string.
2062 MagickExport char *StringInfoToHexString(const StringInfo *string_info)
2067 register const unsigned char
2073 register unsigned char
2082 length=string_info->length;
2083 if (~length < MaxTextExtent)
2084 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2085 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2086 if (string == (char *) NULL)
2087 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2104 p=string_info->datum;
2105 q=(unsigned char *) string;
2106 for (i=0; i < (ssize_t) string_info->length; i++)
2108 *q++=hex_digits[(*p >> 4) & 0x0f];
2109 *q++=hex_digits[*p & 0x0f];
2117 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2121 % S t r i n g T o A r g v %
2125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2127 % StringToArgv() converts a text string into command line arguments.
2128 % The 'argv' array of arguments, is returned while the number of arguments
2129 % is returned via the provided integer variable pointer.
2131 % Simple 'word' tokenizer, which allows for each word to be optionally
2132 % quoted. However it will not allow use of partial quotes, or escape
2135 % The format of the StringToArgv method is:
2137 % char **StringToArgv(const char *text,int *argc)
2139 % A description of each parameter follows:
2141 % o argv: Method StringToArgv returns the string list unless an error
2142 % occurs, otherwise NULL.
2144 % o text: Specifies the string to segment into a list.
2146 % o argc: This integer pointer returns the number of arguments in the
2150 MagickExport char **StringToArgv(const char *text,int *argc)
2163 if (text == (char *) NULL)
2164 return((char **) NULL);
2166 Determine the number of arguments.
2168 for (p=text; *p != '\0'; )
2170 while (isspace((int) ((unsigned char) *p)) != 0)
2176 for (p++; (*p != '"') && (*p != '\0'); p++) ;
2178 for (p++; (*p != '\'') && (*p != '\0'); p++) ;
2179 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2183 argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
2184 if (argv == (char **) NULL)
2185 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
2187 Convert string to an ASCII list.
2189 argv[0]=AcquireString("magick");
2191 for (i=1; i < (ssize_t) *argc; i++)
2193 while (isspace((int) ((unsigned char) *p)) != 0)
2199 for (q++; (*q != '"') && (*q != '\0'); q++) ;
2205 for (q++; (*q != '\'') && (*q != '\0'); q++) ;
2208 while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
2210 argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2212 if (argv[i] == (char *) NULL)
2214 for (i--; i >= 0; i--)
2215 argv[i]=DestroyString(argv[i]);
2216 argv=(char **) RelinquishMagickMemory(argv);
2217 ThrowFatalException(ResourceLimitFatalError,
2218 "UnableToConvertStringToARGV");
2220 (void) memcpy(argv[i],p,(size_t) (q-p));
2223 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2226 argv[i]=(char *) NULL;
2231 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2235 % S t r i n g T o A r r a y O f D o u b l e s %
2239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2241 % StringToArrayOfDoubles() converts a string of space or comma seperated
2242 % numbers into array of floating point numbers (doubles). Any number that
2243 % failes to parse properly will produce a syntax error. As will two commas
2244 % without a number between them. However a final comma at the end will
2245 % not be regarded as an error so as to simplify automatic list generation.
2247 % A NULL value is returned on syntax or memory errors.
2249 % Use RelinquishMagickMemory() to free returned array when finished.
2251 % The format of the StringToArrayOfDoubles method is:
2253 % double *StringToArrayOfDoubles(const char *string,
2254 % size_t *count, ExceptionInfo *exception)
2256 % A description of each parameter follows:
2258 % o string: the string containing the comma/space seperated values.
2260 % o count: returns number of arguments in returned array
2262 % o exception: return 'memory failure' exceptions
2265 MagickExport double *StringToArrayOfDoubles(const char *string,
2266 ssize_t *count, ExceptionInfo *exception)
2280 /* Determine count of values, and check syntax */
2286 (void) StringToDouble(p, &q); /* get value - ignores leading space */
2287 if (p == q) return((double *)NULL); /* no value found */
2288 p=q; i++; /* inc value count */
2289 while ( isspace((int)*p) ) p++; /* skip spaces */
2290 if ( *p == ',' ) p++; /* skip comma */
2291 while ( isspace((int)*p) ) p++; /* and more spaces */
2294 /* Allocate floating point argument list */
2296 array=(double *) AcquireQuantumMemory(i,sizeof(*array));
2297 if (array == (double *) NULL) {
2298 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2299 (void) ThrowMagickException(exception,GetMagickModule(),
2300 ResourceLimitFatalError,"MemoryAllocationFailed"," ");
2301 return((double *)NULL);
2304 /* Fill in the floating point values */
2307 while( *p != '\0' && i < *count ) {
2308 array[i++]=StringToDouble(p,&q);
2310 while ( isspace((int)*p) || *p == ',' ) p++;
2317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2321 + S t r i n g T o k e n %
2325 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2327 % StringToken() Looks for any one of given delimiters and splits the string
2328 % into two separate strings by replacing the delimiter character found with a
2331 % The given string pointer is changed to point to the string following the
2332 % delimiter character found, or NULL. A pointer to the start of the
2333 % string is returned, representing the token before the delimiter.
2335 % In may ways this is equivent to the strtok() C library function, but with
2336 % multiple delimiter characters rather than a delimiter string.
2338 % The format of the StringToken method is:
2340 % char *StringToken(const char *delimiters,char **string)
2342 % A description of each parameter follows:
2344 % o delimiters: one or more delimiters.
2346 % o string: return the first token in the string. If none is found, return
2350 MagickExport char *StringToken(const char *delimiters,char **string)
2366 if (p == (char *) NULL)
2367 return((char *) NULL);
2385 } while (d != '\0');
2390 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2394 % S t r i n g T o L i s t %
2398 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2400 % StringToList() converts a text string into a list by segmenting the text
2401 % string at each carriage return discovered. The list is converted to HEX
2402 % characters if any control characters are discovered within the text string.
2404 % The format of the StringToList method is:
2406 % char **StringToList(const char *text)
2408 % A description of each parameter follows:
2410 % o text: Specifies the string to segment into a list.
2413 MagickExport char **StringToList(const char *text)
2427 if (text == (char *) NULL)
2428 return((char **) NULL);
2429 for (p=text; *p != '\0'; p++)
2430 if (((int) ((unsigned char) *p) < 32) &&
2431 (isspace((int) ((unsigned char) *p)) == 0))
2439 Convert string to an ASCII list.
2442 for (p=text; *p != '\0'; p++)
2445 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2447 if (textlist == (char **) NULL)
2448 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2450 for (i=0; i < (ssize_t) lines; i++)
2452 for (q=p; *q != '\0'; q++)
2453 if ((*q == '\r') || (*q == '\n'))
2455 textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2456 sizeof(**textlist));
2457 if (textlist[i] == (char *) NULL)
2458 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2459 (void) memcpy(textlist[i],p,(size_t) (q-p));
2460 textlist[i][q-p]='\0';
2469 hex_string[MaxTextExtent];
2478 Convert string to a HEX list.
2480 lines=(size_t) (strlen(text)/0x14)+1;
2481 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2483 if (textlist == (char **) NULL)
2484 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2486 for (i=0; i < (ssize_t) lines; i++)
2488 textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
2489 sizeof(**textlist));
2490 if (textlist[i] == (char *) NULL)
2491 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2492 (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2494 q=textlist[i]+strlen(textlist[i]);
2495 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2497 (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
2498 (void) CopyMagickString(q,hex_string,MaxTextExtent);
2500 if ((j % 0x04) == 0)
2503 for ( ; j <= 0x14; j++)
2507 if ((j % 0x04) == 0)
2511 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2513 if (isprint((int) ((unsigned char) *p)) != 0)
2522 textlist[i]=(char *) NULL;
2527 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2531 % S t r i n g T o S t r i n g I n f o %
2535 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2537 % StringToStringInfo() converts a string to a StringInfo type.
2539 % The format of the StringToStringInfo method is:
2541 % StringInfo *StringToStringInfo(const char *string)
2543 % A description of each parameter follows:
2545 % o string: The string.
2548 MagickExport StringInfo *StringToStringInfo(const char *string)
2553 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2554 assert(string != (const char *) NULL);
2555 string_info=AcquireStringInfo(strlen(string));
2556 SetStringInfoDatum(string_info,(const unsigned char *) string);
2557 return(string_info);
2561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2565 % S t r i p S t r i n g %
2569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2571 % StripString() strips any whitespace or quotes from the beginning and end of
2572 % a string of characters.
2574 % The format of the StripString method is:
2576 % void StripString(char *message)
2578 % A description of each parameter follows:
2580 % o message: Specifies an array of characters.
2583 MagickExport void StripString(char *message)
2592 assert(message != (char *) NULL);
2593 if (*message == '\0')
2595 length=strlen(message);
2597 while (isspace((int) ((unsigned char) *p)) != 0)
2599 if ((*p == '\'') || (*p == '"'))
2602 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2605 if ((*q == '\'') || (*q == '"'))
2607 (void) memmove(message,p,(size_t) (q-p+1));
2608 message[q-p+1]='\0';
2609 for (p=message; *p != '\0'; p++)
2615 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2619 % S u b s t i t u t e S t r i n g %
2623 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2625 % SubstituteString() performs string substitution on a string, replacing the
2626 % string with the substituted version. Buffer must be allocated from the heap.
2627 % If the string is matched and status, MagickTrue is returned otherwise
2630 % The format of the SubstituteString method is:
2632 % MagickBooleanType SubstituteString(char **string,const char *search,
2633 % const char *replace)
2635 % A description of each parameter follows:
2637 % o string: the string to perform replacements on; replaced with new
2638 % allocation if a replacement is made.
2640 % o search: search for this string.
2642 % o replace: replace any matches with this string.
2645 MagickExport MagickBooleanType SubstituteString(char **string,
2646 const char *search,const char *replace)
2665 for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2667 if (search_extent == 0)
2668 search_extent=strlen(search);
2669 if (strncmp(p,search,search_extent) != 0)
2675 if (replace_extent == 0)
2676 replace_extent=strlen(replace);
2677 if (replace_extent > search_extent)
2680 Make room for the replacement string.
2682 offset=(ssize_t) (p-(*string));
2683 extent=strlen(*string)+replace_extent-search_extent+1;
2684 *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2686 if (*string == (char *) NULL)
2687 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2693 if (search_extent != replace_extent)
2694 (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2695 strlen(p+search_extent)+1);
2696 (void) CopyMagickMemory(p,replace,replace_extent);
2697 p+=replace_extent-1;