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"
55 #include "MagickCore/utility-private.h"
60 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
61 static const unsigned char
64 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
65 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
66 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
67 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
68 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
69 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
70 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
71 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
72 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
73 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
74 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
75 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
76 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
77 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
78 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
79 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
80 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
81 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
82 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
83 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
84 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
85 0xfc, 0xfd, 0xfe, 0xff,
90 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94 % A c q u i r e S t r i n g %
98 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100 % AcquireString() allocates memory for a string and copies the source string
101 % to that memory location (and returns it).
103 % The format of the AcquireString method is:
105 % char *AcquireString(const char *source)
107 % A description of each parameter follows:
109 % o source: A character string.
112 MagickExport char *AcquireString(const char *source)
121 if (source != (char *) NULL)
122 length+=strlen(source);
123 if (~length < MaxTextExtent)
124 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
125 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
126 sizeof(*destination));
127 if (destination == (char *) NULL)
128 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
130 if (source != (char *) NULL)
131 (void) memcpy(destination,source,length*sizeof(*destination));
132 destination[length]='\0';
137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141 % A c q u i r e S t r i n g I n f o %
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
147 % AcquireStringInfo() allocates the StringInfo structure.
149 % The format of the AcquireStringInfo method is:
151 % StringInfo *AcquireStringInfo(const size_t length)
153 % A description of each parameter follows:
155 % o length: the string length.
158 MagickExport StringInfo *AcquireStringInfo(const size_t length)
163 string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
164 if (string_info == (StringInfo *) NULL)
165 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
166 (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
167 string_info->signature=MagickSignature;
168 string_info->length=length;
169 if (string_info->length != 0)
171 string_info->datum=(unsigned char *) NULL;
172 if (~string_info->length >= (MaxTextExtent-1))
173 string_info->datum=(unsigned char *) AcquireQuantumMemory(
174 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
175 if (string_info->datum == (unsigned char *) NULL)
176 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186 % B l o b T o S t r i n g I n f o %
190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
192 % BlobToStringInfo() returns the contents of a blob as a string.
194 % The format of the BlobToStringInfo method is:
196 % StringInfo *BlobToStringInfo(const void *blob,const size_t length)
198 % A description of each parameter follows:
202 % o length: the length of the blob.
205 MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
210 string_info=AcquireStringInfo(0);
211 string_info->length=length;
212 if (~string_info->length >= (MaxTextExtent-1))
213 string_info->datum=(unsigned char *) AcquireQuantumMemory(
214 string_info->length+MaxTextExtent,sizeof(*string_info->datum));
215 if (string_info->datum == (unsigned char *) NULL)
217 string_info=DestroyStringInfo(string_info);
218 return((StringInfo *) NULL);
220 if (blob != (const void *) NULL)
221 (void) memcpy(string_info->datum,blob,length);
226 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
230 % C l o n e S t r i n g %
234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
236 % CloneString() allocates memory for the destination string and copies
237 % the source string to that memory location.
239 % The format of the CloneString method is:
241 % char *CloneString(char **destination,const char *source)
243 % A description of each parameter follows:
245 % o destination: A pointer to a character string.
247 % o source: A character string.
250 MagickExport char *CloneString(char **destination,const char *source)
255 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
256 assert(destination != (char **) NULL);
257 if (source == (const char *) NULL)
259 if (*destination != (char *) NULL)
260 *destination=DestroyString(*destination);
261 return(*destination);
263 if (*destination == (char *) NULL)
265 *destination=AcquireString(source);
266 return(*destination);
268 length=strlen(source);
269 if (~length < MaxTextExtent)
270 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
271 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
272 sizeof(**destination));
273 if (*destination == (char *) NULL)
274 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
276 (void) memcpy(*destination,source,length*sizeof(**destination));
277 (*destination)[length]='\0';
278 return(*destination);
282 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
286 % C l o n e S t r i n g I n f o %
290 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
292 % CloneStringInfo() clones a copy of the StringInfo structure.
294 % The format of the CloneStringInfo method is:
296 % StringInfo *CloneStringInfo(const StringInfo *string_info)
298 % A description of each parameter follows:
300 % o string_info: the string info.
303 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
308 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
309 assert(string_info != (StringInfo *) NULL);
310 assert(string_info->signature == MagickSignature);
311 clone_info=AcquireStringInfo(string_info->length);
312 if (string_info->length != 0)
313 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
318 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
322 % C o m p a r e S t r i n g I n f o %
326 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
328 % CompareStringInfo() compares the two datums target and source. It returns
329 % an integer less than, equal to, or greater than zero if target is found,
330 % respectively, to be less than, to match, or be greater than source.
332 % The format of the CompareStringInfo method is:
334 % int CompareStringInfo(const StringInfo *target,const StringInfo *source)
336 % A description of each parameter follows:
338 % o target: the target string.
340 % o source: the source string.
344 static inline size_t MagickMin(const size_t x,const size_t y)
351 MagickExport int CompareStringInfo(const StringInfo *target,
352 const StringInfo *source)
357 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
358 assert(target != (StringInfo *) NULL);
359 assert(target->signature == MagickSignature);
360 assert(source != (StringInfo *) NULL);
361 assert(source->signature == MagickSignature);
362 status=memcmp(target->datum,source->datum,MagickMin(target->length,
366 if (target->length == source->length)
368 return(target->length < source->length ? -1 : 1);
372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
376 % C o n c a t e n a t e M a g i c k S t r i n g %
380 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
382 % ConcatenateMagickString() concatenates the source string to the destination
383 % string. The destination buffer is always null-terminated even if the
384 % string must be truncated.
386 % The format of the ConcatenateMagickString method is:
388 % size_t ConcatenateMagickString(char *destination,const char *source,
389 % const size_t length)
391 % A description of each parameter follows:
393 % o destination: the destination string.
395 % o source: the source string.
397 % o length: the length of the destination string.
400 MagickExport size_t ConcatenateMagickString(char *destination,
401 const char *source,const size_t length)
415 assert(destination != (char *) NULL);
416 assert(source != (const char *) NULL);
421 while ((i-- != 0) && (*q != '\0'))
423 count=(size_t) (q-destination);
426 return(count+strlen(p));
437 return(count+(p-source));
441 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
445 % C o n c a t e n a t e S t r i n g %
449 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
451 % ConcatenateString() appends a copy of string source, including the
452 % terminating null character, to the end of string destination.
454 % The format of the ConcatenateString method is:
456 % MagickBooleanType ConcatenateString(char **destination,
457 % const char *source)
459 % A description of each parameter follows:
461 % o destination: A pointer to a character string.
463 % o source: A character string.
466 MagickExport MagickBooleanType ConcatenateString(char **destination,
474 assert(destination != (char **) NULL);
475 if (source == (const char *) NULL)
477 if (*destination == (char *) NULL)
479 *destination=AcquireString(source);
482 destination_length=strlen(*destination);
483 source_length=strlen(source);
484 length=destination_length;
485 if (~length < source_length)
486 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
487 length+=source_length;
488 if (~length < MaxTextExtent)
489 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
490 *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
491 sizeof(**destination));
492 if (*destination == (char *) NULL)
493 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
494 if (source_length != 0)
495 (void) memcpy((*destination)+destination_length,source,source_length);
496 (*destination)[length]='\0';
501 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
505 % C o n c a t e n a t e S t r i n g I n f o %
509 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
511 % ConcatenateStringInfo() concatenates the source string to the destination
514 % The format of the ConcatenateStringInfo method is:
516 % void ConcatenateStringInfo(StringInfo *string_info,
517 % const StringInfo *source)
519 % A description of each parameter follows:
521 % o string_info: the string info.
523 % o source: the source string.
526 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
527 const StringInfo *source)
532 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
533 assert(string_info != (StringInfo *) NULL);
534 assert(string_info->signature == MagickSignature);
535 assert(source != (const StringInfo *) NULL);
536 length=string_info->length;
537 if (~length < source->length)
538 ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
539 SetStringInfoLength(string_info,length+source->length);
540 (void) memcpy(string_info->datum+length,source->datum,source->length);
544 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
548 % 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 %
552 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
554 % ConfigureFileToStringInfo() returns the contents of a configure file as a
557 % The format of the ConfigureFileToStringInfo method is:
559 % StringInfo *ConfigureFileToStringInfo(const char *filename)
560 % ExceptionInfo *exception)
562 % A description of each parameter follows:
564 % o filename: the filename.
567 MagickPrivate StringInfo *ConfigureFileToStringInfo(const char *filename)
587 assert(filename != (const char *) NULL);
588 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
590 return((StringInfo *) NULL);
591 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
592 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
595 return((StringInfo *) NULL);
597 length=(size_t) offset;
598 string=(char *) NULL;
599 if (~length >= (MaxTextExtent-1))
600 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
601 if (string == (char *) NULL)
604 return((StringInfo *) NULL);
606 map=MapBlob(file,ReadMode,0,length);
607 if (map != (void *) NULL)
609 (void) memcpy(string,map,length);
610 (void) UnmapBlob(map,length);
620 (void) lseek(file,0,SEEK_SET);
621 for (i=0; i < length; i+=count)
623 count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
635 string=DestroyString(string);
636 return((StringInfo *) NULL);
641 string_info=AcquireStringInfo(0);
642 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
643 string_info->length=length;
644 string_info->datum=(unsigned char *) string;
649 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
653 % C o n s t a n t S t r i n g %
657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
659 % ConstantString() allocates memory for a string and copies the source string
660 % to that memory location (and returns it). Use it for strings that you do
661 % do not expect to change over its lifetime.
663 % The format of the ConstantString method is:
665 % char *ConstantString(const char *source)
667 % A description of each parameter follows:
669 % o source: A character string.
672 MagickExport char *ConstantString(const char *source)
681 if (source != (char *) NULL)
682 length+=strlen(source);
683 destination=(char *) NULL;
685 destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
686 if (destination == (char *) NULL)
687 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
689 if (source != (char *) NULL)
690 (void) memcpy(destination,source,length*sizeof(*destination));
691 destination[length]='\0';
696 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
700 % C o p y M a g i c k S t r i n g %
704 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
706 % CopyMagickString() copies the source string to the destination string. The
707 % destination buffer is always null-terminated even if the string must be
708 % truncated. The return value is the minimum of the source string length
709 % or the length parameter.
711 % The format of the CopyMagickString method is:
713 % size_t CopyMagickString(const char *destination,char *source,
714 % const size_t length)
716 % A description of each parameter follows:
718 % o destination: the destination string.
720 % o source: the source string.
722 % o length: the length of the destination string.
725 MagickExport size_t CopyMagickString(char *destination,const char *source,
739 for (n=length; n > 4; n-=4)
743 return((size_t) (p-source-1));
747 return((size_t) (p-source-1));
751 return((size_t) (p-source-1));
755 return((size_t) (p-source-1));
759 for (n--; n != 0; n--)
763 return((size_t) (p-source-1));
768 return((size_t) (p-source-1));
772 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
776 % D e s t r o y S t r i n g %
780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
782 % DestroyString() destroys memory associated with a string.
784 % The format of the DestroyString method is:
786 % char *DestroyString(char *string)
788 % A description of each parameter follows:
790 % o string: the string.
793 MagickExport char *DestroyString(char *string)
795 return((char *) RelinquishMagickMemory(string));
799 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
803 % D e s t r o y S t r i n g I n f o %
807 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
809 % DestroyStringInfo() destroys memory associated with the StringInfo structure.
811 % The format of the DestroyStringInfo method is:
813 % StringInfo *DestroyStringInfo(StringInfo *string_info)
815 % A description of each parameter follows:
817 % o string_info: the string info.
820 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
822 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
823 assert(string_info != (StringInfo *) NULL);
824 assert(string_info->signature == MagickSignature);
825 if (string_info->datum != (unsigned char *) NULL)
826 string_info->datum=(unsigned char *) RelinquishMagickMemory(
828 string_info->signature=(~MagickSignature);
829 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
834 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
838 % D e s t r o y S t r i n g L i s t %
842 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844 % DestroyStringList() zeros memory associated with a string list.
846 % The format of the DestroyStringList method is:
848 % char **DestroyStringList(char **list)
850 % A description of each parameter follows:
852 % o list: the string list.
855 MagickExport char **DestroyStringList(char **list)
860 assert(list != (char **) NULL);
861 for (i=0; list[i] != (char *) NULL; i++)
862 list[i]=DestroyString(list[i]);
863 list=(char **) RelinquishMagickMemory(list);
868 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
872 % E s c a p e S t r i n g %
876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
878 % EscapeString() allocates memory for a backslash-escaped version of a
879 % source text string, copies the escaped version of the text to that
880 % memory location while adding backslash characters, and returns the
883 % The format of the EscapeString method is:
885 % char *EscapeString(const char *source,const char escape)
887 % A description of each parameter follows:
889 % o allocate_string: Method EscapeString returns the escaped string.
891 % o source: A character string.
893 % o escape: the quoted string termination character to escape (e.g. '"').
896 MagickExport char *EscapeString(const char *source,const char escape)
910 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
911 assert(source != (const char *) NULL);
912 length=strlen(source);
913 for (p=source; *p != '\0'; p++)
914 if ((*p == '\\') || (*p == escape))
917 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
920 destination=(char *) NULL;
921 if (~length >= (MaxTextExtent-1))
922 destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
923 sizeof(*destination));
924 if (destination == (char *) NULL)
925 ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
927 if (source != (char *) NULL)
930 for (p=source; *p != '\0'; p++)
932 if ((*p == '\\') || (*p == escape))
942 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
946 % F i l e T o S t r i n g %
950 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
952 % FileToString() returns the contents of a file as a string.
954 % The format of the FileToString method is:
956 % char *FileToString(const char *filename,const size_t extent,
957 % ExceptionInfo *exception)
959 % A description of each parameter follows:
961 % o filename: the filename.
963 % o extent: Maximum length of the string.
965 % o exception: return any errors or warnings in this structure.
968 MagickExport char *FileToString(const char *filename,const size_t extent,
969 ExceptionInfo *exception)
974 assert(filename != (const char *) NULL);
975 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
976 assert(exception != (ExceptionInfo *) NULL);
977 return((char *) FileToBlob(filename,extent,&length,exception));
981 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
985 % F i l e T o S t r i n g I n f o %
989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
991 % FileToStringInfo() returns the contents of a file as a string.
993 % The format of the FileToStringInfo method is:
995 % StringInfo *FileToStringInfo(const char *filename,const size_t extent,
996 % ExceptionInfo *exception)
998 % A description of each parameter follows:
1000 % o filename: the filename.
1002 % o extent: Maximum length of the string.
1004 % o exception: return any errors or warnings in this structure.
1007 MagickExport StringInfo *FileToStringInfo(const char *filename,
1008 const size_t extent,ExceptionInfo *exception)
1013 assert(filename != (const char *) NULL);
1014 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1015 assert(exception != (ExceptionInfo *) NULL);
1016 string_info=AcquireStringInfo(0);
1017 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1018 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1019 if (string_info->datum == (unsigned char *) NULL)
1021 string_info=DestroyStringInfo(string_info);
1022 return((StringInfo *) NULL);
1024 return(string_info);
1028 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1032 % F o r m a t M a g i c k S i z e %
1036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1038 % FormatMagickSize() converts a size to a human readable format, for example,
1039 % 14k, 234m, 2.7g, or 3.0t. Scaling is done by repetitively dividing by
1042 % The format of the FormatMagickSize method is:
1044 % ssize_t FormatMagickSize(const MagickSizeType size,char *format)
1046 % A description of each parameter follows:
1048 % o size: convert this size to a human readable format.
1050 % o bi: use power of two rather than power of ten.
1052 % o format: human readable format.
1055 MagickPrivate ssize_t FormatMagickSize(const MagickSizeType size,
1056 const MagickBooleanType bi,char *format)
1075 "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1077 *traditional_units[] =
1079 "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1083 units=traditional_units;
1084 if (bi != MagickFalse)
1089 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1090 length=(double) ((MagickOffsetType) size);
1092 length=(double) size;
1094 for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1096 for (j=2; j < 12; j++)
1098 count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
1100 if (strchr(format,'+') == (char *) NULL)
1107 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1111 % F o r m a t M a g i c k T i m e %
1115 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1117 % FormatMagickTime() returns the specified time in the Internet date/time
1118 % format and the length of the timestamp.
1120 % The format of the FormatMagickTime method is:
1122 % ssize_t FormatMagickTime(const time_t time,const size_t length,
1125 % A description of each parameter follows.
1127 % o time: the time since the Epoch (00:00:00 UTC, January 1, 1970),
1128 % measured in seconds.
1130 % o length: the maximum length of the string.
1132 % o timestamp: Return the Internet date/time here.
1135 MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1148 assert(timestamp != (char *) NULL);
1149 (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1150 (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1151 #if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1152 (void) localtime_r(&time,&local_time);
1158 my_time=localtime(&time);
1159 if (my_time != (struct tm *) NULL)
1160 (void) memcpy(&local_time,my_time,sizeof(local_time));
1163 #if defined(MAGICKCORE_HAVE_GMTIME_R)
1164 (void) gmtime_r(&time,&gm_time);
1170 my_time=gmtime(&time);
1171 if (my_time != (struct tm *) NULL)
1172 (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1175 timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1176 local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1177 gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1178 (local_time.tm_yday-gm_time.tm_yday)));
1179 count=FormatLocaleString(timestamp,length,
1180 "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1181 local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1182 local_time.tm_min,local_time.tm_sec,(long) timezone);
1187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1191 % G e t E n v i r o n m e n t V a l u e %
1195 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1197 % GetEnvironmentValue() returns the environment string that matches the
1200 % The format of the GetEnvironmentValue method is:
1202 % char *GetEnvironmentValue(const char *name)
1204 % A description of each parameter follows:
1206 % o name: the environment name.
1209 MagickPrivate char *GetEnvironmentValue(const char *name)
1214 environment=getenv(name);
1215 if (environment == (const char *) NULL)
1216 return((char *) NULL);
1217 return(ConstantString(environment));
1221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1225 % G e t S t r i n g I n f o D a t u m %
1229 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1231 % GetStringInfoDatum() returns the datum associated with the string.
1233 % The format of the GetStringInfoDatum method is:
1235 % unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1237 % A description of each parameter follows:
1239 % o string_info: the string info.
1242 MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1244 assert(string_info != (StringInfo *) NULL);
1245 assert(string_info->signature == MagickSignature);
1246 return(string_info->datum);
1250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1254 % G e t S t r i n g I n f o L e n g t h %
1258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1260 % GetStringInfoLength() returns the string length.
1262 % The format of the GetStringInfoLength method is:
1264 % size_t GetStringInfoLength(const StringInfo *string_info)
1266 % A description of each parameter follows:
1268 % o string_info: the string info.
1271 MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1273 assert(string_info != (StringInfo *) NULL);
1274 assert(string_info->signature == MagickSignature);
1275 return(string_info->length);
1279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1283 % G e t S t r i n g I n f o P a t h %
1287 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1289 % GetStringInfoPath() returns the path associated with the string.
1291 % The format of the GetStringInfoPath method is:
1293 % const char *GetStringInfoPath(const StringInfo *string_info)
1295 % A description of each parameter follows:
1297 % o string_info: the string info.
1300 MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1302 assert(string_info != (StringInfo *) NULL);
1303 assert(string_info->signature == MagickSignature);
1304 return(string_info->path);
1308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1312 % L o c a l e C o m p a r e %
1316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1318 % LocaleCompare() performs a case-insensitive comparison of two strings
1319 % byte-by-byte, according to the ordering of the current locale encoding.
1320 % LocaleCompare returns an integer greater than, equal to, or less than 0,
1321 % if the string pointed to by p is greater than, equal to, or less than the
1322 % string pointed to by q respectively. The sign of a non-zero return value
1323 % is determined by the sign of the difference between the values of the first
1324 % pair of bytes that differ in the strings being compared.
1326 % The format of the LocaleCompare method is:
1328 % int LocaleCompare(const char *p,const char *q)
1330 % A description of each parameter follows:
1332 % o p: A pointer to a character string.
1334 % o q: A pointer to a character string to compare to p.
1337 MagickExport int LocaleCompare(const char *p,const char *q)
1339 if ((p == (char *) NULL) && (q == (char *) NULL))
1341 if (p == (char *) NULL)
1343 if (q == (char *) NULL)
1345 #if defined(MAGICKCORE_HAVE_STRCASECMP)
1346 return(strcasecmp(p,q));
1355 c=(int) *((unsigned char *) p);
1356 d=(int) *((unsigned char *) q);
1357 if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1362 return(AsciiMap[c]-(int) AsciiMap[d]);
1368 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1372 % L o c a l e L o w e r %
1376 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1378 % LocaleLower() transforms all of the characters in the supplied
1379 % null-terminated string, changing all uppercase letters to lowercase.
1381 % The format of the LocaleLower method is:
1383 % void LocaleLower(char *string)
1385 % A description of each parameter follows:
1387 % o string: A pointer to the string to convert to lower-case Locale.
1390 MagickExport void LocaleLower(char *string)
1395 assert(string != (char *) NULL);
1396 for (q=string; *q != '\0'; q++)
1397 *q=(char) tolower((int) *q);
1401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1405 % L o c a l e N C o m p a r e %
1409 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1411 % LocaleNCompare() performs a case-insensitive comparison of two
1412 % strings byte-by-byte, according to the ordering of the current locale
1413 % encoding. LocaleNCompare returns an integer greater than, equal to, or
1414 % less than 0, if the string pointed to by p is greater than, equal to, or
1415 % less than the string pointed to by q respectively. The sign of a non-zero
1416 % return value is determined by the sign of the difference between the
1417 % values of the first pair of bytes that differ in the strings being
1418 % compared. The LocaleNCompare method makes the same comparison as
1419 % LocaleCompare but looks at a maximum of n bytes. Bytes following a
1420 % null byte are not compared.
1422 % The format of the LocaleNCompare method is:
1424 % int LocaleNCompare(const char *p,const char *q,const size_t n)
1426 % A description of each parameter follows:
1428 % o p: A pointer to a character string.
1430 % o q: A pointer to a character string to compare to p.
1432 % o length: the number of characters to compare in strings p and q.
1435 MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1437 if (p == (char *) NULL)
1439 if (q == (char *) NULL)
1441 #if defined(MAGICKCORE_HAVE_STRNCASECMP)
1442 return(strncasecmp(p,q,length));
1452 for (i=length; i != 0; i--)
1454 c=(int) *((unsigned char *) p);
1455 d=(int) *((unsigned char *) q);
1456 if (AsciiMap[c] != AsciiMap[d])
1457 return(AsciiMap[c]-(int) AsciiMap[d]);
1469 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1473 % L o c a l e U p p e r %
1477 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1479 % LocaleUpper() transforms all of the characters in the supplied
1480 % null-terminated string, changing all lowercase letters to uppercase.
1482 % The format of the LocaleUpper method is:
1484 % void LocaleUpper(char *string)
1486 % A description of each parameter follows:
1488 % o string: A pointer to the string to convert to upper-case Locale.
1491 MagickExport void LocaleUpper(char *string)
1496 assert(string != (char *) NULL);
1497 for (q=string; *q != '\0'; q++)
1498 *q=(char) toupper((int) *q);
1502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1506 % P r i n t S t r i n g I n f o %
1510 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1512 % PrintStringInfo() prints the string.
1514 % The format of the PrintStringInfo method is:
1516 % void PrintStringInfo(FILE *file,const char *id,
1517 % const StringInfo *string_info)
1519 % A description of each parameter follows:
1521 % o file: the file, typically stdout.
1523 % o id: the string id.
1525 % o string_info: the string info.
1528 MagickExport void PrintStringInfo(FILE *file,const char *id,
1529 const StringInfo *string_info)
1538 assert(id != (const char *) NULL);
1539 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
1540 assert(string_info != (StringInfo *) NULL);
1541 assert(string_info->signature == MagickSignature);
1542 p=(char *) string_info->datum;
1543 for (i=0; i < string_info->length; i++)
1545 if (((int) ((unsigned char) *p) < 32) &&
1546 (isspace((int) ((unsigned char) *p)) == 0))
1550 if (i == string_info->length)
1552 (void) fputs((char *) string_info->datum,file);
1553 (void) fputc('\n',file);
1557 Convert string to a HEX list.
1559 p=(char *) string_info->datum;
1560 for (i=0; i < string_info->length; i+=0x14)
1562 (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1563 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1565 (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1566 if ((j % 0x04) == 0)
1567 (void) fputc(' ',file);
1569 for ( ; j <= 0x14; j++)
1571 (void) fputc(' ',file);
1572 (void) fputc(' ',file);
1573 if ((j % 0x04) == 0)
1574 (void) fputc(' ',file);
1576 (void) fputc(' ',file);
1577 for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1579 if (isprint((int) ((unsigned char) *p)) != 0)
1580 (void) fputc(*p,file);
1582 (void) fputc('-',file);
1585 (void) fputc('\n',file);
1590 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1594 % R e s e t S t r i n g I n f o %
1598 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1600 % ResetStringInfo() reset the string to all null bytes.
1602 % The format of the ResetStringInfo method is:
1604 % void ResetStringInfo(StringInfo *string_info)
1606 % A description of each parameter follows:
1608 % o string_info: the string info.
1611 MagickExport void ResetStringInfo(StringInfo *string_info)
1613 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1614 assert(string_info != (StringInfo *) NULL);
1615 assert(string_info->signature == MagickSignature);
1616 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1624 % S e t S t r i n g I n f o %
1628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1630 % SetStringInfo() copies the source string to the destination string.
1632 % The format of the SetStringInfo method is:
1634 % void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1636 % A description of each parameter follows:
1638 % o string_info: the string info.
1640 % o source: the source string.
1643 MagickExport void SetStringInfo(StringInfo *string_info,
1644 const StringInfo *source)
1646 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1647 assert(string_info != (StringInfo *) NULL);
1648 assert(string_info->signature == MagickSignature);
1649 assert(source != (StringInfo *) NULL);
1650 assert(source->signature == MagickSignature);
1651 if (string_info->length == 0)
1653 (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1654 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1663 % S e t S t r i n g I n f o D a t u m %
1667 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1669 % SetStringInfoDatum() copies bytes from the source string for the length of
1670 % the destination string.
1672 % The format of the SetStringInfoDatum method is:
1674 % void SetStringInfoDatum(StringInfo *string_info,
1675 % const unsigned char *source)
1677 % A description of each parameter follows:
1679 % o string_info: the string info.
1681 % o source: the source string.
1684 MagickExport void SetStringInfoDatum(StringInfo *string_info,
1685 const unsigned char *source)
1687 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1688 assert(string_info != (StringInfo *) NULL);
1689 assert(string_info->signature == MagickSignature);
1690 if (string_info->length != 0)
1691 (void) memcpy(string_info->datum,source,string_info->length);
1695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1699 % S e t S t r i n g I n f o L e n g t h %
1703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1705 % SetStringInfoLength() set the string length to the specified value.
1707 % The format of the SetStringInfoLength method is:
1709 % void SetStringInfoLength(StringInfo *string_info,const size_t length)
1711 % A description of each parameter follows:
1713 % o string_info: the string info.
1715 % o length: the string length.
1718 MagickExport void SetStringInfoLength(StringInfo *string_info,
1719 const size_t length)
1721 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1722 assert(string_info != (StringInfo *) NULL);
1723 assert(string_info->signature == MagickSignature);
1724 if (~length < MaxTextExtent)
1725 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1726 string_info->length=length;
1727 if (string_info->datum == (unsigned char *) NULL)
1728 string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1729 MaxTextExtent,sizeof(*string_info->datum));
1731 string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1732 length+MaxTextExtent,sizeof(*string_info->datum));
1733 if (string_info->datum == (unsigned char *) NULL)
1734 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1738 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1742 % S e t S t r i n g I n f o D a t u m %
1746 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1748 % SetStringInfoPath() sets the path associated with the string.
1750 % The format of the SetStringInfoPath method is:
1752 % void SetStringInfoPath(StringInfo *string_info,const char *path)
1754 % A description of each parameter follows:
1756 % o string_info: the string info.
1761 MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1763 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1764 assert(string_info != (StringInfo *) NULL);
1765 assert(string_info->signature == MagickSignature);
1766 assert(path != (const char *) NULL);
1767 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1771 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1775 % S p l i t S t r i n g I n f o %
1779 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1781 % SplitStringInfo() splits a string into two and returns it.
1783 % The format of the SplitStringInfo method is:
1785 % StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1787 % A description of each parameter follows:
1789 % o string_info: the string info.
1792 MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1793 const size_t offset)
1798 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1799 assert(string_info != (StringInfo *) NULL);
1800 assert(string_info->signature == MagickSignature);
1801 if (offset > string_info->length)
1802 return((StringInfo *) NULL);
1803 split_info=AcquireStringInfo(offset);
1804 SetStringInfo(split_info,string_info);
1805 (void) memmove(string_info->datum,string_info->datum+offset,
1806 string_info->length-offset+MaxTextExtent);
1807 SetStringInfoLength(string_info,string_info->length-offset);
1812 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1816 % S t r i n g I n f o T o S t r i n g %
1820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1822 % StringInfoToString() converts a string info string to a C string.
1824 % The format of the StringInfoToString method is:
1826 % char *StringInfoToString(const StringInfo *string_info)
1828 % A description of each parameter follows:
1830 % o string_info: the string.
1833 MagickExport char *StringInfoToString(const StringInfo *string_info)
1841 string=(char *) NULL;
1842 length=string_info->length;
1843 if (~length >= (MaxTextExtent-1))
1844 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
1845 if (string == (char *) NULL)
1846 return((char *) NULL);
1847 (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
1848 string[length]='\0';
1853 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1857 % S t r i n g T o A r g v %
1861 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1863 % StringToArgv() converts a text string into command line arguments.
1865 % The format of the StringToArgv method is:
1867 % char **StringToArgv(const char *text,int *argc)
1869 % A description of each parameter follows:
1871 % o argv: Method StringToArgv returns the string list unless an error
1872 % occurs, otherwise NULL.
1874 % o text: Specifies the string to segment into a list.
1876 % o argc: This integer pointer returns the number of arguments in the
1880 MagickExport char **StringToArgv(const char *text,int *argc)
1893 if (text == (char *) NULL)
1894 return((char **) NULL);
1896 Determine the number of arguments.
1898 for (p=text; *p != '\0'; )
1900 while (isspace((int) ((unsigned char) *p)) != 0)
1906 for (p++; (*p != '"') && (*p != '\0'); p++) ;
1908 for (p++; (*p != '\'') && (*p != '\0'); p++) ;
1909 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
1913 argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
1914 if (argv == (char **) NULL)
1915 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
1917 Convert string to an ASCII list.
1919 argv[0]=AcquireString("magick");
1921 for (i=1; i < (ssize_t) *argc; i++)
1923 while (isspace((int) ((unsigned char) *p)) != 0)
1929 for (q++; (*q != '"') && (*q != '\0'); q++) ;
1935 for (q++; (*q != '\'') && (*q != '\0'); q++) ;
1938 while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
1940 argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
1942 if (argv[i] == (char *) NULL)
1944 for (i--; i >= 0; i--)
1945 argv[i]=DestroyString(argv[i]);
1946 argv=(char **) RelinquishMagickMemory(argv);
1947 ThrowFatalException(ResourceLimitFatalError,
1948 "UnableToConvertStringToARGV");
1950 (void) memcpy(argv[i],p,(size_t) (q-p));
1953 while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
1956 argv[i]=(char *) NULL;
1961 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1965 % S t r i n g I n f o T o H e x S t r i n g %
1969 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1971 % StringInfoToHexString() converts a string info string to a C string.
1973 % The format of the StringInfoToHexString method is:
1975 % char *StringInfoToHexString(const StringInfo *string_info)
1977 % A description of each parameter follows:
1979 % o string_info: the string.
1982 MagickExport char *StringInfoToHexString(const StringInfo *string_info)
1987 register const unsigned char
1993 register unsigned char
2002 length=string_info->length;
2003 if (~length < MaxTextExtent)
2004 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2005 string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2006 if (string == (char *) NULL)
2007 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2024 p=string_info->datum;
2025 q=(unsigned char *) string;
2026 for (i=0; i < (ssize_t) string_info->length; i++)
2028 *q++=hex_digits[(*p >> 4) & 0x0f];
2029 *q++=hex_digits[*p & 0x0f];
2037 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2041 % S t r i n g T o k e n %
2045 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2047 % StringToken() extracts a token a from the string.
2049 % The format of the StringToken method is:
2051 % char *StringToken(const char *delimiters,char **string)
2053 % A description of each parameter follows:
2055 % o delimiters: one or more delimiters.
2057 % o string: return the first token in the string. If none is found, return
2061 MagickExport char *StringToken(const char *delimiters,char **string)
2077 if (p == (char *) NULL)
2078 return((char *) NULL);
2095 } while (d != '\0');
2100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2104 % S t r i n g T o L i s t %
2108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2110 % StringToList() converts a text string into a list by segmenting the text
2111 % string at each carriage return discovered. The list is converted to HEX
2112 % characters if any control characters are discovered within the text string.
2114 % The format of the StringToList method is:
2116 % char **StringToList(const char *text)
2118 % A description of each parameter follows:
2120 % o text: Specifies the string to segment into a list.
2123 MagickExport char **StringToList(const char *text)
2137 if (text == (char *) NULL)
2138 return((char **) NULL);
2139 for (p=text; *p != '\0'; p++)
2140 if (((int) ((unsigned char) *p) < 32) &&
2141 (isspace((int) ((unsigned char) *p)) == 0))
2149 Convert string to an ASCII list.
2152 for (p=text; *p != '\0'; p++)
2155 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2157 if (textlist == (char **) NULL)
2158 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2160 for (i=0; i < (ssize_t) lines; i++)
2162 for (q=p; *q != '\0'; q++)
2163 if ((*q == '\r') || (*q == '\n'))
2165 textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2166 sizeof(**textlist));
2167 if (textlist[i] == (char *) NULL)
2168 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2169 (void) memcpy(textlist[i],p,(size_t) (q-p));
2170 textlist[i][q-p]='\0';
2179 hex_string[MaxTextExtent];
2188 Convert string to a HEX list.
2190 lines=(size_t) (strlen(text)/0x14)+1;
2191 textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2193 if (textlist == (char **) NULL)
2194 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2196 for (i=0; i < (ssize_t) lines; i++)
2198 textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
2199 sizeof(**textlist));
2200 if (textlist[i] == (char *) NULL)
2201 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2202 (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2204 q=textlist[i]+strlen(textlist[i]);
2205 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2207 (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
2208 (void) CopyMagickString(q,hex_string,MaxTextExtent);
2210 if ((j % 0x04) == 0)
2213 for ( ; j <= 0x14; j++)
2217 if ((j % 0x04) == 0)
2221 for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2223 if (isprint((int) ((unsigned char) *p)) != 0)
2232 textlist[i]=(char *) NULL;
2237 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2241 % S t r i n g T o S t r i n g I n f o %
2245 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2247 % StringToStringInfo() converts a string to a StringInfo type.
2249 % The format of the StringToStringInfo method is:
2251 % StringInfo *StringToStringInfo(const char *string)
2253 % A description of each parameter follows:
2255 % o string: The string.
2258 MagickExport StringInfo *StringToStringInfo(const char *string)
2263 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2264 assert(string != (const char *) NULL);
2265 string_info=AcquireStringInfo(strlen(string));
2266 SetStringInfoDatum(string_info,(const unsigned char *) string);
2267 return(string_info);
2271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2275 % S t r i p S t r i n g %
2279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2281 % StripString() strips any whitespace or quotes from the beginning and end of
2282 % a string of characters.
2284 % The format of the StripString method is:
2286 % void StripString(char *message)
2288 % A description of each parameter follows:
2290 % o message: Specifies an array of characters.
2293 MagickExport void StripString(char *message)
2302 assert(message != (char *) NULL);
2303 if (*message == '\0')
2305 length=strlen(message);
2307 while (isspace((int) ((unsigned char) *p)) != 0)
2309 if ((*p == '\'') || (*p == '"'))
2312 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2315 if ((*q == '\'') || (*q == '"'))
2317 (void) memmove(message,p,(size_t) (q-p+1));
2318 message[q-p+1]='\0';
2319 for (p=message; *p != '\0'; p++)
2325 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2329 % S u b s t i t u t e S t r i n g %
2333 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2335 % SubstituteString() performs string substitution on a string, replacing the
2336 % string with the substituted version. Buffer must be allocated from the heap.
2337 % If the string is matched and status, MagickTrue is returned otherwise
2340 % The format of the SubstituteString method is:
2342 % MagickBooleanType SubstituteString(char **string,const char *search,
2343 % const char *replace)
2345 % A description of each parameter follows:
2347 % o string: the string to perform replacements on; replaced with new
2348 % allocation if a replacement is made.
2350 % o search: search for this string.
2352 % o replace: replace any matches with this string.
2355 MagickExport MagickBooleanType SubstituteString(char **string,
2356 const char *search,const char *replace)
2375 for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2377 if (search_extent == 0)
2378 search_extent=strlen(search);
2379 if (strncmp(p,search,search_extent) != 0)
2385 if (replace_extent == 0)
2386 replace_extent=strlen(replace);
2387 if (replace_extent > search_extent)
2390 Make room for the replacement string.
2392 offset=(ssize_t) (p-(*string));
2393 extent=strlen(*string)+replace_extent-search_extent+1;
2394 *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2396 if (*string == (char *) NULL)
2397 ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2403 if (search_extent != replace_extent)
2404 (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2405 strlen(p+search_extent)+1);
2406 (void) CopyMagickMemory(p,replace,replace_extent);
2407 p+=replace_extent-1;