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-2015 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/image-private.h"
48 #include "MagickCore/list.h"
49 #include "MagickCore/locale_.h"
50 #include "MagickCore/log.h"
51 #include "MagickCore/memory_.h"
52 #include "MagickCore/nt-base-private.h"
53 #include "MagickCore/property.h"
54 #include "MagickCore/resource_.h"
55 #include "MagickCore/signature-private.h"
56 #include "MagickCore/string_.h"
57 #include "MagickCore/string-private.h"
58 #include "MagickCore/utility-private.h"
63 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
64 static const unsigned char
67 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
68 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
69 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
70 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
71 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
72 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
73 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
74 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
75 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
76 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
77 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
78 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
79 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
80 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
81 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
82 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
83 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
84 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
85 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
86 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
87 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
88 0xfc, 0xfd, 0xfe, 0xff,
93 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97 % A c q u i r e S t r i n g %
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
103 % AcquireString() returns an new extented string, containing a clone of the
106 % An extended string is the string length, plus an extra MagickPathExtent space
107 % to allow for the string to be actively worked on.
109 % The returned string shoud be freed using DestoryString().
111 % The format of the AcquireString method is:
113 % char *AcquireString(const char *source)
115 % A description of each parameter follows:
117 % o source: A character string.
120 MagickExport char *AcquireString(const char *source)
129 if (source != (char *) NULL)
130 length+=strlen(source);
131 if (~length < MagickPathExtent)
132 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
133 destination=(char *) AcquireQuantumMemory(length+MagickPathExtent,
134 sizeof(*destination));
135 if (destination == (char *) NULL)
136 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
138 if (source != (char *) NULL)
139 (void) memcpy(destination,source,length*sizeof(*destination));
140 destination[length]='\0';
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
149 % A c q u i r e S t r i n g I n f o %
153 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155 % AcquireStringInfo() allocates the StringInfo structure.
157 % The format of the AcquireStringInfo method is:
159 % StringInfo *AcquireStringInfo(const size_t length)
161 % A description of each parameter follows:
163 % o length: the string length.
166 MagickExport StringInfo *AcquireStringInfo(const size_t length)
171 string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
172 if (string_info == (StringInfo *) NULL)
173 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
174 (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
175 string_info->signature=MagickCoreSignature;
176 string_info->length=length;
177 string_info->datum=(unsigned char *) NULL;
178 if (~string_info->length >= (MagickPathExtent-1))
179 string_info->datum=(unsigned char *) AcquireQuantumMemory(
180 string_info->length+MagickPathExtent,sizeof(*string_info->datum));
181 if (string_info->datum == (unsigned char *) NULL)
182 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 StringInfo structure
198 % with MagickPathExtent extra space.
200 % The format of the BlobToStringInfo method is:
202 % StringInfo *BlobToStringInfo(const void *blob,const size_t length)
204 % A description of each parameter follows:
208 % o length: the length of the blob.
211 MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
216 string_info=AcquireStringInfo(0);
217 if (~length < MagickPathExtent)
218 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
219 string_info->length=length;
220 if (string_info->datum == (unsigned char *) NULL)
221 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
222 MagickPathExtent,sizeof(*string_info->datum));
224 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
225 length+MagickPathExtent,sizeof(*string_info->datum));
226 if (string_info->datum == (unsigned char *) NULL)
228 string_info=DestroyStringInfo(string_info);
229 return((StringInfo *) NULL);
231 if (blob != (const void *) NULL)
232 (void) memcpy(string_info->datum,blob,length);
237 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
241 % C l o n e S t r i n g %
245 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
247 % CloneString() replaces or frees the destination string to make it
248 % a clone of the input string plus MagickPathExtent more space so the string
251 % If source is a NULL pointer the destination string will be freed and set to
252 % a NULL pointer. A pointer to the stored in the destination is also returned.
254 % When finished the non-NULL string should be freed using DestoryString()
255 % or using CloneString() with a NULL pointed for the source.
257 % The format of the CloneString method is:
259 % char *CloneString(char **destination,const char *source)
261 % A description of each parameter follows:
263 % o destination: A pointer to a character string.
265 % o source: A character string.
268 MagickExport char *CloneString(char **destination,const char *source)
273 assert(destination != (char **) NULL);
274 if (source == (const char *) NULL)
276 if (*destination != (char *) NULL)
277 *destination=DestroyString(*destination);
278 return(*destination);
280 if (*destination == (char *) NULL)
282 *destination=AcquireString(source);
283 return(*destination);
285 length=strlen(source);
286 if (~length < MagickPathExtent)
287 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
288 *destination=(char *) ResizeQuantumMemory(*destination,length+
289 MagickPathExtent,sizeof(**destination));
290 if (*destination == (char *) NULL)
291 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
293 (void) memcpy(*destination,source,length*sizeof(**destination));
294 (*destination)[length]='\0';
295 return(*destination);
299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
303 % C l o n e S t r i n g I n f o %
307 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
309 % CloneStringInfo() clones a copy of the StringInfo structure.
311 % The format of the CloneStringInfo method is:
313 % StringInfo *CloneStringInfo(const StringInfo *string_info)
315 % A description of each parameter follows:
317 % o string_info: the string info.
320 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
325 assert(string_info != (StringInfo *) NULL);
326 assert(string_info->signature == MagickCoreSignature);
327 clone_info=AcquireStringInfo(string_info->length);
328 if (string_info->length != 0)
329 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
334 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
338 % C o m p a r e S t r i n g I n f o %
342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
344 % CompareStringInfo() compares the two datums target and source. It returns
345 % an integer less than, equal to, or greater than zero if target is found,
346 % respectively, to be less than, to match, or be greater than source.
348 % The format of the CompareStringInfo method is:
350 % int CompareStringInfo(const StringInfo *target,const StringInfo *source)
352 % A description of each parameter follows:
354 % o target: the target string.
356 % o source: the source string.
360 MagickExport int CompareStringInfo(const StringInfo *target,
361 const StringInfo *source)
366 assert(target != (StringInfo *) NULL);
367 assert(target->signature == MagickCoreSignature);
368 assert(source != (StringInfo *) NULL);
369 assert(source->signature == MagickCoreSignature);
370 status=memcmp(target->datum,source->datum,MagickMin(target->length,
374 if (target->length == source->length)
376 return(target->length < source->length ? -1 : 1);
380 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
384 % C o n c a t e n a t e M a g i c k S t r i n g %
388 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
390 % ConcatenateMagickString() concatenates the source string to the destination
391 % string. The destination buffer is always null-terminated even if the
392 % string must be truncated.
394 % The format of the ConcatenateMagickString method is:
396 % size_t ConcatenateMagickString(char *destination,const char *source,
397 % const size_t length)
399 % A description of each parameter follows:
401 % o destination: the destination string.
403 % o source: the source string.
405 % o length: the length of the destination string.
408 MagickExport size_t ConcatenateMagickString(char *destination,
409 const char *source,const size_t length)
423 assert(destination != (char *) NULL);
424 assert(source != (const char *) NULL);
429 while ((i-- != 0) && (*q != '\0'))
431 count=(size_t) (q-destination);
434 return(count+strlen(p));
445 return(count+(p-source));
449 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
453 % C o n c a t e n a t e S t r i n g %
457 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
459 % ConcatenateString() appends a copy of string source, including the
460 % terminating null character, to the end of string destination.
462 % The format of the ConcatenateString method is:
464 % MagickBooleanType ConcatenateString(char **destination,
465 % const char *source)
467 % A description of each parameter follows:
469 % o destination: A pointer to a character string.
471 % o source: A character string.
474 MagickExport MagickBooleanType ConcatenateString(char **destination,
482 assert(destination != (char **) NULL);
483 if (source == (const char *) NULL)
485 if (*destination == (char *) NULL)
487 *destination=AcquireString(source);
490 destination_length=strlen(*destination);
491 source_length=strlen(source);
492 length=destination_length;
493 if (~length < source_length)
494 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
495 length+=source_length;
496 if (~length < MagickPathExtent)
497 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
498 *destination=(char *) ResizeQuantumMemory(*destination,length+
499 MagickPathExtent,sizeof(**destination));
500 if (*destination == (char *) NULL)
501 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
502 if (source_length != 0)
503 (void) memcpy((*destination)+destination_length,source,source_length);
504 (*destination)[length]='\0';
509 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
513 % C o n c a t e n a t e S t r i n g I n f o %
517 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
519 % ConcatenateStringInfo() concatenates the source string to the destination
522 % The format of the ConcatenateStringInfo method is:
524 % void ConcatenateStringInfo(StringInfo *string_info,
525 % const StringInfo *source)
527 % A description of each parameter follows:
529 % o string_info: the string info.
531 % o source: the source string.
534 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
535 const StringInfo *source)
540 assert(string_info != (StringInfo *) NULL);
541 assert(string_info->signature == MagickCoreSignature);
542 assert(source != (const StringInfo *) NULL);
543 length=string_info->length;
544 if (~length < source->length)
545 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
546 SetStringInfoLength(string_info,length+source->length);
547 (void) memcpy(string_info->datum+length,source->datum,source->length);
551 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
555 % 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 %
559 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
561 % ConfigureFileToStringInfo() returns the contents of a configure file as a
564 % The format of the ConfigureFileToStringInfo method is:
566 % StringInfo *ConfigureFileToStringInfo(const char *filename)
567 % ExceptionInfo *exception)
569 % A description of each parameter follows:
571 % o filename: the filename.
574 MagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
594 assert(filename != (const char *) NULL);
595 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
597 return((StringInfo *) NULL);
598 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
599 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
602 return((StringInfo *) NULL);
604 length=(size_t) offset;
605 string=(char *) NULL;
606 if (~length >= (MagickPathExtent-1))
607 string=(char *) AcquireQuantumMemory(length+MagickPathExtent,
609 if (string == (char *) NULL)
612 return((StringInfo *) NULL);
614 map=MapBlob(file,ReadMode,0,length);
615 if (map != (void *) NULL)
617 (void) memcpy(string,map,length);
618 (void) UnmapBlob(map,length);
628 (void) lseek(file,0,SEEK_SET);
629 for (i=0; i < length; i+=count)
631 count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
643 string=DestroyString(string);
644 return((StringInfo *) NULL);
649 string_info=AcquireStringInfo(0);
650 string_info->path=ConstantString(filename);
651 string_info->length=length;
652 if (string_info->datum != (unsigned char *) NULL)
653 string_info->datum=(unsigned char *) RelinquishMagickMemory(
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 exactly the needed memory for a string and
671 % copies the source string to that memory location. A NULL string pointer
672 % will allocate an empty string containing just the NUL character.
674 % When finished the string should be freed using DestoryString()
676 % The format of the ConstantString method is:
678 % char *ConstantString(const char *source)
680 % A description of each parameter follows:
682 % o source: A character string.
685 MagickExport char *ConstantString(const char *source)
694 if (source != (char *) NULL)
695 length+=strlen(source);
696 destination=(char *) NULL;
698 destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
699 if (destination == (char *) NULL)
700 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
702 if (source != (char *) NULL)
703 (void) memcpy(destination,source,length*sizeof(*destination));
704 destination[length]='\0';
709 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
713 % C o p y M a g i c k S t r i n g %
717 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
719 % CopyMagickString() copies the source string to the destination string, with
720 % out exceeding the given pre-declared length.
722 % The destination buffer is always null-terminated even if the string must be
723 % truncated. The return value is the minimum of the source string length or
724 % the length parameter.
726 % The format of the CopyMagickString method is:
728 % size_t CopyMagickString(const char *destination,char *source,
729 % const size_t length)
731 % A description of each parameter follows:
733 % o destination: the destination string.
735 % o source: the source string.
737 % o length: the length of the destination string.
740 MagickExport size_t CopyMagickString(char *destination,const char *source,
752 if (source == (const char *) NULL)
756 for (n=length; n > 4; n-=4)
760 return((size_t) (p-source-1));
764 return((size_t) (p-source-1));
768 return((size_t) (p-source-1));
772 return((size_t) (p-source-1));
776 for (n--; n != 0; n--)
780 return((size_t) (p-source-1));
785 return((size_t) (p-source-1));
789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
793 % D e s t r o y S t r i n g %
797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
799 % DestroyString() destroys memory associated with a string.
801 % The format of the DestroyString method is:
803 % char *DestroyString(char *string)
805 % A description of each parameter follows:
807 % o string: the string.
810 MagickExport char *DestroyString(char *string)
812 return((char *) RelinquishMagickMemory(string));
816 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
820 % D e s t r o y S t r i n g I n f o %
824 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
826 % DestroyStringInfo() destroys memory associated with the StringInfo structure.
828 % The format of the DestroyStringInfo method is:
830 % StringInfo *DestroyStringInfo(StringInfo *string_info)
832 % A description of each parameter follows:
834 % o string_info: the string info.
837 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
839 assert(string_info != (StringInfo *) NULL);
840 assert(string_info->signature == MagickCoreSignature);
841 if (string_info->datum != (unsigned char *) NULL)
842 string_info->datum=(unsigned char *) RelinquishMagickMemory(
844 if (string_info->path != (char *) NULL)
845 string_info->path=DestroyString(string_info->path);
846 string_info->signature=(~MagickCoreSignature);
847 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
852 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
856 % D e s t r o y S t r i n g L i s t %
860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
862 % DestroyStringList() zeros memory associated with a string list.
864 % The format of the DestroyStringList method is:
866 % char **DestroyStringList(char **list)
868 % A description of each parameter follows:
870 % o list: the string list.
873 MagickExport char **DestroyStringList(char **list)
878 assert(list != (char **) NULL);
879 for (i=0; list[i] != (char *) NULL; i++)
880 list[i]=DestroyString(list[i]);
881 list=(char **) RelinquishMagickMemory(list);
886 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
890 % E s c a p e S t r i n g %
894 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
896 % EscapeString() allocates memory for a backslash-escaped version of a
897 % source text string, copies the escaped version of the text to that
898 % memory location while adding backslash characters, and returns the
901 % The format of the EscapeString method is:
903 % char *EscapeString(const char *source,const char escape)
905 % A description of each parameter follows:
907 % o allocate_string: Method EscapeString returns the escaped string.
909 % o source: A character string.
911 % o escape: the quoted string termination character to escape (e.g. '"').
914 MagickExport char *EscapeString(const char *source,const char escape)
928 assert(source != (const char *) NULL);
929 length=strlen(source);
930 for (p=source; *p != '\0'; p++)
931 if ((*p == '\\') || (*p == escape))
934 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
937 destination=(char *) NULL;
938 if (~length >= (MagickPathExtent-1))
939 destination=(char *) AcquireQuantumMemory(length+MagickPathExtent,
940 sizeof(*destination));
941 if (destination == (char *) NULL)
942 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
945 for (p=source; *p != '\0'; p++)
947 if ((*p == '\\') || (*p == escape))
956 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
960 % F i l e T o S t r i n g %
964 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
966 % FileToString() returns the contents of a file as a string.
968 % The format of the FileToString method is:
970 % char *FileToString(const char *filename,const size_t extent,
971 % ExceptionInfo *exception)
973 % A description of each parameter follows:
975 % o filename: the filename.
977 % o extent: Maximum length of the string.
979 % o exception: return any errors or warnings in this structure.
982 MagickExport char *FileToString(const char *filename,const size_t extent,
983 ExceptionInfo *exception)
988 assert(filename != (const char *) NULL);
989 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
990 assert(exception != (ExceptionInfo *) NULL);
991 return((char *) FileToBlob(filename,extent,&length,exception));
995 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
999 % F i l e T o S t r i n g I n f o %
1003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1005 % FileToStringInfo() returns the contents of a file as a string.
1007 % The format of the FileToStringInfo method is:
1009 % StringInfo *FileToStringInfo(const char *filename,const size_t extent,
1010 % ExceptionInfo *exception)
1012 % A description of each parameter follows:
1014 % o filename: the filename.
1016 % o extent: Maximum length of the string.
1018 % o exception: return any errors or warnings in this structure.
1021 MagickExport StringInfo *FileToStringInfo(const char *filename,
1022 const size_t extent,ExceptionInfo *exception)
1027 assert(filename != (const char *) NULL);
1028 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1029 assert(exception != (ExceptionInfo *) NULL);
1030 string_info=AcquireStringInfo(0);
1031 string_info->path=ConstantString(filename);
1032 if (string_info->datum != (unsigned char *) NULL)
1033 string_info->datum=(unsigned char *) RelinquishMagickMemory(
1034 string_info->datum);
1035 string_info->datum=(unsigned char *) FileToBlob(filename,extent,
1036 &string_info->length,exception);
1037 if (string_info->datum == (unsigned char *) NULL)
1039 string_info=DestroyStringInfo(string_info);
1040 return((StringInfo *) NULL);
1042 return(string_info);
1046 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1050 % F o r m a t M a g i c k S i z e %
1054 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1056 % FormatMagickSize() converts a size to a human readable format, for example,
1057 % 14k, 234m, 2.7g, or 3.0t. Scaling is done by repetitively dividing by
1060 % The format of the FormatMagickSize method is:
1062 % ssize_t FormatMagickSize(const MagickSizeType size,const char *suffix,
1063 % const size_t length,char *format)
1065 % A description of each parameter follows:
1067 % o size: convert this size to a human readable format.
1069 % o bi: use power of two rather than power of ten.
1071 % o suffix: append suffix, typically B or P.
1073 % o length: the maximum length of the string.
1075 % o format: human readable format.
1078 MagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1079 const MagickBooleanType bi,const char *suffix,const size_t length,
1099 "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1101 *traditional_units[] =
1103 "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1107 units=traditional_units;
1108 if (bi != MagickFalse)
1113 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1114 extent=(double) ((MagickOffsetType) size);
1116 extent=(double) size;
1118 for (i=0; (extent >= bytes) && (units[i+1] != (const char *) NULL); i++)
1121 for (j=2; j < 12; j++)
1123 if (suffix == (const char *) NULL)
1124 count=FormatLocaleString(format,length,"%.*g%s",(int) (i+j),extent,
1127 count=FormatLocaleString(format,length,"%.*g%s%s",(int) (i+j),extent,
1129 if (strchr(format,'+') == (char *) NULL)
1136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1140 % F o r m a t M a g i c k T i m e %
1144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1146 % FormatMagickTime() returns the specified time in the Internet date/time
1147 % format and the length of the timestamp.
1149 % The format of the FormatMagickTime method is:
1151 % ssize_t FormatMagickTime(const time_t time,const size_t length,
1154 % A description of each parameter follows.
1156 % o time: the time since the Epoch (00:00:00 UTC, January 1, 1970),
1157 % measured in seconds.
1159 % o length: the maximum length of the string.
1161 % o timestamp: Return the Internet date/time here.
1164 MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1177 assert(timestamp != (char *) NULL);
1178 (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1179 (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1180 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1181 (void) localtime_r(&time,&local_time);
1187 my_time=localtime(&time);
1188 if (my_time != (struct tm *) NULL)
1189 (void) memcpy(&local_time,my_time,sizeof(local_time));
1192 #if defined(MAGICKCORE_HAVE_GMTIME_R)
1193 (void) gmtime_r(&time,&gm_time);
1199 my_time=gmtime(&time);
1200 if (my_time != (struct tm *) NULL)
1201 (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1204 timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1205 local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1206 gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1207 (local_time.tm_yday-gm_time.tm_yday)));
1208 count=FormatLocaleString(timestamp,length,
1209 "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1210 local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1211 local_time.tm_min,local_time.tm_sec,(long) timezone);
1216 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1220 % G e t E n v i r o n m e n t V a l u e %
1224 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1226 % GetEnvironmentValue() returns the environment string that matches the
1229 % The format of the GetEnvironmentValue method is:
1231 % char *GetEnvironmentValue(const char *name)
1233 % A description of each parameter follows:
1235 % o name: the environment name.
1238 MagickExport char *GetEnvironmentValue(const char *name)
1243 environment=getenv(name);
1244 if (environment == (const char *) NULL)
1245 return((char *) NULL);
1246 return(ConstantString(environment));
1250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1254 % G e t S t r i n g I n f o D a t u m %
1258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1260 % GetStringInfoDatum() returns the datum associated with the string.
1262 % The format of the GetStringInfoDatum method is:
1264 % unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1266 % A description of each parameter follows:
1268 % o string_info: the string info.
1271 MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1273 assert(string_info != (StringInfo *) NULL);
1274 assert(string_info->signature == MagickCoreSignature);
1275 return(string_info->datum);
1279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1283 % G e t S t r i n g I n f o L e n g t h %
1287 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1289 % GetStringInfoLength() returns the string length.
1291 % The format of the GetStringInfoLength method is:
1293 % size_t GetStringInfoLength(const StringInfo *string_info)
1295 % A description of each parameter follows:
1297 % o string_info: the string info.
1300 MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1302 assert(string_info != (StringInfo *) NULL);
1303 assert(string_info->signature == MagickCoreSignature);
1304 return(string_info->length);
1308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1312 % G e t S t r i n g I n f o P a t h %
1316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1318 % GetStringInfoPath() returns the path associated with the string.
1320 % The format of the GetStringInfoPath method is:
1322 % const char *GetStringInfoPath(const StringInfo *string_info)
1324 % A description of each parameter follows:
1326 % o string_info: the string info.
1329 MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1331 assert(string_info != (StringInfo *) NULL);
1332 assert(string_info->signature == MagickCoreSignature);
1333 return(string_info->path);
1337 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1341 + I n t e r p r e t S i P r e f i x V a l u e %
1345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1347 % InterpretSiPrefixValue() converts the initial portion of the string to a
1348 % double representation. It also recognizes SI prefixes (e.g. B, KB, MiB,
1351 % The format of the InterpretSiPrefixValue method is:
1353 % double InterpretSiPrefixValue(const char *value,char **sentinal)
1355 % A description of each parameter follows:
1357 % o value: the string value.
1359 % o sentinal: if sentinal is not NULL, return a pointer to the character
1360 % after the last character used in the conversion.
1363 MagickExport double InterpretSiPrefixValue(const char *restrict string,
1364 char **restrict sentinal)
1372 value=InterpretLocaleValue(string,&q);
1375 if ((*q >= 'E') && (*q <= 'z'))
1380 switch ((int) ((unsigned char) *q))
1382 case 'y': e=(-24.0); break;
1383 case 'z': e=(-21.0); break;
1384 case 'a': e=(-18.0); break;
1385 case 'f': e=(-15.0); break;
1386 case 'p': e=(-12.0); break;
1387 case 'n': e=(-9.0); break;
1388 case 'u': e=(-6.0); break;
1389 case 'm': e=(-3.0); break;
1390 case 'c': e=(-2.0); break;
1391 case 'd': e=(-1.0); break;
1392 case 'h': e=2.0; break;
1393 case 'k': e=3.0; break;
1394 case 'K': e=3.0; break;
1395 case 'M': e=6.0; break;
1396 case 'G': e=9.0; break;
1397 case 'T': e=12.0; break;
1398 case 'P': e=15.0; break;
1399 case 'E': e=18.0; break;
1400 case 'Z': e=21.0; break;
1401 case 'Y': e=24.0; break;
1402 default: e=0.0; break;
1404 if (e >= MagickEpsilon)
1408 value*=pow(2.0,e/0.3);
1418 if ((*q == 'B') || (*q == 'P'))
1421 if (sentinal != (char **) NULL)
1427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1431 % I s S t r i n g T r u e %
1435 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1437 % IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
1438 % "1". Any other string or undefined returns MagickFalse.
1440 % Typically this is used to look at strings (options or artifacts) which
1441 % has a default value of "false", when not defined.
1443 % The format of the IsStringTrue method is:
1445 % MagickBooleanType IsStringTrue(const char *value)
1447 % A description of each parameter follows:
1449 % o value: Specifies a pointer to a character array.
1452 MagickExport MagickBooleanType IsStringTrue(const char *value)
1454 if (value == (const char *) NULL)
1455 return(MagickFalse);
1456 if (LocaleCompare(value,"true") == 0)
1458 if (LocaleCompare(value,"on") == 0)
1460 if (LocaleCompare(value,"yes") == 0)
1462 if (LocaleCompare(value,"1") == 0)
1464 return(MagickFalse);
1468 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1472 % I s S t r i n g F a l s e %
1476 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1478 % IsStringFalse() returns MagickTrue if the value is "false", "off", "no" or
1479 % "0". Any other string or undefined returns MagickFalse.
1481 % Typically this is used to look at strings (options or artifacts) which
1482 % has a default value of "true", when it has not been defined.
1484 % The format of the IsStringFalse method is:
1486 % MagickBooleanType IsStringFalse(const char *value)
1488 % A description of each parameter follows:
1490 % o value: Specifies a pointer to a character array.
1493 MagickExport MagickBooleanType IsStringFalse(const char *value)
1495 if (value == (const char *) NULL)
1496 return(MagickFalse);
1497 if (LocaleCompare(value,"false") == 0)
1499 if (LocaleCompare(value,"off") == 0)
1501 if (LocaleCompare(value,"no") == 0)
1503 if (LocaleCompare(value,"0") == 0)
1505 return(MagickFalse);
1509 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1513 % L o c a l e C o m p a r e %
1517 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1519 % LocaleCompare() performs a case-insensitive comparison of two strings
1520 % byte-by-byte, according to the ordering of the current locale encoding.
1521 % LocaleCompare returns an integer greater than, equal to, or less than 0,
1522 % if the string pointed to by p is greater than, equal to, or less than the
1523 % string pointed to by q respectively. The sign of a non-zero return value
1524 % is determined by the sign of the difference between the values of the first
1525 % pair of bytes that differ in the strings being compared.
1527 % The format of the LocaleCompare method is:
1529 % int LocaleCompare(const char *p,const char *q)
1531 % A description of each parameter follows:
1533 % o p: A pointer to a character string.
1535 % o q: A pointer to a character string to compare to p.
1538 MagickExport int LocaleCompare(const char *p,const char *q)
1540 if ((p == (char *) NULL) && (q == (char *) NULL))
1542 if (p == (char *) NULL)
1544 if (q == (char *) NULL)
1546 #if defined(MAGICKCORE_HAVE_STRCASECMP)
1547 return(strcasecmp(p,q));
1556 c=(int) *((unsigned char *) p);
1557 d=(int) *((unsigned char *) q);
1558 if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1563 return(AsciiMap[c]-(int) AsciiMap[d]);
1569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1573 % L o c a l e L o w e r %
1577 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1579 % LocaleLower() transforms all of the characters in the supplied
1580 % null-terminated string, changing all uppercase letters to lowercase.
1582 % The format of the LocaleLower method is:
1584 % void LocaleLower(char *string)
1586 % A description of each parameter follows:
1588 % o string: A pointer to the string to convert to lower-case Locale.
1591 MagickExport void LocaleLower(char *string)
1596 assert(string != (char *) NULL);
1597 for (q=string; *q != '\0'; q++)
1598 *q=(char) tolower((int) *q);
1602 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1606 % L o c a l e N C o m p a r e %
1610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1612 % LocaleNCompare() performs a case-insensitive comparison of two strings
1613 % byte-by-byte, according to the ordering of the current locale encoding.
1615 % LocaleNCompare returns an integer greater than, equal to, or less than 0,
1616 % if the string pointed to by p is greater than, equal to, or less than the
1617 % string pointed to by q respectively. The sign of a non-zero return value
1618 % is determined by the sign of the difference between the values of the first
1619 % pair of bytes that differ in the strings being compared.
1621 % The LocaleNCompare method makes the same comparison as LocaleCompare but
1622 % looks at a maximum of n bytes. Bytes following a null byte are not
1625 % The format of the LocaleNCompare method is:
1627 % int LocaleNCompare(const char *p,const char *q,const size_t n)
1629 % A description of each parameter follows:
1631 % o p: A pointer to a character string.
1633 % o q: A pointer to a character string to compare to p.
1635 % o length: the number of characters to compare in strings p and q.
1638 MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1640 if ((p == (char *) NULL) && (q == (char *) NULL))
1642 if (p == (char *) NULL)
1644 if (q == (char *) NULL)
1646 #if defined(MAGICKCORE_HAVE_STRNCASECMP)
1647 return(strncasecmp(p,q,length));
1657 for (i=length; i != 0; i--)
1659 c=(int) *((unsigned char *) p);
1660 d=(int) *((unsigned char *) q);
1661 if (AsciiMap[c] != AsciiMap[d])
1662 return(AsciiMap[c]-(int) AsciiMap[d]);
1674 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1678 % L o c a l e U p p e r %
1682 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1684 % LocaleUpper() transforms all of the characters in the supplied
1685 % null-terminated string, changing all lowercase letters to uppercase.
1687 % The format of the LocaleUpper method is:
1689 % void LocaleUpper(char *string)
1691 % A description of each parameter follows:
1693 % o string: A pointer to the string to convert to upper-case Locale.
1696 MagickExport void LocaleUpper(char *string)
1701 assert(string != (char *) NULL);
1702 for (q=string; *q != '\0'; q++)
1703 *q=(char) toupper((int) *q);
1707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1711 % P r i n t S t r i n g I n f o %
1715 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1717 % PrintStringInfo() prints the string.
1719 % The format of the PrintStringInfo method is:
1721 % void PrintStringInfo(FILE *file,const char *id,
1722 % const StringInfo *string_info)
1724 % A description of each parameter follows:
1726 % o file: the file, typically stdout.
1728 % o id: the string id.
1730 % o string_info: the string info.
1733 MagickExport void PrintStringInfo(FILE *file,const char *id,
1734 const StringInfo *string_info)
1743 assert(id != (const char *) NULL);
1744 assert(string_info != (StringInfo *) NULL);
1745 assert(string_info->signature == MagickCoreSignature);
1746 p=(char *) string_info->datum;
1747 for (i=0; i < string_info->length; i++)
1749 if (((int) ((unsigned char) *p) < 32) &&
1750 (isspace((int) ((unsigned char) *p)) == 0))
1754 (void) FormatLocaleFile(file,"%s(%.20g): ",id,(double) string_info->length);
1755 if (i == string_info->length)
1757 for (i=0; i < string_info->length; i++)
1758 (void) fputc(string_info->datum[i],file);
1759 (void) fputc('\n',file);
1763 Convert string to a HEX list.
1765 p=(char *) string_info->datum;
1766 for (i=0; i < string_info->length; i+=0x14)
1768 (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1769 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1771 (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1772 if ((j % 0x04) == 0)
1773 (void) fputc(' ',file);
1775 for ( ; j <= 0x14; j++)
1777 (void) fputc(' ',file);
1778 (void) fputc(' ',file);
1779 if ((j % 0x04) == 0)
1780 (void) fputc(' ',file);
1782 (void) fputc(' ',file);
1783 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1785 if (isprint((int) ((unsigned char) *p)) != 0)
1786 (void) fputc(*p,file);
1788 (void) fputc('-',file);
1791 (void) fputc('\n',file);
1796 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1800 % R e s e t S t r i n g I n f o %
1804 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1806 % ResetStringInfo() reset the string to all null bytes.
1808 % The format of the ResetStringInfo method is:
1810 % void ResetStringInfo(StringInfo *string_info)
1812 % A description of each parameter follows:
1814 % o string_info: the string info.
1817 MagickExport void ResetStringInfo(StringInfo *string_info)
1819 assert(string_info != (StringInfo *) NULL);
1820 assert(string_info->signature == MagickCoreSignature);
1821 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1825 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1829 % S e t S t r i n g I n f o %
1833 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1835 % SetStringInfo() copies the source string to the destination string.
1837 % The format of the SetStringInfo method is:
1839 % void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1841 % A description of each parameter follows:
1843 % o string_info: the string info.
1845 % o source: the source string.
1848 MagickExport void SetStringInfo(StringInfo *string_info,
1849 const StringInfo *source)
1851 assert(string_info != (StringInfo *) NULL);
1852 assert(string_info->signature == MagickCoreSignature);
1853 assert(source != (StringInfo *) NULL);
1854 assert(source->signature == MagickCoreSignature);
1855 if (string_info->length == 0)
1857 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1858 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1867 % S e t S t r i n g I n f o D a t u m %
1871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1873 % SetStringInfoDatum() copies bytes from the source string for the length of
1874 % the destination string.
1876 % The format of the SetStringInfoDatum method is:
1878 % void SetStringInfoDatum(StringInfo *string_info,
1879 % const unsigned char *source)
1881 % A description of each parameter follows:
1883 % o string_info: the string info.
1885 % o source: the source string.
1888 MagickExport void SetStringInfoDatum(StringInfo *string_info,
1889 const unsigned char *source)
1891 assert(string_info != (StringInfo *) NULL);
1892 assert(string_info->signature == MagickCoreSignature);
1893 if (string_info->length != 0)
1894 (void) memcpy(string_info->datum,source,string_info->length);
1898 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1902 % S e t S t r i n g I n f o L e n g t h %
1906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1908 % SetStringInfoLength() set the string length to the specified value.
1910 % The format of the SetStringInfoLength method is:
1912 % void SetStringInfoLength(StringInfo *string_info,const size_t length)
1914 % A description of each parameter follows:
1916 % o string_info: the string info.
1918 % o length: the string length.
1921 MagickExport void SetStringInfoLength(StringInfo *string_info,
1922 const size_t length)
1924 assert(string_info != (StringInfo *) NULL);
1925 assert(string_info->signature == MagickCoreSignature);
1926 if (~length < MagickPathExtent)
1927 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1928 string_info->length=length;
1929 if (string_info->datum == (unsigned char *) NULL)
1930 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1931 MagickPathExtent,sizeof(*string_info->datum));
1933 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1934 length+MagickPathExtent,sizeof(*string_info->datum));
1935 if (string_info->datum == (unsigned char *) NULL)
1936 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1940 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1944 % S e t S t r i n g I n f o D a t u m %
1948 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1950 % SetStringInfoPath() sets the path associated with the string.
1952 % The format of the SetStringInfoPath method is:
1954 % void SetStringInfoPath(StringInfo *string_info,const char *path)
1956 % A description of each parameter follows:
1958 % o string_info: the string info.
1963 MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1965 assert(string_info != (StringInfo *) NULL);
1966 assert(string_info->signature == MagickCoreSignature);
1967 assert(path != (const char *) NULL);
1968 string_info->path=ConstantString(path);
1972 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1976 % S p l i t S t r i n g I n f o %
1980 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1982 % SplitStringInfo() splits a string into two and returns it.
1984 % The format of the SplitStringInfo method is:
1986 % StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1988 % A description of each parameter follows:
1990 % o string_info: the string info.
1993 MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1994 const size_t offset)
1999 assert(string_info != (StringInfo *) NULL);
2000 assert(string_info->signature == MagickCoreSignature);
2001 if (offset > string_info->length)
2002 return((StringInfo *) NULL);
2003 split_info=AcquireStringInfo(offset);
2004 SetStringInfo(split_info,string_info);
2005 (void) memmove(string_info->datum,string_info->datum+offset,
2006 string_info->length-offset+MagickPathExtent);
2007 SetStringInfoLength(string_info,string_info->length-offset);
2012 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2016 % S t r i n g I n f o T o S t r i n g %
2020 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2022 % StringInfoToString() converts a string info string to a C string.
2024 % The format of the StringInfoToString method is:
2026 % char *StringInfoToString(const StringInfo *string_info)
2028 % A description of each parameter follows:
2030 % o string_info: the string.
2033 MagickExport char *StringInfoToString(const StringInfo *string_info)
2041 string=(char *) NULL;
2042 length=string_info->length;
2043 if (~length >= (MagickPathExtent-1))
2044 string=(char *) AcquireQuantumMemory(length+MagickPathExtent,
2046 if (string == (char *) NULL)
2047 return((char *) NULL);
2048 (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
2049 string[length]='\0';
2054 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2058 % S t r i n g I n f o T o H e x S t r i n g %
2062 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2064 % StringInfoToHexString() converts a string info string to a C string.
2066 % The format of the StringInfoToHexString method is:
2068 % char *StringInfoToHexString(const StringInfo *string_info)
2070 % A description of each parameter follows:
2072 % o string_info: the string.
2075 MagickExport char *StringInfoToHexString(const StringInfo *string_info)
2080 register const unsigned char
2086 register unsigned char
2095 length=string_info->length;
2096 if (~length < MagickPathExtent)
2097 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2098 string=(char *) AcquireQuantumMemory(length+MagickPathExtent,2*
2100 if (string == (char *) NULL)
2101 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2118 p=string_info->datum;
2119 q=(unsigned char *) string;
2120 for (i=0; i < (ssize_t) string_info->length; i++)
2122 *q++=hex_digits[(*p >> 4) & 0x0f];
2123 *q++=hex_digits[*p & 0x0f];
2131 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2135 % S t r i n g T o A r g v %
2139 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2141 % StringToArgv() converts a text string into command line arguments.
2142 % The 'argv' array of arguments, is returned while the number of arguments
2143 % is returned via the provided integer variable pointer.
2145 % Simple 'word' tokenizer, which allows for each word to be optionally
2146 % quoted. However it will not allow use of partial quotes, or escape
2149 % The format of the StringToArgv method is:
2151 % char **StringToArgv(const char *text,int *argc)
2153 % A description of each parameter follows:
2155 % o argv: Method StringToArgv returns the string list unless an error
2156 % occurs, otherwise NULL.
2158 % o text: Specifies the string to segment into a list.
2160 % o argc: This integer pointer returns the number of arguments in the
2164 MagickExport char **StringToArgv(const char *text,int *argc)
2177 if (text == (char *) NULL)
2178 return((char **) NULL);
2180 Determine the number of arguments.
2182 for (p=text; *p != '\0'; )
2184 while (isspace((int) ((unsigned char) *p)) != 0)
2190 for (p++; (*p != '"') && (*p != '\0'); p++) ;
2192 for (p++; (*p != '\'') && (*p != '\0'); p++) ;
2193 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2197 argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
2198 if (argv == (char **) NULL)
2199 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
2201 Convert string to an ASCII list.
2203 argv[0]=AcquireString("magick");
2205 for (i=1; i < (ssize_t) *argc; i++)
2207 while (isspace((int) ((unsigned char) *p)) != 0)
2213 for (q++; (*q != '"') && (*q != '\0'); q++) ;
2219 for (q++; (*q != '\'') && (*q != '\0'); q++) ;
2222 while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
2224 argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MagickPathExtent,
2226 if (argv[i] == (char *) NULL)
2228 for (i--; i >= 0; i--)
2229 argv[i]=DestroyString(argv[i]);
2230 argv=(char **) RelinquishMagickMemory(argv);
2231 ThrowFatalException(ResourceLimitFatalError,
2232 "UnableToConvertStringToARGV");
2234 (void) memcpy(argv[i],p,(size_t) (q-p));
2237 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2240 argv[i]=(char *) NULL;
2245 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2249 % S t r i n g T o A r r a y O f D o u b l e s %
2253 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2255 % StringToArrayOfDoubles() converts a string of space or comma separated
2256 % numbers into array of floating point numbers (doubles). Any number that
2257 % failes to parse properly will produce a syntax error. As will two commas
2258 % without a number between them. However a final comma at the end will
2259 % not be regarded as an error so as to simplify automatic list generation.
2261 % A NULL value is returned on syntax or memory errors.
2263 % Use RelinquishMagickMemory() to free returned array when finished.
2265 % The format of the StringToArrayOfDoubles method is:
2267 % double *StringToArrayOfDoubles(const char *string,size_t *count,
2268 % ExceptionInfo *exception)
2270 % A description of each parameter follows:
2272 % o string: the string containing the comma/space separated values.
2274 % o count: returns number of arguments in returned array
2276 % o exception: return any errors or warnings in this structure.
2279 MagickExport double *StringToArrayOfDoubles(const char *string,ssize_t *count,
2280 ExceptionInfo *exception)
2295 Determine count of values, and check syntax.
2297 assert(exception != (ExceptionInfo *) NULL);
2298 assert(exception->signature == MagickCoreSignature);
2304 (void) StringToDouble(p,&q); /* get value - ignores leading space */
2306 return((double *) NULL); /* no value found */
2308 i++; /* increment value count */
2309 while (isspace((int) ((unsigned char) *p)) != 0)
2310 p++; /* skip spaces */
2312 p++; /* skip comma */
2313 while (isspace((int) ((unsigned char) *p)) != 0)
2314 p++; /* and more spaces */
2317 Allocate floating point argument list.
2320 array=(double *) AcquireQuantumMemory((size_t) i,sizeof(*array));
2321 if (array == (double *) NULL)
2323 (void) ThrowMagickException(exception,GetMagickModule(),
2324 ResourceLimitError,"MemoryAllocationFailed","`%s'","");
2325 return((double *) NULL);
2328 Fill in the floating point values.
2332 while ((*p != '\0') && (i < *count))
2334 array[i++]=StringToDouble(p,&q);
2336 while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
2343 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2347 + S t r i n g T o k e n %
2351 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2353 % StringToken() looks for any one of given delimiters and splits the string
2354 % into two separate strings by replacing the delimiter character found with a
2357 % The given string pointer is changed to point to the string following the
2358 % delimiter character found, or NULL. A pointer to the start of the
2359 % string is returned, representing the token before the delimiter.
2361 % In may ways this is equivent to the strtok() C library function, but with
2362 % multiple delimiter characters rather than a delimiter string.
2364 % The format of the StringToken method is:
2366 % char *StringToken(const char *delimiters,char **string)
2368 % A description of each parameter follows:
2370 % o delimiters: one or more delimiters.
2372 % o string: return the first token in the string. If none is found, return
2376 MagickExport char *StringToken(const char *delimiters,char **string)
2392 if (p == (char *) NULL)
2393 return((char *) NULL);
2411 } while (d != '\0');
2416 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2420 % S t r i n g T o L i s t %
2424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2426 % StringToList() converts a text string into a list by segmenting the text
2427 % string at each carriage return discovered. The list is converted to HEX
2428 % characters if any control characters are discovered within the text string.
2430 % The format of the StringToList method is:
2432 % char **StringToList(const char *text)
2434 % A description of each parameter follows:
2436 % o text: Specifies the string to segment into a list.
2439 MagickExport char **StringToList(const char *text)
2453 if (text == (char *) NULL)
2454 return((char **) NULL);
2455 for (p=text; *p != '\0'; p++)
2456 if (((int) ((unsigned char) *p) < 32) &&
2457 (isspace((int) ((unsigned char) *p)) == 0))
2465 Convert string to an ASCII list.
2468 for (p=text; *p != '\0'; p++)
2471 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2473 if (textlist == (char **) NULL)
2474 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2476 for (i=0; i < (ssize_t) lines; i++)
2478 for (q=p; *q != '\0'; q++)
2479 if ((*q == '\r') || (*q == '\n'))
2481 textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+
2482 MagickPathExtent,sizeof(**textlist));
2483 if (textlist[i] == (char *) NULL)
2484 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2485 (void) memcpy(textlist[i],p,(size_t) (q-p));
2486 textlist[i][q-p]='\0';
2495 hex_string[MagickPathExtent];
2504 Convert string to a HEX list.
2506 lines=(size_t) (strlen(text)/0x14)+1;
2507 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2509 if (textlist == (char **) NULL)
2510 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2512 for (i=0; i < (ssize_t) lines; i++)
2514 textlist[i]=(char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2515 sizeof(**textlist));
2516 if (textlist[i] == (char *) NULL)
2517 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2518 (void) FormatLocaleString(textlist[i],MagickPathExtent,"0x%08lx: ",
2520 q=textlist[i]+strlen(textlist[i]);
2521 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2523 (void) FormatLocaleString(hex_string,MagickPathExtent,"%02x",*(p+j));
2524 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2526 if ((j % 0x04) == 0)
2529 for ( ; j <= 0x14; j++)
2533 if ((j % 0x04) == 0)
2537 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2539 if (isprint((int) ((unsigned char) *p)) != 0)
2548 textlist[i]=(char *) NULL;
2553 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2557 % S t r i n g T o S t r i n g I n f o %
2561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2563 % StringToStringInfo() converts a string to a StringInfo type.
2565 % The format of the StringToStringInfo method is:
2567 % StringInfo *StringToStringInfo(const char *string)
2569 % A description of each parameter follows:
2571 % o string: The string.
2574 MagickExport StringInfo *StringToStringInfo(const char *string)
2579 assert(string != (const char *) NULL);
2580 string_info=AcquireStringInfo(strlen(string));
2581 SetStringInfoDatum(string_info,(const unsigned char *) string);
2582 return(string_info);
2586 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2590 % S t r i p S t r i n g %
2594 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2596 % StripString() strips any whitespace or quotes from the beginning and end of
2597 % a string of characters.
2599 % The format of the StripString method is:
2601 % void StripString(char *message)
2603 % A description of each parameter follows:
2605 % o message: Specifies an array of characters.
2608 MagickExport void StripString(char *message)
2617 assert(message != (char *) NULL);
2618 if (*message == '\0')
2620 length=strlen(message);
2622 while (isspace((int) ((unsigned char) *p)) != 0)
2624 if ((*p == '\'') || (*p == '"'))
2627 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2630 if ((*q == '\'') || (*q == '"'))
2632 (void) memmove(message,p,(size_t) (q-p+1));
2633 message[q-p+1]='\0';
2634 for (p=message; *p != '\0'; p++)
2640 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2644 % S u b s t i t u t e S t r i n g %
2648 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2650 % SubstituteString() performs string substitution on a string, replacing the
2651 % string with the substituted version. Buffer must be allocated from the heap.
2652 % If the string is matched and status, MagickTrue is returned otherwise
2655 % The format of the SubstituteString method is:
2657 % MagickBooleanType SubstituteString(char **string,const char *search,
2658 % const char *replace)
2660 % A description of each parameter follows:
2662 % o string: the string to perform replacements on; replaced with new
2663 % allocation if a replacement is made.
2665 % o search: search for this string.
2667 % o replace: replace any matches with this string.
2670 MagickExport MagickBooleanType SubstituteString(char **string,
2671 const char *search,const char *replace)
2690 for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2692 if (search_extent == 0)
2693 search_extent=strlen(search);
2694 if (strncmp(p,search,search_extent) != 0)
2700 if (replace_extent == 0)
2701 replace_extent=strlen(replace);
2702 if (replace_extent > search_extent)
2705 Make room for the replacement string.
2707 offset=(ssize_t) (p-(*string));
2708 extent=strlen(*string)+replace_extent-search_extent+1;
2709 *string=(char *) ResizeQuantumMemory(*string,extent+MagickPathExtent,
2711 if (*string == (char *) NULL)
2712 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2718 if (search_extent != replace_extent)
2719 (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2720 strlen(p+search_extent)+1);
2721 (void) CopyMagickMemory(p,replace,replace_extent);
2722 p+=replace_extent-1;