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() returns an new extented string, containing a clone of the
105 % An extended string is the string length, plus an extra MaxTextExtent space
106 % to allow for the string to be activally worked on.
108 % The returned string shoud be freed using DestoryString().
110 % The format of the AcquireString method is:
112 % char *AcquireString(const char *source)
114 % A description of each parameter follows:
116 % o source: A character string.
119 MagickExport char *AcquireString(const char *source)
128 if (source != (char *) NULL)
129 length+=strlen(source);
130 if (~length < MaxTextExtent)
131 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
132 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
133 sizeof(*destination));
134 if (destination == (char *) NULL)
135 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
137 if (source != (char *) NULL)
138 (void) memcpy(destination,source,length*sizeof(*destination));
139 destination[length]='\0';
144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 % A c q u i r e S t r i n g I n f o %
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154 % AcquireStringInfo() allocates the StringInfo structure.
156 % The format of the AcquireStringInfo method is:
158 % StringInfo *AcquireStringInfo(const size_t length)
160 % A description of each parameter follows:
162 % o length: the string length.
165 MagickExport StringInfo *AcquireStringInfo(const size_t length)
170 string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
171 if (string_info == (StringInfo *) NULL)
172 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
173 (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
174 string_info->signature=MagickSignature;
175 string_info->length=length;
176 if (string_info->length != 0)
178 string_info->datum=(unsigned char *) NULL;
179 if (~string_info->length >= (MaxTextExtent-1))
180 string_info->datum=(unsigned char *) AcquireQuantumMemory(
181 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
182 if (string_info->datum == (unsigned char *) NULL)
183 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
189 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
193 % B l o b T o S t r i n g I n f o %
197 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
199 % BlobToStringInfo() returns the contents of a blob as a StringInfo structure
200 % with MaxTextExtent extra space.
202 % The format of the BlobToStringInfo method is:
204 % StringInfo *BlobToStringInfo(const void *blob,const size_t length)
206 % A description of each parameter follows:
210 % o length: the length of the blob.
213 MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
218 string_info=AcquireStringInfo(0);
219 string_info->length=length;
220 if (~string_info->length >= (MaxTextExtent-1))
221 string_info->datum=(unsigned char *) AcquireQuantumMemory(
222 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
223 if (string_info->datum == (unsigned char *) NULL)
225 string_info=DestroyStringInfo(string_info);
226 return((StringInfo *) NULL);
228 if (blob != (const void *) NULL)
229 (void) memcpy(string_info->datum,blob,length);
234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
238 % C l o n e S t r i n g %
242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
244 % CloneString() replaces or frees the destination string to make it
245 % a clone of the input string plus MaxTextExtent more space so the string may
248 % If source is a NULL pointer the destination string will be freed and set to
249 % a NULL pointer. A pointer to the stored in the destination is also returned.
251 % When finished the non-NULL string should be freed using DestoryString()
252 % or using CloneString() with a NULL pointed for the source.
254 % The format of the CloneString method is:
256 % char *CloneString(char **destination,const char *source)
258 % A description of each parameter follows:
260 % o destination: A pointer to a character string.
262 % o source: A character string.
265 MagickExport char *CloneString(char **destination,const char *source)
270 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
271 assert(destination != (char **) NULL);
272 if (source == (const char *) NULL)
274 if (*destination != (char *) NULL)
275 *destination=DestroyString(*destination);
276 return(*destination);
278 if (*destination == (char *) NULL)
280 *destination=AcquireString(source);
281 return(*destination);
283 length=strlen(source);
284 if (~length < MaxTextExtent)
285 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
286 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
287 sizeof(**destination));
288 if (*destination == (char *) NULL)
289 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
291 (void) memcpy(*destination,source,length*sizeof(**destination));
292 (*destination)[length]='\0';
293 return(*destination);
297 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
301 % C l o n e S t r i n g I n f o %
305 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
307 % CloneStringInfo() clones a copy of the StringInfo structure.
309 % The format of the CloneStringInfo method is:
311 % StringInfo *CloneStringInfo(const StringInfo *string_info)
313 % A description of each parameter follows:
315 % o string_info: the string info.
318 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
323 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
324 assert(string_info != (StringInfo *) NULL);
325 assert(string_info->signature == MagickSignature);
326 clone_info=AcquireStringInfo(string_info->length);
327 if (string_info->length != 0)
328 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
333 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
337 % C o m p a r e S t r i n g I n f o %
341 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
343 % CompareStringInfo() compares the two datums target and source. It returns
344 % an integer less than, equal to, or greater than zero if target is found,
345 % respectively, to be less than, to match, or be greater than source.
347 % The format of the CompareStringInfo method is:
349 % int CompareStringInfo(const StringInfo *target,const StringInfo *source)
351 % A description of each parameter follows:
353 % o target: the target string.
355 % o source: the source string.
359 static inline size_t MagickMin(const size_t x,const size_t y)
366 MagickExport int CompareStringInfo(const StringInfo *target,
367 const StringInfo *source)
372 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
373 assert(target != (StringInfo *) NULL);
374 assert(target->signature == MagickSignature);
375 assert(source != (StringInfo *) NULL);
376 assert(source->signature == MagickSignature);
377 status=memcmp(target->datum,source->datum,MagickMin(target->length,
381 if (target->length == source->length)
383 return(target->length < source->length ? -1 : 1);
387 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
391 % C o n c a t e n a t e M a g i c k S t r i n g %
395 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
397 % ConcatenateMagickString() concatenates the source string to the destination
398 % string. The destination buffer is always null-terminated even if the
399 % string must be truncated.
401 % The format of the ConcatenateMagickString method is:
403 % size_t ConcatenateMagickString(char *destination,const char *source,
404 % const size_t length)
406 % A description of each parameter follows:
408 % o destination: the destination string.
410 % o source: the source string.
412 % o length: the length of the destination string.
415 MagickExport size_t ConcatenateMagickString(char *destination,
416 const char *source,const size_t length)
430 assert(destination != (char *) NULL);
431 assert(source != (const char *) NULL);
436 while ((i-- != 0) && (*q != '\0'))
438 count=(size_t) (q-destination);
441 return(count+strlen(p));
452 return(count+(p-source));
456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
460 % C o n c a t e n a t e S t r i n g %
464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
466 % ConcatenateString() appends a copy of string source, including the
467 % terminating null character, to the end of string destination.
469 % The format of the ConcatenateString method is:
471 % MagickBooleanType ConcatenateString(char **destination,
472 % const char *source)
474 % A description of each parameter follows:
476 % o destination: A pointer to a character string.
478 % o source: A character string.
481 MagickExport MagickBooleanType ConcatenateString(char **destination,
489 assert(destination != (char **) NULL);
490 if (source == (const char *) NULL)
492 if (*destination == (char *) NULL)
494 *destination=AcquireString(source);
497 destination_length=strlen(*destination);
498 source_length=strlen(source);
499 length=destination_length;
500 if (~length < source_length)
501 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
502 length+=source_length;
503 if (~length < MaxTextExtent)
504 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
505 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
506 sizeof(**destination));
507 if (*destination == (char *) NULL)
508 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
509 if (source_length != 0)
510 (void) memcpy((*destination)+destination_length,source,source_length);
511 (*destination)[length]='\0';
516 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
520 % C o n c a t e n a t e S t r i n g I n f o %
524 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
526 % ConcatenateStringInfo() concatenates the source string to the destination
529 % The format of the ConcatenateStringInfo method is:
531 % void ConcatenateStringInfo(StringInfo *string_info,
532 % const StringInfo *source)
534 % A description of each parameter follows:
536 % o string_info: the string info.
538 % o source: the source string.
541 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
542 const StringInfo *source)
547 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
548 assert(string_info != (StringInfo *) NULL);
549 assert(string_info->signature == MagickSignature);
550 assert(source != (const StringInfo *) NULL);
551 length=string_info->length;
552 if (~length < source->length)
553 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
554 SetStringInfoLength(string_info,length+source->length);
555 (void) memcpy(string_info->datum+length,source->datum,source->length);
559 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
563 % 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 %
567 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
569 % ConfigureFileToStringInfo() returns the contents of a configure file as a
572 % The format of the ConfigureFileToStringInfo method is:
574 % StringInfo *ConfigureFileToStringInfo(const char *filename)
575 % ExceptionInfo *exception)
577 % A description of each parameter follows:
579 % o filename: the filename.
582 MagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
602 assert(filename != (const char *) NULL);
603 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
605 return((StringInfo *) NULL);
606 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
607 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
610 return((StringInfo *) NULL);
612 length=(size_t) offset;
613 string=(char *) NULL;
614 if (~length >= (MaxTextExtent-1))
615 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
616 if (string == (char *) NULL)
619 return((StringInfo *) NULL);
621 map=MapBlob(file,ReadMode,0,length);
622 if (map != (void *) NULL)
624 (void) memcpy(string,map,length);
625 (void) UnmapBlob(map,length);
635 (void) lseek(file,0,SEEK_SET);
636 for (i=0; i < length; i+=count)
638 count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
650 string=DestroyString(string);
651 return((StringInfo *) NULL);
656 string_info=AcquireStringInfo(0);
657 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
658 string_info->length=length;
659 string_info->datum=(unsigned char *) string;
664 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
668 % C o n s t a n t S t r i n g %
672 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
674 % ConstantString() allocates exactly the needed memory for a string and
675 % copies the source string to that memory location. A NULL string pointer
676 % will allocate an empty string containing just the NUL character.
678 % When finished the string should be freed using DestoryString()
680 % The format of the ConstantString method is:
682 % char *ConstantString(const char *source)
684 % A description of each parameter follows:
686 % o source: A character string.
689 MagickExport char *ConstantString(const char *source)
698 if (source != (char *) NULL)
699 length+=strlen(source);
700 destination=(char *) NULL;
702 destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
703 if (destination == (char *) NULL)
704 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
706 if (source != (char *) NULL)
707 (void) memcpy(destination,source,length*sizeof(*destination));
708 destination[length]='\0';
713 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
717 % C o p y M a g i c k S t r i n g %
721 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
723 % CopyMagickString() copies the source string to the destination string, with
724 % out exceeding the given pre-declared length.
726 % The destination buffer is always null-terminated even if the string must be
727 % truncated. The return value is the minimum of the source string length or
728 % the length parameter.
730 % The format of the CopyMagickString method is:
732 % size_t CopyMagickString(const char *destination,char *source,
733 % const size_t length)
735 % A description of each parameter follows:
737 % o destination: the destination string.
739 % o source: the source string.
741 % o length: the length of the destination string.
744 MagickExport size_t CopyMagickString(char *destination,const char *source,
756 if (source == (const char *) NULL)
760 for (n=length; n > 4; n-=4)
764 return((size_t) (p-source-1));
768 return((size_t) (p-source-1));
772 return((size_t) (p-source-1));
776 return((size_t) (p-source-1));
780 for (n--; n != 0; n--)
784 return((size_t) (p-source-1));
789 return((size_t) (p-source-1));
793 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
797 % D e s t r o y S t r i n g %
801 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
803 % DestroyString() destroys memory associated with a string.
805 % The format of the DestroyString method is:
807 % char *DestroyString(char *string)
809 % A description of each parameter follows:
811 % o string: the string.
814 MagickExport char *DestroyString(char *string)
816 return((char *) RelinquishMagickMemory(string));
820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
824 % D e s t r o y S t r i n g I n f o %
828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
830 % DestroyStringInfo() destroys memory associated with the StringInfo structure.
832 % The format of the DestroyStringInfo method is:
834 % StringInfo *DestroyStringInfo(StringInfo *string_info)
836 % A description of each parameter follows:
838 % o string_info: the string info.
841 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
843 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
844 assert(string_info != (StringInfo *) NULL);
845 assert(string_info->signature == MagickSignature);
846 if (string_info->datum != (unsigned char *) NULL)
847 string_info->datum=(unsigned char *) RelinquishMagickMemory(
849 string_info->signature=(~MagickSignature);
850 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
859 % D e s t r o y S t r i n g L i s t %
863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
865 % DestroyStringList() zeros memory associated with a string list.
867 % The format of the DestroyStringList method is:
869 % char **DestroyStringList(char **list)
871 % A description of each parameter follows:
873 % o list: the string list.
876 MagickExport char **DestroyStringList(char **list)
881 assert(list != (char **) NULL);
882 for (i=0; list[i] != (char *) NULL; i++)
883 list[i]=DestroyString(list[i]);
884 list=(char **) RelinquishMagickMemory(list);
889 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
893 % E s c a p e S t r i n g %
897 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
899 % EscapeString() allocates memory for a backslash-escaped version of a
900 % source text string, copies the escaped version of the text to that
901 % memory location while adding backslash characters, and returns the
904 % The format of the EscapeString method is:
906 % char *EscapeString(const char *source,const char escape)
908 % A description of each parameter follows:
910 % o allocate_string: Method EscapeString returns the escaped string.
912 % o source: A character string.
914 % o escape: the quoted string termination character to escape (e.g. '"').
917 MagickExport char *EscapeString(const char *source,const char escape)
931 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
932 assert(source != (const char *) NULL);
933 length=strlen(source);
934 for (p=source; *p != '\0'; p++)
935 if ((*p == '\\') || (*p == escape))
938 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
941 destination=(char *) NULL;
942 if (~length >= (MaxTextExtent-1))
943 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
944 sizeof(*destination));
945 if (destination == (char *) NULL)
946 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
948 if (source != (char *) NULL)
951 for (p=source; *p != '\0'; p++)
953 if ((*p == '\\') || (*p == escape))
963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
967 % F i l e T o S t r i n g %
971 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
973 % FileToString() returns the contents of a file as a string.
975 % The format of the FileToString method is:
977 % char *FileToString(const char *filename,const size_t extent,
978 % ExceptionInfo *exception)
980 % A description of each parameter follows:
982 % o filename: the filename.
984 % o extent: Maximum length of the string.
986 % o exception: return any errors or warnings in this structure.
989 MagickExport char *FileToString(const char *filename,const size_t extent,
990 ExceptionInfo *exception)
995 assert(filename != (const char *) NULL);
996 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
997 assert(exception != (ExceptionInfo *) NULL);
998 return((char *) FileToBlob(filename,extent,&length,exception));
1002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1006 % F i l e T o S t r i n g I n f o %
1010 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1012 % FileToStringInfo() returns the contents of a file as a string.
1014 % The format of the FileToStringInfo method is:
1016 % StringInfo *FileToStringInfo(const char *filename,const size_t extent,
1017 % ExceptionInfo *exception)
1019 % A description of each parameter follows:
1021 % o filename: the filename.
1023 % o extent: Maximum length of the string.
1025 % o exception: return any errors or warnings in this structure.
1028 MagickExport StringInfo *FileToStringInfo(const char *filename,
1029 const size_t extent,ExceptionInfo *exception)
1034 assert(filename != (const char *) NULL);
1035 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1036 assert(exception != (ExceptionInfo *) NULL);
1037 string_info=AcquireStringInfo(0);
1038 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1039 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1040 if (string_info->datum == (unsigned char *) NULL)
1042 string_info=DestroyStringInfo(string_info);
1043 return((StringInfo *) NULL);
1045 return(string_info);
1049 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1053 % F o r m a t M a g i c k S i z e %
1057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1059 % FormatMagickSize() converts a size to a human readable format, for example,
1060 % 14k, 234m, 2.7g, or 3.0t. Scaling is done by repetitively dividing by
1063 % The format of the FormatMagickSize method is:
1065 % ssize_t FormatMagickSize(const MagickSizeType size,char *format)
1067 % A description of each parameter follows:
1069 % o size: convert this size to a human readable format.
1071 % o bi: use power of two rather than power of ten.
1073 % o format: human readable format.
1076 MagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1077 const MagickBooleanType bi,char *format)
1096 "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1098 *traditional_units[] =
1100 "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1104 units=traditional_units;
1105 if (bi != MagickFalse)
1110 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1111 length=(double) ((MagickOffsetType) size);
1113 length=(double) size;
1115 for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1117 for (j=2; j < 12; j++)
1119 count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
1121 if (strchr(format,'+') == (char *) NULL)
1128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1132 % F o r m a t M a g i c k T i m e %
1136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1138 % FormatMagickTime() returns the specified time in the Internet date/time
1139 % format and the length of the timestamp.
1141 % The format of the FormatMagickTime method is:
1143 % ssize_t FormatMagickTime(const time_t time,const size_t length,
1146 % A description of each parameter follows.
1148 % o time: the time since the Epoch (00:00:00 UTC, January 1, 1970),
1149 % measured in seconds.
1151 % o length: the maximum length of the string.
1153 % o timestamp: Return the Internet date/time here.
1156 MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1169 assert(timestamp != (char *) NULL);
1170 (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1171 (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1172 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1173 (void) localtime_r(&time,&local_time);
1179 my_time=localtime(&time);
1180 if (my_time != (struct tm *) NULL)
1181 (void) memcpy(&local_time,my_time,sizeof(local_time));
1184 #if defined(MAGICKCORE_HAVE_GMTIME_R)
1185 (void) gmtime_r(&time,&gm_time);
1191 my_time=gmtime(&time);
1192 if (my_time != (struct tm *) NULL)
1193 (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1196 timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1197 local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1198 gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1199 (local_time.tm_yday-gm_time.tm_yday)));
1200 count=FormatLocaleString(timestamp,length,
1201 "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1202 local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1203 local_time.tm_min,local_time.tm_sec,(long) timezone);
1208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1212 % G e t E n v i r o n m e n t V a l u e %
1216 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1218 % GetEnvironmentValue() returns the environment string that matches the
1221 % The format of the GetEnvironmentValue method is:
1223 % char *GetEnvironmentValue(const char *name)
1225 % A description of each parameter follows:
1227 % o name: the environment name.
1230 MagickExport char *GetEnvironmentValue(const char *name)
1235 environment=getenv(name);
1236 if (environment == (const char *) NULL)
1237 return((char *) NULL);
1238 return(ConstantString(environment));
1242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1246 % G e t S t r i n g I n f o D a t u m %
1250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1252 % GetStringInfoDatum() returns the datum associated with the string.
1254 % The format of the GetStringInfoDatum method is:
1256 % unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1258 % A description of each parameter follows:
1260 % o string_info: the string info.
1263 MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1265 assert(string_info != (StringInfo *) NULL);
1266 assert(string_info->signature == MagickSignature);
1267 return(string_info->datum);
1271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1275 % G e t S t r i n g I n f o L e n g t h %
1279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1281 % GetStringInfoLength() returns the string length.
1283 % The format of the GetStringInfoLength method is:
1285 % size_t GetStringInfoLength(const StringInfo *string_info)
1287 % A description of each parameter follows:
1289 % o string_info: the string info.
1292 MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1294 assert(string_info != (StringInfo *) NULL);
1295 assert(string_info->signature == MagickSignature);
1296 return(string_info->length);
1300 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1304 % G e t S t r i n g I n f o P a t h %
1308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1310 % GetStringInfoPath() returns the path associated with the string.
1312 % The format of the GetStringInfoPath method is:
1314 % const char *GetStringInfoPath(const StringInfo *string_info)
1316 % A description of each parameter follows:
1318 % o string_info: the string info.
1321 MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1323 assert(string_info != (StringInfo *) NULL);
1324 assert(string_info->signature == MagickSignature);
1325 return(string_info->path);
1329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1333 + I n t e r p r e t S i P r e f i x V a l u e %
1337 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1339 % InterpretSiPrefixValue() converts the initial portion of the string to a
1340 % double representation. It also recognizes SI prefixes (e.g. B, KB, MiB,
1343 % The format of the InterpretSiPrefixValue method is:
1345 % double InterpretSiPrefixValue(const char *value,char **sentinal)
1347 % A description of each parameter follows:
1349 % o value: the string value.
1351 % o sentinal: if sentinal is not NULL, return a pointer to the character
1352 % after the last character used in the conversion.
1355 MagickExport double InterpretSiPrefixValue(const char *restrict string,
1356 char **restrict sentinal)
1364 value=InterpretLocaleValue(string,&q);
1367 if ((*q >= 'E') && (*q <= 'z'))
1372 switch ((int) ((unsigned char) *q))
1374 case 'y': e=(-24.0); break;
1375 case 'z': e=(-21.0); break;
1376 case 'a': e=(-18.0); break;
1377 case 'f': e=(-15.0); break;
1378 case 'p': e=(-12.0); break;
1379 case 'n': e=(-9.0); break;
1380 case 'u': e=(-6.0); break;
1381 case 'm': e=(-3.0); break;
1382 case 'c': e=(-2.0); break;
1383 case 'd': e=(-1.0); break;
1384 case 'h': e=2.0; break;
1385 case 'k': e=3.0; break;
1386 case 'K': e=3.0; break;
1387 case 'M': e=6.0; break;
1388 case 'G': e=9.0; break;
1389 case 'T': e=12.0; break;
1390 case 'P': e=15.0; break;
1391 case 'E': e=18.0; break;
1392 case 'Z': e=21.0; break;
1393 case 'Y': e=24.0; break;
1394 default: e=0.0; break;
1396 if (e >= MagickEpsilon)
1400 value*=pow(2.0,e/0.3);
1413 if (sentinal != (char **) NULL)
1419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1423 % I s S t r i n g T r u e %
1427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1429 % IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
1430 % "1". Any other string or undefined returns MagickFalse.
1432 % Typically this is used to look at strings (options or artifacts) which
1433 % has a default value of "false", when not defined.
1435 % The format of the IsStringTrue method is:
1437 % MagickBooleanType IsStringTrue(const char *value)
1439 % A description of each parameter follows:
1441 % o value: Specifies a pointer to a character array.
1444 MagickExport MagickBooleanType IsStringTrue(const char *value)
1446 if (value == (const char *) NULL)
1447 return(MagickFalse);
1448 if (LocaleCompare(value,"true") == 0)
1450 if (LocaleCompare(value,"on") == 0)
1452 if (LocaleCompare(value,"yes") == 0)
1454 if (LocaleCompare(value,"1") == 0)
1456 return(MagickFalse);
1460 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1464 % I s S t r i n g N o t F a l s e %
1468 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1470 % IsStringNotFalse() returns MagickTrue, unless the string specifically
1471 % has a value that makes this false. that is if it has a value of
1472 % "false", "off", "no" or "0".
1474 % Typically this is used to look at strings (options or artifacts) which
1475 % has a default value of "true", when it has not been defined.
1477 % The format of the IsStringNotFalse method is:
1479 % MagickBooleanType IsStringNotFalse(const char *value)
1481 % A description of each parameter follows:
1483 % o value: Specifies a pointer to a character array.
1486 MagickExport MagickBooleanType IsStringNotFalse(const char *value)
1488 if (value == (const char *) NULL)
1490 if (LocaleCompare(value,"false") == 0)
1491 return(MagickFalse);
1492 if (LocaleCompare(value,"off") == 0)
1493 return(MagickFalse);
1494 if (LocaleCompare(value,"no") == 0)
1495 return(MagickFalse);
1496 if (LocaleCompare(value,"0") == 0)
1497 return(MagickFalse);
1502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1506 % L o c a l e C o m p a r e %
1510 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1512 % LocaleCompare() performs a case-insensitive comparison of two strings
1513 % byte-by-byte, according to the ordering of the current locale encoding.
1514 % LocaleCompare returns an integer greater than, equal to, or less than 0,
1515 % if the string pointed to by p is greater than, equal to, or less than the
1516 % string pointed to by q respectively. The sign of a non-zero return value
1517 % is determined by the sign of the difference between the values of the first
1518 % pair of bytes that differ in the strings being compared.
1520 % The format of the LocaleCompare method is:
1522 % int LocaleCompare(const char *p,const char *q)
1524 % A description of each parameter follows:
1526 % o p: A pointer to a character string.
1528 % o q: A pointer to a character string to compare to p.
1531 MagickExport int LocaleCompare(const char *p,const char *q)
1533 if ((p == (char *) NULL) && (q == (char *) NULL))
1535 if (p == (char *) NULL)
1537 if (q == (char *) NULL)
1539 #if defined(MAGICKCORE_HAVE_STRCASECMP)
1540 return(strcasecmp(p,q));
1549 c=(int) *((unsigned char *) p);
1550 d=(int) *((unsigned char *) q);
1551 if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1556 return(AsciiMap[c]-(int) AsciiMap[d]);
1562 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1566 % L o c a l e L o w e r %
1570 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1572 % LocaleLower() transforms all of the characters in the supplied
1573 % null-terminated string, changing all uppercase letters to lowercase.
1575 % The format of the LocaleLower method is:
1577 % void LocaleLower(char *string)
1579 % A description of each parameter follows:
1581 % o string: A pointer to the string to convert to lower-case Locale.
1584 MagickExport void LocaleLower(char *string)
1589 assert(string != (char *) NULL);
1590 for (q=string; *q != '\0'; q++)
1591 *q=(char) tolower((int) *q);
1595 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1599 % L o c a l e N C o m p a r e %
1603 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1605 % LocaleNCompare() performs a case-insensitive comparison of two strings
1606 % byte-by-byte, according to the ordering of the current locale encoding.
1608 % LocaleNCompare returns an integer greater than, equal to, or less than 0,
1609 % if the string pointed to by p is greater than, equal to, or less than the
1610 % string pointed to by q respectively. The sign of a non-zero return value
1611 % is determined by the sign of the difference between the values of the first
1612 % pair of bytes that differ in the strings being compared.
1614 % The LocaleNCompare method makes the same comparison as LocaleCompare but
1615 % looks at a maximum of n bytes. Bytes following a null byte are not
1618 % The format of the LocaleNCompare method is:
1620 % int LocaleNCompare(const char *p,const char *q,const size_t n)
1622 % A description of each parameter follows:
1624 % o p: A pointer to a character string.
1626 % o q: A pointer to a character string to compare to p.
1628 % o length: the number of characters to compare in strings p and q.
1631 MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1633 if ((p == (char *) NULL) && (q == (char *) NULL))
1635 if (p == (char *) NULL)
1637 if (q == (char *) NULL)
1639 #if defined(MAGICKCORE_HAVE_STRNCASECMP)
1640 return(strncasecmp(p,q,length));
1650 for (i=length; i != 0; i--)
1652 c=(int) *((unsigned char *) p);
1653 d=(int) *((unsigned char *) q);
1654 if (AsciiMap[c] != AsciiMap[d])
1655 return(AsciiMap[c]-(int) AsciiMap[d]);
1667 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1671 % L o c a l e U p p e r %
1675 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1677 % LocaleUpper() transforms all of the characters in the supplied
1678 % null-terminated string, changing all lowercase letters to uppercase.
1680 % The format of the LocaleUpper method is:
1682 % void LocaleUpper(char *string)
1684 % A description of each parameter follows:
1686 % o string: A pointer to the string to convert to upper-case Locale.
1689 MagickExport void LocaleUpper(char *string)
1694 assert(string != (char *) NULL);
1695 for (q=string; *q != '\0'; q++)
1696 *q=(char) toupper((int) *q);
1700 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1704 % P r i n t S t r i n g I n f o %
1708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1710 % PrintStringInfo() prints the string.
1712 % The format of the PrintStringInfo method is:
1714 % void PrintStringInfo(FILE *file,const char *id,
1715 % const StringInfo *string_info)
1717 % A description of each parameter follows:
1719 % o file: the file, typically stdout.
1721 % o id: the string id.
1723 % o string_info: the string info.
1726 MagickExport void PrintStringInfo(FILE *file,const char *id,
1727 const StringInfo *string_info)
1736 assert(id != (const char *) NULL);
1737 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
1738 assert(string_info != (StringInfo *) NULL);
1739 assert(string_info->signature == MagickSignature);
1740 p=(char *) string_info->datum;
1741 for (i=0; i < string_info->length; i++)
1743 if (((int) ((unsigned char) *p) < 32) &&
1744 (isspace((int) ((unsigned char) *p)) == 0))
1748 if (i == string_info->length)
1750 for (i=0; i < string_info->length; i++)
1751 (void) fputc(string_info->datum[i],file);
1752 (void) fputc('\n',file);
1756 Convert string to a HEX list.
1758 p=(char *) string_info->datum;
1759 for (i=0; i < string_info->length; i+=0x14)
1761 (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1762 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1764 (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1765 if ((j % 0x04) == 0)
1766 (void) fputc(' ',file);
1768 for ( ; j <= 0x14; j++)
1770 (void) fputc(' ',file);
1771 (void) fputc(' ',file);
1772 if ((j % 0x04) == 0)
1773 (void) fputc(' ',file);
1775 (void) fputc(' ',file);
1776 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1778 if (isprint((int) ((unsigned char) *p)) != 0)
1779 (void) fputc(*p,file);
1781 (void) fputc('-',file);
1784 (void) fputc('\n',file);
1789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1793 % R e s e t S t r i n g I n f o %
1797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1799 % ResetStringInfo() reset the string to all null bytes.
1801 % The format of the ResetStringInfo method is:
1803 % void ResetStringInfo(StringInfo *string_info)
1805 % A description of each parameter follows:
1807 % o string_info: the string info.
1810 MagickExport void ResetStringInfo(StringInfo *string_info)
1812 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1813 assert(string_info != (StringInfo *) NULL);
1814 assert(string_info->signature == MagickSignature);
1815 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1823 % S e t S t r i n g I n f o %
1827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1829 % SetStringInfo() copies the source string to the destination string.
1831 % The format of the SetStringInfo method is:
1833 % void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1835 % A description of each parameter follows:
1837 % o string_info: the string info.
1839 % o source: the source string.
1842 MagickExport void SetStringInfo(StringInfo *string_info,
1843 const StringInfo *source)
1845 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1846 assert(string_info != (StringInfo *) NULL);
1847 assert(string_info->signature == MagickSignature);
1848 assert(source != (StringInfo *) NULL);
1849 assert(source->signature == MagickSignature);
1850 if (string_info->length == 0)
1852 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1853 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1858 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1862 % S e t S t r i n g I n f o D a t u m %
1866 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1868 % SetStringInfoDatum() copies bytes from the source string for the length of
1869 % the destination string.
1871 % The format of the SetStringInfoDatum method is:
1873 % void SetStringInfoDatum(StringInfo *string_info,
1874 % const unsigned char *source)
1876 % A description of each parameter follows:
1878 % o string_info: the string info.
1880 % o source: the source string.
1883 MagickExport void SetStringInfoDatum(StringInfo *string_info,
1884 const unsigned char *source)
1886 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1887 assert(string_info != (StringInfo *) NULL);
1888 assert(string_info->signature == MagickSignature);
1889 if (string_info->length != 0)
1890 (void) memcpy(string_info->datum,source,string_info->length);
1894 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1898 % S e t S t r i n g I n f o L e n g t h %
1902 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1904 % SetStringInfoLength() set the string length to the specified value.
1906 % The format of the SetStringInfoLength method is:
1908 % void SetStringInfoLength(StringInfo *string_info,const size_t length)
1910 % A description of each parameter follows:
1912 % o string_info: the string info.
1914 % o length: the string length.
1917 MagickExport void SetStringInfoLength(StringInfo *string_info,
1918 const size_t length)
1920 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1921 assert(string_info != (StringInfo *) NULL);
1922 assert(string_info->signature == MagickSignature);
1923 if (~length < MaxTextExtent)
1924 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1925 string_info->length=length;
1926 if (string_info->datum == (unsigned char *) NULL)
1927 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1928 MaxTextExtent,sizeof(*string_info->datum));
1930 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1931 length+MaxTextExtent,sizeof(*string_info->datum));
1932 if (string_info->datum == (unsigned char *) NULL)
1933 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1937 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1941 % S e t S t r i n g I n f o D a t u m %
1945 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1947 % SetStringInfoPath() sets the path associated with the string.
1949 % The format of the SetStringInfoPath method is:
1951 % void SetStringInfoPath(StringInfo *string_info,const char *path)
1953 % A description of each parameter follows:
1955 % o string_info: the string info.
1960 MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1962 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1963 assert(string_info != (StringInfo *) NULL);
1964 assert(string_info->signature == MagickSignature);
1965 assert(path != (const char *) NULL);
1966 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1970 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1974 % S p l i t S t r i n g I n f o %
1978 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1980 % SplitStringInfo() splits a string into two and returns it.
1982 % The format of the SplitStringInfo method is:
1984 % StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1986 % A description of each parameter follows:
1988 % o string_info: the string info.
1991 MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1992 const size_t offset)
1997 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1998 assert(string_info != (StringInfo *) NULL);
1999 assert(string_info->signature == MagickSignature);
2000 if (offset > string_info->length)
2001 return((StringInfo *) NULL);
2002 split_info=AcquireStringInfo(offset);
2003 SetStringInfo(split_info,string_info);
2004 (void) memmove(string_info->datum,string_info->datum+offset,
2005 string_info->length-offset+MaxTextExtent);
2006 SetStringInfoLength(string_info,string_info->length-offset);
2011 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2015 % S t r i n g I n f o T o S t r i n g %
2019 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2021 % StringInfoToString() converts a string info string to a C string.
2023 % The format of the StringInfoToString method is:
2025 % char *StringInfoToString(const StringInfo *string_info)
2027 % A description of each parameter follows:
2029 % o string_info: the string.
2032 MagickExport char *StringInfoToString(const StringInfo *string_info)
2040 string=(char *) NULL;
2041 length=string_info->length;
2042 if (~length >= (MaxTextExtent-1))
2043 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
2044 if (string == (char *) NULL)
2045 return((char *) NULL);
2046 (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
2047 string[length]='\0';
2052 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2056 % S t r i n g I n f o T o H e x S t r i n g %
2060 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2062 % StringInfoToHexString() converts a string info string to a C string.
2064 % The format of the StringInfoToHexString method is:
2066 % char *StringInfoToHexString(const StringInfo *string_info)
2068 % A description of each parameter follows:
2070 % o string_info: the string.
2073 MagickExport char *StringInfoToHexString(const StringInfo *string_info)
2078 register const unsigned char
2084 register unsigned char
2093 length=string_info->length;
2094 if (~length < MaxTextExtent)
2095 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2096 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2097 if (string == (char *) NULL)
2098 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2115 p=string_info->datum;
2116 q=(unsigned char *) string;
2117 for (i=0; i < (ssize_t) string_info->length; i++)
2119 *q++=hex_digits[(*p >> 4) & 0x0f];
2120 *q++=hex_digits[*p & 0x0f];
2128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2132 % S t r i n g T o A r g v %
2136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2138 % StringToArgv() converts a text string into command line arguments.
2139 % The 'argv' array of arguments, is returned while the number of arguments
2140 % is returned via the provided integer variable pointer.
2142 % Simple 'word' tokenizer, which allows for each word to be optionally
2143 % quoted. However it will not allow use of partial quotes, or escape
2146 % The format of the StringToArgv method is:
2148 % char **StringToArgv(const char *text,int *argc)
2150 % A description of each parameter follows:
2152 % o argv: Method StringToArgv returns the string list unless an error
2153 % occurs, otherwise NULL.
2155 % o text: Specifies the string to segment into a list.
2157 % o argc: This integer pointer returns the number of arguments in the
2161 MagickExport char **StringToArgv(const char *text,int *argc)
2174 if (text == (char *) NULL)
2175 return((char **) NULL);
2177 Determine the number of arguments.
2179 for (p=text; *p != '\0'; )
2181 while (isspace((int) ((unsigned char) *p)) != 0)
2187 for (p++; (*p != '"') && (*p != '\0'); p++) ;
2189 for (p++; (*p != '\'') && (*p != '\0'); p++) ;
2190 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2194 argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
2195 if (argv == (char **) NULL)
2196 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
2198 Convert string to an ASCII list.
2200 argv[0]=AcquireString("magick");
2202 for (i=1; i < (ssize_t) *argc; i++)
2204 while (isspace((int) ((unsigned char) *p)) != 0)
2210 for (q++; (*q != '"') && (*q != '\0'); q++) ;
2216 for (q++; (*q != '\'') && (*q != '\0'); q++) ;
2219 while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
2221 argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2223 if (argv[i] == (char *) NULL)
2225 for (i--; i >= 0; i--)
2226 argv[i]=DestroyString(argv[i]);
2227 argv=(char **) RelinquishMagickMemory(argv);
2228 ThrowFatalException(ResourceLimitFatalError,
2229 "UnableToConvertStringToARGV");
2231 (void) memcpy(argv[i],p,(size_t) (q-p));
2234 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2237 argv[i]=(char *) NULL;
2242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2246 % S t r i n g T o A r r a y O f D o u b l e s %
2250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2252 % StringToArrayOfDoubles() converts a string of space or comma seperated
2253 % numbers into array of floating point numbers (doubles). Any number that
2254 % failes to parse properly will produce a syntax error. As will two commas
2255 % without a number between them. However a final comma at the end will
2256 % not be regarded as an error so as to simplify automatic list generation.
2258 % A NULL value is returned on syntax or memory errors.
2260 % Use RelinquishMagickMemory() to free returned array when finished.
2262 % The format of the StringToArrayOfDoubles method is:
2264 % double *StringToArrayOfDoubles(const char *string,size_t *count,
2265 % ExceptionInfo *exception)
2267 % A description of each parameter follows:
2269 % o string: the string containing the comma/space seperated values.
2271 % o count: returns number of arguments in returned array
2273 % o exception: return 'memory failure' exceptions
2276 MagickExport double *StringToArrayOfDoubles(const char *string,ssize_t *count,
2277 ExceptionInfo *exception)
2292 Determine count of values, and check syntax.
2299 (void) StringToDouble(p,&q); /* get value - ignores leading space */
2301 return((double *) NULL); /* no value found */
2303 i++; /* increment value count */
2304 while (isspace((int) ((unsigned char) *p)) != 0)
2305 p++; /* skip spaces */
2307 p++; /* skip comma */
2308 while (isspace((int) ((unsigned char) *p)) != 0)
2309 p++; /* and more spaces */
2312 Allocate floating point argument list.
2315 array=(double *) AcquireQuantumMemory((size_t) i,sizeof(*array));
2316 if (array == (double *) NULL)
2317 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2319 Fill in the floating point values.
2323 while ((*p != '\0') && (i < *count))
2325 array[i++]=StringToDouble(p,&q);
2327 while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
2334 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2338 + S t r i n g T o k e n %
2342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2344 % StringToken() Looks for any one of given delimiters and splits the string
2345 % into two separate strings by replacing the delimiter character found with a
2348 % The given string pointer is changed to point to the string following the
2349 % delimiter character found, or NULL. A pointer to the start of the
2350 % string is returned, representing the token before the delimiter.
2352 % In may ways this is equivent to the strtok() C library function, but with
2353 % multiple delimiter characters rather than a delimiter string.
2355 % The format of the StringToken method is:
2357 % char *StringToken(const char *delimiters,char **string)
2359 % A description of each parameter follows:
2361 % o delimiters: one or more delimiters.
2363 % o string: return the first token in the string. If none is found, return
2367 MagickExport char *StringToken(const char *delimiters,char **string)
2383 if (p == (char *) NULL)
2384 return((char *) NULL);
2402 } while (d != '\0');
2407 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2411 % S t r i n g T o L i s t %
2415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2417 % StringToList() converts a text string into a list by segmenting the text
2418 % string at each carriage return discovered. The list is converted to HEX
2419 % characters if any control characters are discovered within the text string.
2421 % The format of the StringToList method is:
2423 % char **StringToList(const char *text)
2425 % A description of each parameter follows:
2427 % o text: Specifies the string to segment into a list.
2430 MagickExport char **StringToList(const char *text)
2444 if (text == (char *) NULL)
2445 return((char **) NULL);
2446 for (p=text; *p != '\0'; p++)
2447 if (((int) ((unsigned char) *p) < 32) &&
2448 (isspace((int) ((unsigned char) *p)) == 0))
2456 Convert string to an ASCII list.
2459 for (p=text; *p != '\0'; p++)
2462 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2464 if (textlist == (char **) NULL)
2465 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2467 for (i=0; i < (ssize_t) lines; i++)
2469 for (q=p; *q != '\0'; q++)
2470 if ((*q == '\r') || (*q == '\n'))
2472 textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2473 sizeof(**textlist));
2474 if (textlist[i] == (char *) NULL)
2475 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2476 (void) memcpy(textlist[i],p,(size_t) (q-p));
2477 textlist[i][q-p]='\0';
2486 hex_string[MaxTextExtent];
2495 Convert string to a HEX list.
2497 lines=(size_t) (strlen(text)/0x14)+1;
2498 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2500 if (textlist == (char **) NULL)
2501 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2503 for (i=0; i < (ssize_t) lines; i++)
2505 textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
2506 sizeof(**textlist));
2507 if (textlist[i] == (char *) NULL)
2508 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2509 (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2511 q=textlist[i]+strlen(textlist[i]);
2512 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2514 (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
2515 (void) CopyMagickString(q,hex_string,MaxTextExtent);
2517 if ((j % 0x04) == 0)
2520 for ( ; j <= 0x14; j++)
2524 if ((j % 0x04) == 0)
2528 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2530 if (isprint((int) ((unsigned char) *p)) != 0)
2539 textlist[i]=(char *) NULL;
2544 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2548 % S t r i n g T o S t r i n g I n f o %
2552 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2554 % StringToStringInfo() converts a string to a StringInfo type.
2556 % The format of the StringToStringInfo method is:
2558 % StringInfo *StringToStringInfo(const char *string)
2560 % A description of each parameter follows:
2562 % o string: The string.
2565 MagickExport StringInfo *StringToStringInfo(const char *string)
2570 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2571 assert(string != (const char *) NULL);
2572 string_info=AcquireStringInfo(strlen(string));
2573 SetStringInfoDatum(string_info,(const unsigned char *) string);
2574 return(string_info);
2578 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2582 % S t r i p S t r i n g %
2586 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2588 % StripString() strips any whitespace or quotes from the beginning and end of
2589 % a string of characters.
2591 % The format of the StripString method is:
2593 % void StripString(char *message)
2595 % A description of each parameter follows:
2597 % o message: Specifies an array of characters.
2600 MagickExport void StripString(char *message)
2609 assert(message != (char *) NULL);
2610 if (*message == '\0')
2612 length=strlen(message);
2614 while (isspace((int) ((unsigned char) *p)) != 0)
2616 if ((*p == '\'') || (*p == '"'))
2619 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2622 if ((*q == '\'') || (*q == '"'))
2624 (void) memmove(message,p,(size_t) (q-p+1));
2625 message[q-p+1]='\0';
2626 for (p=message; *p != '\0'; p++)
2632 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2636 % S u b s t i t u t e S t r i n g %
2640 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2642 % SubstituteString() performs string substitution on a string, replacing the
2643 % string with the substituted version. Buffer must be allocated from the heap.
2644 % If the string is matched and status, MagickTrue is returned otherwise
2647 % The format of the SubstituteString method is:
2649 % MagickBooleanType SubstituteString(char **string,const char *search,
2650 % const char *replace)
2652 % A description of each parameter follows:
2654 % o string: the string to perform replacements on; replaced with new
2655 % allocation if a replacement is made.
2657 % o search: search for this string.
2659 % o replace: replace any matches with this string.
2662 MagickExport MagickBooleanType SubstituteString(char **string,
2663 const char *search,const char *replace)
2682 for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2684 if (search_extent == 0)
2685 search_extent=strlen(search);
2686 if (strncmp(p,search,search_extent) != 0)
2692 if (replace_extent == 0)
2693 replace_extent=strlen(replace);
2694 if (replace_extent > search_extent)
2697 Make room for the replacement string.
2699 offset=(ssize_t) (p-(*string));
2700 extent=strlen(*string)+replace_extent-search_extent+1;
2701 *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2703 if (*string == (char *) NULL)
2704 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2710 if (search_extent != replace_extent)
2711 (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2712 strlen(p+search_extent)+1);
2713 (void) CopyMagickMemory(p,replace,replace_extent);
2714 p+=replace_extent-1;