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-2011 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/property.h"
52 #include "MagickCore/resource_.h"
53 #include "MagickCore/signature-private.h"
54 #include "MagickCore/string_.h"
59 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
60 static const unsigned char
63 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
64 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
65 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
66 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
67 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
68 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
69 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
70 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
71 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
72 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
73 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
74 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
75 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
76 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
77 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
78 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
79 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
80 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
81 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
82 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
83 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
84 0xfc, 0xfd, 0xfe, 0xff,
89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93 % A c q u i r e S t r i n g %
97 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
99 % AcquireString() allocates memory for a string and copies the source string
100 % to that memory location (and returns it).
102 % The format of the AcquireString method is:
104 % char *AcquireString(const char *source)
106 % A description of each parameter follows:
108 % o source: A character string.
111 MagickExport char *AcquireString(const char *source)
120 if (source != (char *) NULL)
121 length+=strlen(source);
122 if (~length < MaxTextExtent)
123 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
124 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
125 sizeof(*destination));
126 if (destination == (char *) NULL)
127 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
129 if (source != (char *) NULL)
130 (void) memcpy(destination,source,length*sizeof(*destination));
131 destination[length]='\0';
136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
140 % A c q u i r e S t r i n g I n f o %
144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146 % AcquireStringInfo() allocates the StringInfo structure.
148 % The format of the AcquireStringInfo method is:
150 % StringInfo *AcquireStringInfo(const size_t length)
152 % A description of each parameter follows:
154 % o length: the string length.
157 MagickExport StringInfo *AcquireStringInfo(const size_t length)
162 string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
163 if (string_info == (StringInfo *) NULL)
164 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
165 (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
166 string_info->signature=MagickSignature;
167 string_info->length=length;
168 if (string_info->length != 0)
170 string_info->datum=(unsigned char *) NULL;
171 if (~string_info->length >= (MaxTextExtent-1))
172 string_info->datum=(unsigned char *) AcquireQuantumMemory(
173 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
174 if (string_info->datum == (unsigned char *) NULL)
175 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
181 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
185 % B l o b T o S t r i n g I n f o %
189 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
191 % BlobToStringInfo() returns the contents of a blob as a string.
193 % The format of the BlobToStringInfo method is:
195 % StringInfo *BlobToStringInfo(const void *blob,const size_t length)
197 % A description of each parameter follows:
201 % o length: the length of the blob.
204 MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
209 string_info=AcquireStringInfo(0);
210 string_info->length=length;
211 if (~string_info->length >= (MaxTextExtent-1))
212 string_info->datum=(unsigned char *) AcquireQuantumMemory(
213 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
214 if (string_info->datum == (unsigned char *) NULL)
216 string_info=DestroyStringInfo(string_info);
217 return((StringInfo *) NULL);
219 if (blob != (const void *) NULL)
220 (void) memcpy(string_info->datum,blob,length);
225 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
229 % C l o n e S t r i n g %
233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
235 % CloneString() allocates memory for the destination string and copies
236 % the source string to that memory location.
238 % The format of the CloneString method is:
240 % char *CloneString(char **destination,const char *source)
242 % A description of each parameter follows:
244 % o destination: A pointer to a character string.
246 % o source: A character string.
249 MagickExport char *CloneString(char **destination,const char *source)
254 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
255 assert(destination != (char **) NULL);
256 if (source == (const char *) NULL)
258 if (*destination != (char *) NULL)
259 *destination=DestroyString(*destination);
260 return(*destination);
262 if (*destination == (char *) NULL)
264 *destination=AcquireString(source);
265 return(*destination);
267 length=strlen(source);
268 if (~length < MaxTextExtent)
269 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
270 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
271 sizeof(**destination));
272 if (*destination == (char *) NULL)
273 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
275 (void) memcpy(*destination,source,length*sizeof(**destination));
276 (*destination)[length]='\0';
277 return(*destination);
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
285 % C l o n e S t r i n g I n f o %
289 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291 % CloneStringInfo() clones a copy of the StringInfo structure.
293 % The format of the CloneStringInfo method is:
295 % StringInfo *CloneStringInfo(const StringInfo *string_info)
297 % A description of each parameter follows:
299 % o string_info: the string info.
302 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
307 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
308 assert(string_info != (StringInfo *) NULL);
309 assert(string_info->signature == MagickSignature);
310 clone_info=AcquireStringInfo(string_info->length);
311 if (string_info->length != 0)
312 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
321 % C o m p a r e S t r i n g I n f o %
325 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
327 % CompareStringInfo() compares the two datums target and source. It returns
328 % an integer less than, equal to, or greater than zero if target is found,
329 % respectively, to be less than, to match, or be greater than source.
331 % The format of the CompareStringInfo method is:
333 % int CompareStringInfo(const StringInfo *target,const StringInfo *source)
335 % A description of each parameter follows:
337 % o target: the target string.
339 % o source: the source string.
343 static inline size_t MagickMin(const size_t x,const size_t y)
350 MagickExport int CompareStringInfo(const StringInfo *target,
351 const StringInfo *source)
356 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
357 assert(target != (StringInfo *) NULL);
358 assert(target->signature == MagickSignature);
359 assert(source != (StringInfo *) NULL);
360 assert(source->signature == MagickSignature);
361 status=memcmp(target->datum,source->datum,MagickMin(target->length,
365 if (target->length == source->length)
367 return(target->length < source->length ? -1 : 1);
371 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
375 % C o n c a t e n a t e M a g i c k S t r i n g %
379 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
381 % ConcatenateMagickString() concatenates the source string to the destination
382 % string. The destination buffer is always null-terminated even if the
383 % string must be truncated.
385 % The format of the ConcatenateMagickString method is:
387 % size_t ConcatenateMagickString(char *destination,const char *source,
388 % const size_t length)
390 % A description of each parameter follows:
392 % o destination: the destination string.
394 % o source: the source string.
396 % o length: the length of the destination string.
399 MagickExport size_t ConcatenateMagickString(char *destination,
400 const char *source,const size_t length)
414 assert(destination != (char *) NULL);
415 assert(source != (const char *) NULL);
420 while ((i-- != 0) && (*q != '\0'))
422 count=(size_t) (q-destination);
425 return(count+strlen(p));
436 return(count+(p-source));
440 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
444 % C o n c a t e n a t e S t r i n g %
448 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
450 % ConcatenateString() appends a copy of string source, including the
451 % terminating null character, to the end of string destination.
453 % The format of the ConcatenateString method is:
455 % MagickBooleanType ConcatenateString(char **destination,
456 % const char *source)
458 % A description of each parameter follows:
460 % o destination: A pointer to a character string.
462 % o source: A character string.
465 MagickExport MagickBooleanType ConcatenateString(char **destination,
473 assert(destination != (char **) NULL);
474 if (source == (const char *) NULL)
476 if (*destination == (char *) NULL)
478 *destination=AcquireString(source);
481 destination_length=strlen(*destination);
482 source_length=strlen(source);
483 length=destination_length;
484 if (~length < source_length)
485 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
486 length+=source_length;
487 if (~length < MaxTextExtent)
488 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
489 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
490 sizeof(**destination));
491 if (*destination == (char *) NULL)
492 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
493 if (source_length != 0)
494 (void) memcpy((*destination)+destination_length,source,source_length);
495 (*destination)[length]='\0';
500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
504 % C o n c a t e n a t e S t r i n g I n f o %
508 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
510 % ConcatenateStringInfo() concatenates the source string to the destination
513 % The format of the ConcatenateStringInfo method is:
515 % void ConcatenateStringInfo(StringInfo *string_info,
516 % const StringInfo *source)
518 % A description of each parameter follows:
520 % o string_info: the string info.
522 % o source: the source string.
525 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
526 const StringInfo *source)
531 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
532 assert(string_info != (StringInfo *) NULL);
533 assert(string_info->signature == MagickSignature);
534 assert(source != (const StringInfo *) NULL);
535 length=string_info->length;
536 if (~length < source->length)
537 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
538 SetStringInfoLength(string_info,length+source->length);
539 (void) memcpy(string_info->datum+length,source->datum,source->length);
543 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
547 % 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 %
551 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
553 % ConfigureFileToStringInfo() returns the contents of a configure file as a
556 % The format of the ConfigureFileToStringInfo method is:
558 % StringInfo *ConfigureFileToStringInfo(const char *filename)
559 % ExceptionInfo *exception)
561 % A description of each parameter follows:
563 % o filename: the filename.
566 MagickPrivate StringInfo *ConfigureFileToStringInfo(const char *filename)
586 assert(filename != (const char *) NULL);
587 file=open(filename,O_RDONLY | O_BINARY);
589 return((StringInfo *) NULL);
590 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
591 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
594 return((StringInfo *) NULL);
596 length=(size_t) offset;
597 string=(char *) NULL;
598 if (~length >= (MaxTextExtent-1))
599 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
600 if (string == (char *) NULL)
603 return((StringInfo *) NULL);
605 map=MapBlob(file,ReadMode,0,length);
606 if (map != (void *) NULL)
608 (void) memcpy(string,map,length);
609 (void) UnmapBlob(map,length);
619 (void) lseek(file,0,SEEK_SET);
620 for (i=0; i < length; i+=count)
622 count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
634 string=DestroyString(string);
635 return((StringInfo *) NULL);
640 string_info=AcquireStringInfo(0);
641 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
642 string_info->length=length;
643 string_info->datum=(unsigned char *) string;
648 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
652 % C o n s t a n t S t r i n g %
656 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
658 % ConstantString() allocates memory for a string and copies the source string
659 % to that memory location (and returns it). Use it for strings that you do
660 % do not expect to change over its lifetime.
662 % The format of the ConstantString method is:
664 % char *ConstantString(const char *source)
666 % A description of each parameter follows:
668 % o source: A character string.
671 MagickExport char *ConstantString(const char *source)
680 if (source != (char *) NULL)
681 length+=strlen(source);
682 destination=(char *) NULL;
684 destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
685 if (destination == (char *) NULL)
686 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
688 if (source != (char *) NULL)
689 (void) memcpy(destination,source,length*sizeof(*destination));
690 destination[length]='\0';
695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
699 % C o p y M a g i c k S t r i n g %
703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
705 % CopyMagickString() copies the source string to the destination string. The
706 % destination buffer is always null-terminated even if the string must be
707 % truncated. The return value is the minimum of the source string length
708 % or the length parameter.
710 % The format of the CopyMagickString method is:
712 % size_t CopyMagickString(const char *destination,char *source,
713 % const size_t length)
715 % A description of each parameter follows:
717 % o destination: the destination string.
719 % o source: the source string.
721 % o length: the length of the destination string.
724 MagickExport size_t CopyMagickString(char *destination,const char *source,
738 for (n=length; n > 4; n-=4)
742 return((size_t) (p-source-1));
746 return((size_t) (p-source-1));
750 return((size_t) (p-source-1));
754 return((size_t) (p-source-1));
758 for (n--; n != 0; n--)
762 return((size_t) (p-source-1));
767 return((size_t) (p-source-1));
771 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
775 % D e s t r o y S t r i n g %
779 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
781 % DestroyString() destroys memory associated with a string.
783 % The format of the DestroyString method is:
785 % char *DestroyString(char *string)
787 % A description of each parameter follows:
789 % o string: the string.
792 MagickExport char *DestroyString(char *string)
794 return((char *) RelinquishMagickMemory(string));
798 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
802 % D e s t r o y S t r i n g I n f o %
806 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
808 % DestroyStringInfo() destroys memory associated with the StringInfo structure.
810 % The format of the DestroyStringInfo method is:
812 % StringInfo *DestroyStringInfo(StringInfo *string_info)
814 % A description of each parameter follows:
816 % o string_info: the string info.
819 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
821 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
822 assert(string_info != (StringInfo *) NULL);
823 assert(string_info->signature == MagickSignature);
824 if (string_info->datum != (unsigned char *) NULL)
825 string_info->datum=(unsigned char *) RelinquishMagickMemory(
827 string_info->signature=(~MagickSignature);
828 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
833 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
837 % D e s t r o y S t r i n g L i s t %
841 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
843 % DestroyStringList() zeros memory associated with a string list.
845 % The format of the DestroyStringList method is:
847 % char **DestroyStringList(char **list)
849 % A description of each parameter follows:
851 % o list: the string list.
854 MagickExport char **DestroyStringList(char **list)
859 assert(list != (char **) NULL);
860 for (i=0; list[i] != (char *) NULL; i++)
861 list[i]=DestroyString(list[i]);
862 list=(char **) RelinquishMagickMemory(list);
867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
871 % E s c a p e S t r i n g %
875 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
877 % EscapeString() allocates memory for a backslash-escaped version of a
878 % source text string, copies the escaped version of the text to that
879 % memory location while adding backslash characters, and returns the
882 % The format of the EscapeString method is:
884 % char *EscapeString(const char *source,const char escape)
886 % A description of each parameter follows:
888 % o allocate_string: Method EscapeString returns the escaped string.
890 % o source: A character string.
892 % o escape: the quoted string termination character to escape (e.g. '"').
895 MagickExport char *EscapeString(const char *source,const char escape)
909 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
910 assert(source != (const char *) NULL);
911 length=strlen(source);
912 for (p=source; *p != '\0'; p++)
913 if ((*p == '\\') || (*p == escape))
916 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
919 destination=(char *) NULL;
920 if (~length >= (MaxTextExtent-1))
921 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
922 sizeof(*destination));
923 if (destination == (char *) NULL)
924 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
926 if (source != (char *) NULL)
929 for (p=source; *p != '\0'; p++)
931 if ((*p == '\\') || (*p == escape))
941 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
945 % F i l e T o S t r i n g %
949 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
951 % FileToString() returns the contents of a file as a string.
953 % The format of the FileToString method is:
955 % char *FileToString(const char *filename,const size_t extent,
956 % ExceptionInfo *exception)
958 % A description of each parameter follows:
960 % o filename: the filename.
962 % o extent: Maximum length of the string.
964 % o exception: return any errors or warnings in this structure.
967 MagickExport char *FileToString(const char *filename,const size_t extent,
968 ExceptionInfo *exception)
973 assert(filename != (const char *) NULL);
974 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
975 assert(exception != (ExceptionInfo *) NULL);
976 return((char *) FileToBlob(filename,extent,&length,exception));
980 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
984 % F i l e T o S t r i n g I n f o %
988 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
990 % FileToStringInfo() returns the contents of a file as a string.
992 % The format of the FileToStringInfo method is:
994 % StringInfo *FileToStringInfo(const char *filename,const size_t extent,
995 % ExceptionInfo *exception)
997 % A description of each parameter follows:
999 % o filename: the filename.
1001 % o extent: Maximum length of the string.
1003 % o exception: return any errors or warnings in this structure.
1006 MagickExport StringInfo *FileToStringInfo(const char *filename,
1007 const size_t extent,ExceptionInfo *exception)
1012 assert(filename != (const char *) NULL);
1013 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1014 assert(exception != (ExceptionInfo *) NULL);
1015 string_info=AcquireStringInfo(0);
1016 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1017 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1018 if (string_info->datum == (unsigned char *) NULL)
1020 string_info=DestroyStringInfo(string_info);
1021 return((StringInfo *) NULL);
1023 return(string_info);
1027 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1031 % F o r m a t M a g i c k S i z e %
1035 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1037 % FormatMagickSize() converts a size to a human readable format, for example,
1038 % 14k, 234m, 2.7g, or 3.0t. Scaling is done by repetitively dividing by
1041 % The format of the FormatMagickSize method is:
1043 % ssize_t FormatMagickSize(const MagickSizeType size,char *format)
1045 % A description of each parameter follows:
1047 % o size: convert this size to a human readable format.
1049 % o bi: use power of two rather than power of ten.
1051 % o format: human readable format.
1054 MagickPrivate ssize_t FormatMagickSize(const MagickSizeType size,
1055 const MagickBooleanType bi,char *format)
1074 "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1076 *traditional_units[] =
1078 "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1082 units=traditional_units;
1083 if (bi != MagickFalse)
1088 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1089 length=(double) ((MagickOffsetType) size);
1091 length=(double) size;
1093 for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1095 for (j=2; j < 12; j++)
1097 count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
1099 if (strchr(format,'+') == (char *) NULL)
1106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1110 % F o r m a t M a g i c k T i m e %
1114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1116 % FormatMagickTime() returns the specified time in the Internet date/time
1117 % format and the length of the timestamp.
1119 % The format of the FormatMagickTime method is:
1121 % ssize_t FormatMagickTime(const time_t time,const size_t length,
1124 % A description of each parameter follows.
1126 % o time: the time since the Epoch (00:00:00 UTC, January 1, 1970),
1127 % measured in seconds.
1129 % o length: the maximum length of the string.
1131 % o timestamp: Return the Internet date/time here.
1134 MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1147 assert(timestamp != (char *) NULL);
1148 (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1149 (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1150 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1151 (void) localtime_r(&time,&local_time);
1157 my_time=localtime(&time);
1158 if (my_time != (struct tm *) NULL)
1159 (void) memcpy(&local_time,my_time,sizeof(local_time));
1162 #if defined(MAGICKCORE_HAVE_GMTIME_R)
1163 (void) gmtime_r(&time,&gm_time);
1169 my_time=gmtime(&time);
1170 if (my_time != (struct tm *) NULL)
1171 (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1174 timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1175 local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1176 gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1177 (local_time.tm_yday-gm_time.tm_yday)));
1178 count=FormatLocaleString(timestamp,length,
1179 "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1180 local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1181 local_time.tm_min,local_time.tm_sec,(long) timezone);
1186 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1190 % G e t E n v i r o n m e n t V a l u e %
1194 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1196 % GetEnvironmentValue() returns the environment string that matches the
1199 % The format of the GetEnvironmentValue method is:
1201 % char *GetEnvironmentValue(const char *name)
1203 % A description of each parameter follows:
1205 % o name: the environment name.
1208 MagickPrivate char *GetEnvironmentValue(const char *name)
1213 environment=getenv(name);
1214 if (environment == (const char *) NULL)
1215 return((char *) NULL);
1216 return(ConstantString(environment));
1220 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1224 % G e t S t r i n g I n f o D a t u m %
1228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1230 % GetStringInfoDatum() returns the datum associated with the string.
1232 % The format of the GetStringInfoDatum method is:
1234 % unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1236 % A description of each parameter follows:
1238 % o string_info: the string info.
1241 MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1243 assert(string_info != (StringInfo *) NULL);
1244 assert(string_info->signature == MagickSignature);
1245 return(string_info->datum);
1249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1253 % G e t S t r i n g I n f o L e n g t h %
1257 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1259 % GetStringInfoLength() returns the string length.
1261 % The format of the GetStringInfoLength method is:
1263 % size_t GetStringInfoLength(const StringInfo *string_info)
1265 % A description of each parameter follows:
1267 % o string_info: the string info.
1270 MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1272 assert(string_info != (StringInfo *) NULL);
1273 assert(string_info->signature == MagickSignature);
1274 return(string_info->length);
1278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1282 % G e t S t r i n g I n f o P a t h %
1286 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1288 % GetStringInfoPath() returns the path associated with the string.
1290 % The format of the GetStringInfoPath method is:
1292 % const char *GetStringInfoPath(const StringInfo *string_info)
1294 % A description of each parameter follows:
1296 % o string_info: the string info.
1299 MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1301 assert(string_info != (StringInfo *) NULL);
1302 assert(string_info->signature == MagickSignature);
1303 return(string_info->path);
1307 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1311 % L o c a l e C o m p a r e %
1315 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1317 % LocaleCompare() performs a case-insensitive comparison of two strings
1318 % byte-by-byte, according to the ordering of the current locale encoding.
1319 % LocaleCompare returns an integer greater than, equal to, or less than 0,
1320 % if the string pointed to by p is greater than, equal to, or less than the
1321 % string pointed to by q respectively. The sign of a non-zero return value
1322 % is determined by the sign of the difference between the values of the first
1323 % pair of bytes that differ in the strings being compared.
1325 % The format of the LocaleCompare method is:
1327 % int LocaleCompare(const char *p,const char *q)
1329 % A description of each parameter follows:
1331 % o p: A pointer to a character string.
1333 % o q: A pointer to a character string to compare to p.
1336 MagickExport int LocaleCompare(const char *p,const char *q)
1338 if ((p == (char *) NULL) && (q == (char *) NULL))
1340 if (p == (char *) NULL)
1342 if (q == (char *) NULL)
1344 #if defined(MAGICKCORE_HAVE_STRCASECMP)
1345 return(strcasecmp(p,q));
1354 c=(int) *((unsigned char *) p);
1355 d=(int) *((unsigned char *) q);
1356 if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1361 return(AsciiMap[c]-(int) AsciiMap[d]);
1367 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1371 % L o c a l e L o w e r %
1375 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1377 % LocaleLower() transforms all of the characters in the supplied
1378 % null-terminated string, changing all uppercase letters to lowercase.
1380 % The format of the LocaleLower method is:
1382 % void LocaleLower(char *string)
1384 % A description of each parameter follows:
1386 % o string: A pointer to the string to convert to lower-case Locale.
1389 MagickExport void LocaleLower(char *string)
1394 assert(string != (char *) NULL);
1395 for (q=string; *q != '\0'; q++)
1396 *q=(char) tolower((int) *q);
1400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1404 % L o c a l e N C o m p a r e %
1408 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1410 % LocaleNCompare() performs a case-insensitive comparison of two
1411 % strings byte-by-byte, according to the ordering of the current locale
1412 % encoding. LocaleNCompare returns an integer greater than, equal to, or
1413 % less than 0, if the string pointed to by p is greater than, equal to, or
1414 % less than the string pointed to by q respectively. The sign of a non-zero
1415 % return value is determined by the sign of the difference between the
1416 % values of the first pair of bytes that differ in the strings being
1417 % compared. The LocaleNCompare method makes the same comparison as
1418 % LocaleCompare but looks at a maximum of n bytes. Bytes following a
1419 % null byte are not compared.
1421 % The format of the LocaleNCompare method is:
1423 % int LocaleNCompare(const char *p,const char *q,const size_t n)
1425 % A description of each parameter follows:
1427 % o p: A pointer to a character string.
1429 % o q: A pointer to a character string to compare to p.
1431 % o length: the number of characters to compare in strings p and q.
1434 MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1436 if (p == (char *) NULL)
1438 if (q == (char *) NULL)
1440 #if defined(MAGICKCORE_HAVE_STRNCASECMP)
1441 return(strncasecmp(p,q,length));
1451 for (i=length; i != 0; i--)
1453 c=(int) *((unsigned char *) p);
1454 d=(int) *((unsigned char *) q);
1455 if (AsciiMap[c] != AsciiMap[d])
1456 return(AsciiMap[c]-(int) AsciiMap[d]);
1468 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1472 % L o c a l e U p p e r %
1476 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1478 % LocaleUpper() transforms all of the characters in the supplied
1479 % null-terminated string, changing all lowercase letters to uppercase.
1481 % The format of the LocaleUpper method is:
1483 % void LocaleUpper(char *string)
1485 % A description of each parameter follows:
1487 % o string: A pointer to the string to convert to upper-case Locale.
1490 MagickExport void LocaleUpper(char *string)
1495 assert(string != (char *) NULL);
1496 for (q=string; *q != '\0'; q++)
1497 *q=(char) toupper((int) *q);
1501 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1505 % P r i n t S t r i n g I n f o %
1509 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1511 % PrintStringInfo() prints the string.
1513 % The format of the PrintStringInfo method is:
1515 % void PrintStringInfo(FILE *file,const char *id,
1516 % const StringInfo *string_info)
1518 % A description of each parameter follows:
1520 % o file: the file, typically stdout.
1522 % o id: the string id.
1524 % o string_info: the string info.
1527 MagickExport void PrintStringInfo(FILE *file,const char *id,
1528 const StringInfo *string_info)
1537 assert(id != (const char *) NULL);
1538 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
1539 assert(string_info != (StringInfo *) NULL);
1540 assert(string_info->signature == MagickSignature);
1541 p=(char *) string_info->datum;
1542 for (i=0; i < string_info->length; i++)
1544 if (((int) ((unsigned char) *p) < 32) &&
1545 (isspace((int) ((unsigned char) *p)) == 0))
1549 if (i == string_info->length)
1551 (void) fputs((char *) string_info->datum,file);
1552 (void) fputc('\n',file);
1556 Convert string to a HEX list.
1558 p=(char *) string_info->datum;
1559 for (i=0; i < string_info->length; i+=0x14)
1561 (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1562 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1564 (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1565 if ((j % 0x04) == 0)
1566 (void) fputc(' ',file);
1568 for ( ; j <= 0x14; j++)
1570 (void) fputc(' ',file);
1571 (void) fputc(' ',file);
1572 if ((j % 0x04) == 0)
1573 (void) fputc(' ',file);
1575 (void) fputc(' ',file);
1576 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1578 if (isprint((int) ((unsigned char) *p)) != 0)
1579 (void) fputc(*p,file);
1581 (void) fputc('-',file);
1584 (void) fputc('\n',file);
1589 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1593 % R e s e t S t r i n g I n f o %
1597 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1599 % ResetStringInfo() reset the string to all null bytes.
1601 % The format of the ResetStringInfo method is:
1603 % void ResetStringInfo(StringInfo *string_info)
1605 % A description of each parameter follows:
1607 % o string_info: the string info.
1610 MagickExport void ResetStringInfo(StringInfo *string_info)
1612 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1613 assert(string_info != (StringInfo *) NULL);
1614 assert(string_info->signature == MagickSignature);
1615 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1619 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1623 % S e t S t r i n g I n f o %
1627 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1629 % SetStringInfo() copies the source string to the destination string.
1631 % The format of the SetStringInfo method is:
1633 % void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1635 % A description of each parameter follows:
1637 % o string_info: the string info.
1639 % o source: the source string.
1642 MagickExport void SetStringInfo(StringInfo *string_info,
1643 const StringInfo *source)
1645 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1646 assert(string_info != (StringInfo *) NULL);
1647 assert(string_info->signature == MagickSignature);
1648 assert(source != (StringInfo *) NULL);
1649 assert(source->signature == MagickSignature);
1650 if (string_info->length == 0)
1652 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1653 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1658 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1662 % S e t S t r i n g I n f o D a t u m %
1666 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1668 % SetStringInfoDatum() copies bytes from the source string for the length of
1669 % the destination string.
1671 % The format of the SetStringInfoDatum method is:
1673 % void SetStringInfoDatum(StringInfo *string_info,
1674 % const unsigned char *source)
1676 % A description of each parameter follows:
1678 % o string_info: the string info.
1680 % o source: the source string.
1683 MagickExport void SetStringInfoDatum(StringInfo *string_info,
1684 const unsigned char *source)
1686 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1687 assert(string_info != (StringInfo *) NULL);
1688 assert(string_info->signature == MagickSignature);
1689 if (string_info->length != 0)
1690 (void) memcpy(string_info->datum,source,string_info->length);
1694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1698 % S e t S t r i n g I n f o L e n g t h %
1702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1704 % SetStringInfoLength() set the string length to the specified value.
1706 % The format of the SetStringInfoLength method is:
1708 % void SetStringInfoLength(StringInfo *string_info,const size_t length)
1710 % A description of each parameter follows:
1712 % o string_info: the string info.
1714 % o length: the string length.
1717 MagickExport void SetStringInfoLength(StringInfo *string_info,
1718 const size_t length)
1720 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1721 assert(string_info != (StringInfo *) NULL);
1722 assert(string_info->signature == MagickSignature);
1723 if (~length < MaxTextExtent)
1724 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1725 string_info->length=length;
1726 if (string_info->datum == (unsigned char *) NULL)
1727 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1728 MaxTextExtent,sizeof(*string_info->datum));
1730 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1731 length+MaxTextExtent,sizeof(*string_info->datum));
1732 if (string_info->datum == (unsigned char *) NULL)
1733 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1737 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1741 % S e t S t r i n g I n f o D a t u m %
1745 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1747 % SetStringInfoPath() sets the path associated with the string.
1749 % The format of the SetStringInfoPath method is:
1751 % void SetStringInfoPath(StringInfo *string_info,const char *path)
1753 % A description of each parameter follows:
1755 % o string_info: the string info.
1760 MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1762 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1763 assert(string_info != (StringInfo *) NULL);
1764 assert(string_info->signature == MagickSignature);
1765 assert(path != (const char *) NULL);
1766 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1770 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1774 % S p l i t S t r i n g I n f o %
1778 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1780 % SplitStringInfo() splits a string into two and returns it.
1782 % The format of the SplitStringInfo method is:
1784 % StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1786 % A description of each parameter follows:
1788 % o string_info: the string info.
1791 MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1792 const size_t offset)
1797 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1798 assert(string_info != (StringInfo *) NULL);
1799 assert(string_info->signature == MagickSignature);
1800 if (offset > string_info->length)
1801 return((StringInfo *) NULL);
1802 split_info=AcquireStringInfo(offset);
1803 SetStringInfo(split_info,string_info);
1804 (void) memmove(string_info->datum,string_info->datum+offset,
1805 string_info->length-offset+MaxTextExtent);
1806 SetStringInfoLength(string_info,string_info->length-offset);
1811 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1815 % S t r i n g I n f o T o S t r i n g %
1819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1821 % StringInfoToString() converts a string info string to a C string.
1823 % The format of the StringInfoToString method is:
1825 % char *StringInfoToString(const StringInfo *string_info)
1827 % A description of each parameter follows:
1829 % o string_info: the string.
1832 MagickExport char *StringInfoToString(const StringInfo *string_info)
1840 string=(char *) NULL;
1841 length=string_info->length;
1842 if (~length >= (MaxTextExtent-1))
1843 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
1844 if (string == (char *) NULL)
1845 return((char *) NULL);
1846 (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
1847 string[length]='\0';
1852 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1856 % S t r i n g T o A r g v %
1860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1862 % StringToArgv() converts a text string into command line arguments.
1864 % The format of the StringToArgv method is:
1866 % char **StringToArgv(const char *text,int *argc)
1868 % A description of each parameter follows:
1870 % o argv: Method StringToArgv returns the string list unless an error
1871 % occurs, otherwise NULL.
1873 % o text: Specifies the string to segment into a list.
1875 % o argc: This integer pointer returns the number of arguments in the
1879 MagickExport char **StringToArgv(const char *text,int *argc)
1892 if (text == (char *) NULL)
1893 return((char **) NULL);
1895 Determine the number of arguments.
1897 for (p=text; *p != '\0'; )
1899 while (isspace((int) ((unsigned char) *p)) != 0)
1905 for (p++; (*p != '"') && (*p != '\0'); p++) ;
1907 for (p++; (*p != '\'') && (*p != '\0'); p++) ;
1908 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
1912 argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
1913 if (argv == (char **) NULL)
1914 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
1916 Convert string to an ASCII list.
1918 argv[0]=AcquireString("magick");
1920 for (i=1; i < (ssize_t) *argc; i++)
1922 while (isspace((int) ((unsigned char) *p)) != 0)
1928 for (q++; (*q != '"') && (*q != '\0'); q++) ;
1934 for (q++; (*q != '\'') && (*q != '\0'); q++) ;
1937 while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
1939 argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
1941 if (argv[i] == (char *) NULL)
1943 for (i--; i >= 0; i--)
1944 argv[i]=DestroyString(argv[i]);
1945 argv=(char **) RelinquishMagickMemory(argv);
1946 ThrowFatalException(ResourceLimitFatalError,
1947 "UnableToConvertStringToARGV");
1949 (void) memcpy(argv[i],p,(size_t) (q-p));
1952 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
1955 argv[i]=(char *) NULL;
1960 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1964 % S t r i n g I n f o T o H e x S t r i n g %
1968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1970 % StringInfoToHexString() converts a string info string to a C string.
1972 % The format of the StringInfoToHexString method is:
1974 % char *StringInfoToHexString(const StringInfo *string_info)
1976 % A description of each parameter follows:
1978 % o string_info: the string.
1981 MagickExport char *StringInfoToHexString(const StringInfo *string_info)
1986 register const unsigned char
1992 register unsigned char
2001 length=string_info->length;
2002 if (~length < MaxTextExtent)
2003 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2004 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2005 if (string == (char *) NULL)
2006 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2023 p=string_info->datum;
2024 q=(unsigned char *) string;
2025 for (i=0; i < (ssize_t) string_info->length; i++)
2027 *q++=hex_digits[(*p >> 4) & 0x0f];
2028 *q++=hex_digits[*p & 0x0f];
2036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2040 % S t r i n g T o k e n %
2044 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2046 % StringToken() extracts a token a from the string.
2048 % The format of the StringToken method is:
2050 % char *StringToken(const char *delimiters,char **string)
2052 % A description of each parameter follows:
2054 % o delimiters: one or more delimiters.
2056 % o string: return the first token in the string. If none is found, return
2060 MagickExport char *StringToken(const char *delimiters,char **string)
2076 if (p == (char *) NULL)
2077 return((char *) NULL);
2094 } while (d != '\0');
2099 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2103 % S t r i n g T o L i s t %
2107 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2109 % StringToList() converts a text string into a list by segmenting the text
2110 % string at each carriage return discovered. The list is converted to HEX
2111 % characters if any control characters are discovered within the text string.
2113 % The format of the StringToList method is:
2115 % char **StringToList(const char *text)
2117 % A description of each parameter follows:
2119 % o text: Specifies the string to segment into a list.
2122 MagickExport char **StringToList(const char *text)
2136 if (text == (char *) NULL)
2137 return((char **) NULL);
2138 for (p=text; *p != '\0'; p++)
2139 if (((int) ((unsigned char) *p) < 32) &&
2140 (isspace((int) ((unsigned char) *p)) == 0))
2148 Convert string to an ASCII list.
2151 for (p=text; *p != '\0'; p++)
2154 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2156 if (textlist == (char **) NULL)
2157 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2159 for (i=0; i < (ssize_t) lines; i++)
2161 for (q=p; *q != '\0'; q++)
2162 if ((*q == '\r') || (*q == '\n'))
2164 textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2165 sizeof(**textlist));
2166 if (textlist[i] == (char *) NULL)
2167 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2168 (void) memcpy(textlist[i],p,(size_t) (q-p));
2169 textlist[i][q-p]='\0';
2178 hex_string[MaxTextExtent];
2187 Convert string to a HEX list.
2189 lines=(size_t) (strlen(text)/0x14)+1;
2190 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2192 if (textlist == (char **) NULL)
2193 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2195 for (i=0; i < (ssize_t) lines; i++)
2197 textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
2198 sizeof(**textlist));
2199 if (textlist[i] == (char *) NULL)
2200 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2201 (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2203 q=textlist[i]+strlen(textlist[i]);
2204 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2206 (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
2207 (void) CopyMagickString(q,hex_string,MaxTextExtent);
2209 if ((j % 0x04) == 0)
2212 for ( ; j <= 0x14; j++)
2216 if ((j % 0x04) == 0)
2220 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2222 if (isprint((int) ((unsigned char) *p)) != 0)
2231 textlist[i]=(char *) NULL;
2236 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2240 % S t r i n g T o S t r i n g I n f o %
2244 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2246 % StringToStringInfo() converts a string to a StringInfo type.
2248 % The format of the StringToStringInfo method is:
2250 % StringInfo *StringToStringInfo(const char *string)
2252 % A description of each parameter follows:
2254 % o string: The string.
2257 MagickExport StringInfo *StringToStringInfo(const char *string)
2262 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2263 assert(string != (const char *) NULL);
2264 string_info=AcquireStringInfo(strlen(string));
2265 SetStringInfoDatum(string_info,(const unsigned char *) string);
2266 return(string_info);
2270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2274 % S t r i p S t r i n g %
2278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2280 % StripString() strips any whitespace or quotes from the beginning and end of
2281 % a string of characters.
2283 % The format of the StripString method is:
2285 % void StripString(char *message)
2287 % A description of each parameter follows:
2289 % o message: Specifies an array of characters.
2292 MagickExport void StripString(char *message)
2301 assert(message != (char *) NULL);
2302 if (*message == '\0')
2304 length=strlen(message);
2306 while (isspace((int) ((unsigned char) *p)) != 0)
2308 if ((*p == '\'') || (*p == '"'))
2311 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2314 if ((*q == '\'') || (*q == '"'))
2316 (void) memmove(message,p,(size_t) (q-p+1));
2317 message[q-p+1]='\0';
2318 for (p=message; *p != '\0'; p++)
2324 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2328 % S u b s t i t u t e S t r i n g %
2332 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2334 % SubstituteString() performs string substitution on a string, replacing the
2335 % string with the substituted version. Buffer must be allocated from the heap.
2336 % If the string is matched and status, MagickTrue is returned otherwise
2339 % The format of the SubstituteString method is:
2341 % MagickBooleanType SubstituteString(char **string,const char *search,
2342 % const char *replace)
2344 % A description of each parameter follows:
2346 % o string: the string to perform replacements on; replaced with new
2347 % allocation if a replacement is made.
2349 % o search: search for this string.
2351 % o replace: replace any matches with this string.
2354 MagickExport MagickBooleanType SubstituteString(char **string,
2355 const char *search,const char *replace)
2374 for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2376 if (search_extent == 0)
2377 search_extent=strlen(search);
2378 if (strncmp(p,search,search_extent) != 0)
2384 if (replace_extent == 0)
2385 replace_extent=strlen(replace);
2386 if (replace_extent > search_extent)
2389 Make room for the replacement string.
2391 offset=(ssize_t) (p-(*string));
2392 extent=strlen(*string)+replace_extent-search_extent+1;
2393 *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2395 if (*string == (char *) NULL)
2396 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2402 if (search_extent != replace_extent)
2403 (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2404 strlen(p+search_extent)+1);
2405 (void) CopyMagickMemory(p,replace,replace_extent);
2406 p+=replace_extent-1;