string.c revision 104f8932a48379d3355160642b3de6f0611a7d19
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%                  SSSSS   TTTTT  RRRR   IIIII  N   N   GGGG                  %
7%                  SS        T    R   R    I    NN  N  G                      %
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                  %
11%                                                                             %
12%                                                                             %
13%                        MagickCore String Methods                            %
14%                                                                             %
15%                             Software Design                                 %
16%                               John Cristy                                   %
17%                               August 2003                                   %
18%                                                                             %
19%                                                                             %
20%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
21%  dedicated to making software imaging solutions freely available.           %
22%                                                                             %
23%  You may not use this file except in compliance with the license.  You may  %
24%  obtain a copy of the license at                                            %
25%                                                                             %
26%    http://www.imagemagick.org/script/license.php                            %
27%                                                                             %
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.                                             %
33%                                                                             %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37*/
38
39/*
40  include declarations.
41*/
42#include "MagickCore/studio.h"
43#include "MagickCore/blob.h"
44#include "MagickCore/blob-private.h"
45#include "MagickCore/exception.h"
46#include "MagickCore/exception-private.h"
47#include "MagickCore/list.h"
48#include "MagickCore/locale_.h"
49#include "MagickCore/log.h"
50#include "MagickCore/memory_.h"
51#include "MagickCore/nt-base-private.h"
52#include "MagickCore/property.h"
53#include "MagickCore/resource_.h"
54#include "MagickCore/signature-private.h"
55#include "MagickCore/string_.h"
56#include "MagickCore/string-private.h"
57#include "MagickCore/utility-private.h"
58
59/*
60  static declarations.
61*/
62#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
63static const unsigned char
64  asciimap[] =
65  {
66    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
67    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
68    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
69    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
70    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
71    0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
72    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
73    0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
74    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
75    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
76    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
77    0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
78    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
79    0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
80    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
81    0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
82    0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
83    0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
84    0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
85    0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
86    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
87    0xfc, 0xfd, 0xfe, 0xff,
88  };
89#endif
90
91/*
92%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93%                                                                             %
94%                                                                             %
95%                                                                             %
96%   A c q u i r e S t r i n g                                                 %
97%                                                                             %
98%                                                                             %
99%                                                                             %
100%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101%
102%  AcquireString() returns an new extented string, containing a clone of the
103%  given string.
104%
105%  An extended string is the string length, plus an extra MaxTextExtent space
106%  to allow for the string to be activally worked on.
107%
108%  The returned string shoud be freed using DestoryString().
109%
110%  The format of the AcquireString method is:
111%
112%      char *AcquireString(const char *source)
113%
114%  A description of each parameter follows:
115%
116%    o source: A character string.
117%
118*/
119MagickExport char *AcquireString(const char *source)
120{
121  char
122    *destination;
123
124  size_t
125    length;
126
127  length=0;
128  if (source != (char *) NULL)
129    length+=strlen(source);
130  if (~length < MaxTextExtent)
131    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
132  destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
133    sizeof(*destination));
134  if (destination == (char *) NULL)
135    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
136  *destination='\0';
137  if (source != (char *) NULL)
138    (void) memcpy(destination,source,length*sizeof(*destination));
139  destination[length]='\0';
140  return(destination);
141}
142
143/*
144%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145%                                                                             %
146%                                                                             %
147%                                                                             %
148%   A c q u i r e S t r i n g I n f o                                         %
149%                                                                             %
150%                                                                             %
151%                                                                             %
152%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153%
154%  AcquireStringInfo() allocates the StringInfo structure.
155%
156%  The format of the AcquireStringInfo method is:
157%
158%      StringInfo *AcquireStringInfo(const size_t length)
159%
160%  A description of each parameter follows:
161%
162%    o length: the string length.
163%
164*/
165MagickExport StringInfo *AcquireStringInfo(const size_t length)
166{
167  StringInfo
168    *string_info;
169
170  string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
171  if (string_info == (StringInfo *) NULL)
172    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
173  (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
174  string_info->signature=MagickSignature;
175  string_info->length=length;
176  if (string_info->length != 0)
177    {
178      string_info->datum=(unsigned char *) NULL;
179      if (~string_info->length >= (MaxTextExtent-1))
180        string_info->datum=(unsigned char *) AcquireQuantumMemory(
181          string_info->length+MaxTextExtent,sizeof(*string_info->datum));
182      if (string_info->datum == (unsigned char *) NULL)
183        ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
184    }
185  return(string_info);
186}
187
188/*
189%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
190%                                                                             %
191%                                                                             %
192%                                                                             %
193%   B l o b T o S t r i n g I n f o                                           %
194%                                                                             %
195%                                                                             %
196%                                                                             %
197%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
198%
199%  BlobToStringInfo() returns the contents of a blob as a StringInfo structure
200%  with MaxTextExtent extra space.
201%
202%  The format of the BlobToStringInfo method is:
203%
204%      StringInfo *BlobToStringInfo(const void *blob,const size_t length)
205%
206%  A description of each parameter follows:
207%
208%    o blob: the blob.
209%
210%    o length: the length of the blob.
211%
212*/
213MagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
214{
215  StringInfo
216    *string_info;
217
218  string_info=AcquireStringInfo(0);
219  string_info->length=length;
220  if (~string_info->length >= (MaxTextExtent-1))
221    string_info->datum=(unsigned char *) AcquireQuantumMemory(
222      string_info->length+MaxTextExtent,sizeof(*string_info->datum));
223  if (string_info->datum == (unsigned char *) NULL)
224    {
225      string_info=DestroyStringInfo(string_info);
226      return((StringInfo *) NULL);
227    }
228  if (blob != (const void *) NULL)
229    (void) memcpy(string_info->datum,blob,length);
230  return(string_info);
231}
232
233/*
234%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
235%                                                                             %
236%                                                                             %
237%                                                                             %
238%   C l o n e S t r i n g                                                     %
239%                                                                             %
240%                                                                             %
241%                                                                             %
242%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
243%
244%  CloneString() replaces or frees the destination string to make it
245%  a clone of the input string plus MaxTextExtent more space so the string may
246%  be worked on on.
247%
248%  If source is a NULL pointer the destination string will be freed and set to
249%  a NULL pointer.  A pointer to the stored in the destination is also returned.
250%
251%  When finished the non-NULL string should be freed using DestoryString()
252%  or using CloneString() with a NULL pointed for the source.
253%
254%  The format of the CloneString method is:
255%
256%      char *CloneString(char **destination,const char *source)
257%
258%  A description of each parameter follows:
259%
260%    o destination:  A pointer to a character string.
261%
262%    o source: A character string.
263%
264*/
265MagickExport char *CloneString(char **destination,const char *source)
266{
267  size_t
268    length;
269
270  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
271  assert(destination != (char **) NULL);
272  if (source == (const char *) NULL)
273    {
274      if (*destination != (char *) NULL)
275        *destination=DestroyString(*destination);
276      return(*destination);
277    }
278  if (*destination == (char *) NULL)
279    {
280      *destination=AcquireString(source);
281      return(*destination);
282    }
283  length=strlen(source);
284  if (~length < MaxTextExtent)
285    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
286  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
287    sizeof(**destination));
288  if (*destination == (char *) NULL)
289    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
290  if (length != 0)
291    (void) memcpy(*destination,source,length*sizeof(**destination));
292  (*destination)[length]='\0';
293  return(*destination);
294}
295
296/*
297%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
298%                                                                             %
299%                                                                             %
300%                                                                             %
301%   C l o n e S t r i n g I n f o                                             %
302%                                                                             %
303%                                                                             %
304%                                                                             %
305%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
306%
307%  CloneStringInfo() clones a copy of the StringInfo structure.
308%
309%  The format of the CloneStringInfo method is:
310%
311%      StringInfo *CloneStringInfo(const StringInfo *string_info)
312%
313%  A description of each parameter follows:
314%
315%    o string_info: the string info.
316%
317*/
318MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
319{
320  StringInfo
321    *clone_info;
322
323  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
324  assert(string_info != (StringInfo *) NULL);
325  assert(string_info->signature == MagickSignature);
326  clone_info=AcquireStringInfo(string_info->length);
327  if (string_info->length != 0)
328    (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
329  return(clone_info);
330}
331
332/*
333%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
334%                                                                             %
335%                                                                             %
336%                                                                             %
337%   C o m p a r e S t r i n g I n f o                                         %
338%                                                                             %
339%                                                                             %
340%                                                                             %
341%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
342%
343%  CompareStringInfo() compares the two datums target and source.  It returns
344%  an integer less than, equal to, or greater than zero if target is found,
345%  respectively, to be less than, to match, or be greater than source.
346%
347%  The format of the CompareStringInfo method is:
348%
349%      int CompareStringInfo(const StringInfo *target,const StringInfo *source)
350%
351%  A description of each parameter follows:
352%
353%    o target: the target string.
354%
355%    o source: the source string.
356%
357*/
358
359static inline size_t MagickMin(const size_t x,const size_t y)
360{
361  if (x < y)
362    return(x);
363  return(y);
364}
365
366MagickExport int CompareStringInfo(const StringInfo *target,
367  const StringInfo *source)
368{
369  int
370    status;
371
372  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
373  assert(target != (StringInfo *) NULL);
374  assert(target->signature == MagickSignature);
375  assert(source != (StringInfo *) NULL);
376  assert(source->signature == MagickSignature);
377  status=memcmp(target->datum,source->datum,MagickMin(target->length,
378    source->length));
379  if (status != 0)
380    return(status);
381  if (target->length == source->length)
382    return(0);
383  return(target->length < source->length ? -1 : 1);
384}
385
386/*
387%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388%                                                                             %
389%                                                                             %
390%                                                                             %
391%   C o n c a t e n a t e M a g i c k S t r i n g                             %
392%                                                                             %
393%                                                                             %
394%                                                                             %
395%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
396%
397%  ConcatenateMagickString() concatenates the source string to the destination
398%  string.  The destination buffer is always null-terminated even if the
399%  string must be truncated.
400%
401%  The format of the ConcatenateMagickString method is:
402%
403%      size_t ConcatenateMagickString(char *destination,const char *source,
404%        const size_t length)
405%
406%  A description of each parameter follows:
407%
408%    o destination: the destination string.
409%
410%    o source: the source string.
411%
412%    o length: the length of the destination string.
413%
414*/
415MagickExport size_t ConcatenateMagickString(char *destination,
416  const char *source,const size_t length)
417{
418  register char
419    *q;
420
421  register const char
422    *p;
423
424  register size_t
425    i;
426
427  size_t
428    count;
429
430  assert(destination != (char *) NULL);
431  assert(source != (const char *) NULL);
432  assert(length >= 1);
433  p=source;
434  q=destination;
435  i=length;
436  while ((i-- != 0) && (*q != '\0'))
437    q++;
438  count=(size_t) (q-destination);
439  i=length-count;
440  if (i == 0)
441    return(count+strlen(p));
442  while (*p != '\0')
443  {
444    if (i != 1)
445      {
446        *q++=(*p);
447        i--;
448      }
449    p++;
450  }
451  *q='\0';
452  return(count+(p-source));
453}
454
455/*
456%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
457%                                                                             %
458%                                                                             %
459%                                                                             %
460%   C o n c a t e n a t e S t r i n g                                         %
461%                                                                             %
462%                                                                             %
463%                                                                             %
464%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
465%
466%  ConcatenateString() appends a copy of string source, including the
467%  terminating null character, to the end of string destination.
468%
469%  The format of the ConcatenateString method is:
470%
471%      MagickBooleanType ConcatenateString(char **destination,
472%        const char *source)
473%
474%  A description of each parameter follows:
475%
476%    o destination:  A pointer to a character string.
477%
478%    o source: A character string.
479%
480*/
481MagickExport MagickBooleanType ConcatenateString(char **destination,
482  const char *source)
483{
484  size_t
485    destination_length,
486    length,
487    source_length;
488
489  assert(destination != (char **) NULL);
490  if (source == (const char *) NULL)
491    return(MagickTrue);
492  if (*destination == (char *) NULL)
493    {
494      *destination=AcquireString(source);
495      return(MagickTrue);
496    }
497  destination_length=strlen(*destination);
498  source_length=strlen(source);
499  length=destination_length;
500  if (~length < source_length)
501    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
502  length+=source_length;
503  if (~length < MaxTextExtent)
504    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
505  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
506    sizeof(**destination));
507  if (*destination == (char *) NULL)
508    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
509  if (source_length != 0)
510    (void) memcpy((*destination)+destination_length,source,source_length);
511  (*destination)[length]='\0';
512  return(MagickTrue);
513}
514
515/*
516%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
517%                                                                             %
518%                                                                             %
519%                                                                             %
520%   C o n c a t e n a t e S t r i n g I n f o                                 %
521%                                                                             %
522%                                                                             %
523%                                                                             %
524%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
525%
526%  ConcatenateStringInfo() concatenates the source string to the destination
527%  string.
528%
529%  The format of the ConcatenateStringInfo method is:
530%
531%      void ConcatenateStringInfo(StringInfo *string_info,
532%        const StringInfo *source)
533%
534%  A description of each parameter follows:
535%
536%    o string_info: the string info.
537%
538%    o source: the source string.
539%
540*/
541MagickExport void ConcatenateStringInfo(StringInfo *string_info,
542  const StringInfo *source)
543{
544  size_t
545    length;
546
547  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
548  assert(string_info != (StringInfo *) NULL);
549  assert(string_info->signature == MagickSignature);
550  assert(source != (const StringInfo *) NULL);
551  length=string_info->length;
552  if (~length < source->length)
553    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
554  SetStringInfoLength(string_info,length+source->length);
555  (void) memcpy(string_info->datum+length,source->datum,source->length);
556}
557
558/*
559%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
560%                                                                             %
561%                                                                             %
562%                                                                             %
563%   C o n f i g u r e F i l e T o S t r i n g I n f o                         %
564%                                                                             %
565%                                                                             %
566%                                                                             %
567%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
568%
569%  ConfigureFileToStringInfo() returns the contents of a configure file as a
570%  string.
571%
572%  The format of the ConfigureFileToStringInfo method is:
573%
574%      StringInfo *ConfigureFileToStringInfo(const char *filename)
575%        ExceptionInfo *exception)
576%
577%  A description of each parameter follows:
578%
579%    o filename: the filename.
580%
581*/
582MagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
583{
584  char
585    *string;
586
587  int
588    file;
589
590  MagickOffsetType
591    offset;
592
593  size_t
594    length;
595
596  StringInfo
597    *string_info;
598
599  void
600    *map;
601
602  assert(filename != (const char *) NULL);
603  file=open_utf8(filename,O_RDONLY | O_BINARY,0);
604  if (file == -1)
605    return((StringInfo *) NULL);
606  offset=(MagickOffsetType) lseek(file,0,SEEK_END);
607  if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
608    {
609      file=close(file)-1;
610      return((StringInfo *) NULL);
611    }
612  length=(size_t) offset;
613  string=(char *) NULL;
614  if (~length >= (MaxTextExtent-1))
615    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
616  if (string == (char *) NULL)
617    {
618      file=close(file)-1;
619      return((StringInfo *) NULL);
620    }
621  map=MapBlob(file,ReadMode,0,length);
622  if (map != (void *) NULL)
623    {
624      (void) memcpy(string,map,length);
625      (void) UnmapBlob(map,length);
626    }
627  else
628    {
629      register size_t
630        i;
631
632      ssize_t
633        count;
634
635      (void) lseek(file,0,SEEK_SET);
636      for (i=0; i < length; i+=count)
637      {
638        count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
639          SSIZE_MAX));
640        if (count <= 0)
641          {
642            count=0;
643            if (errno != EINTR)
644              break;
645          }
646      }
647      if (i < length)
648        {
649          file=close(file)-1;
650          string=DestroyString(string);
651          return((StringInfo *) NULL);
652        }
653    }
654  string[length]='\0';
655  file=close(file)-1;
656  string_info=AcquireStringInfo(0);
657  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
658  string_info->length=length;
659  string_info->datum=(unsigned char *) string;
660  return(string_info);
661}
662
663/*
664%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
665%                                                                             %
666%                                                                             %
667%                                                                             %
668%   C o n s t a n t S t r i n g                                               %
669%                                                                             %
670%                                                                             %
671%                                                                             %
672%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
673%
674%  ConstantString() allocates exactly the needed memory for a string and
675%  copies the source string to that memory location.  A NULL string pointer
676%  will allocate an empty string containing just the NUL character.
677%
678%  When finished the string should be freed using DestoryString()
679%
680%  The format of the ConstantString method is:
681%
682%      char *ConstantString(const char *source)
683%
684%  A description of each parameter follows:
685%
686%    o source: A character string.
687%
688*/
689MagickExport char *ConstantString(const char *source)
690{
691  char
692    *destination;
693
694  size_t
695    length;
696
697  length=0;
698  if (source != (char *) NULL)
699    length+=strlen(source);
700  destination=(char *) NULL;
701  if (~length >= 1UL)
702    destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
703  if (destination == (char *) NULL)
704    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
705  *destination='\0';
706  if (source != (char *) NULL)
707    (void) memcpy(destination,source,length*sizeof(*destination));
708  destination[length]='\0';
709  return(destination);
710}
711
712/*
713%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
714%                                                                             %
715%                                                                             %
716%                                                                             %
717%   C o p y M a g i c k S t r i n g                                           %
718%                                                                             %
719%                                                                             %
720%                                                                             %
721%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
722%
723%  CopyMagickString() copies the source string to the destination string, with
724%  out exceeding the given pre-declared length.
725%
726%  The destination buffer is always null-terminated even if the string must be
727%  truncated.  The return value is the minimum of the source string length or
728%  the length parameter.
729%
730%  The format of the CopyMagickString method is:
731%
732%      size_t CopyMagickString(const char *destination,char *source,
733%        const size_t length)
734%
735%  A description of each parameter follows:
736%
737%    o destination: the destination string.
738%
739%    o source: the source string.
740%
741%    o length: the length of the destination string.
742%
743*/
744MagickExport size_t CopyMagickString(char *destination,const char *source,
745  const size_t length)
746{
747  register char
748    *q;
749
750  register const char
751    *p;
752
753  register size_t
754    n;
755
756  if (source == (const char *) NULL)
757    return(0);
758  p=source;
759  q=destination;
760  for (n=length; n > 4; n-=4)
761  {
762    *q=(*p++);
763    if (*q == '\0')
764      return((size_t) (p-source-1));
765    q++;
766    *q=(*p++);
767    if (*q == '\0')
768      return((size_t) (p-source-1));
769    q++;
770    *q=(*p++);
771    if (*q == '\0')
772      return((size_t) (p-source-1));
773    q++;
774    *q=(*p++);
775    if (*q == '\0')
776      return((size_t) (p-source-1));
777    q++;
778  }
779  if (n != 0)
780    for (n--; n != 0; n--)
781    {
782      *q=(*p++);
783      if (*q == '\0')
784        return((size_t) (p-source-1));
785      q++;
786    }
787  if (length != 0)
788    *q='\0';
789  return((size_t) (p-source-1));
790}
791
792/*
793%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
794%                                                                             %
795%                                                                             %
796%                                                                             %
797%   D e s t r o y S t r i n g                                                 %
798%                                                                             %
799%                                                                             %
800%                                                                             %
801%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
802%
803%  DestroyString() destroys memory associated with a string.
804%
805%  The format of the DestroyString method is:
806%
807%      char *DestroyString(char *string)
808%
809%  A description of each parameter follows:
810%
811%    o string: the string.
812%
813*/
814MagickExport char *DestroyString(char *string)
815{
816  return((char *) RelinquishMagickMemory(string));
817}
818
819/*
820%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
821%                                                                             %
822%                                                                             %
823%                                                                             %
824%   D e s t r o y S t r i n g I n f o                                         %
825%                                                                             %
826%                                                                             %
827%                                                                             %
828%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
829%
830%  DestroyStringInfo() destroys memory associated with the StringInfo structure.
831%
832%  The format of the DestroyStringInfo method is:
833%
834%      StringInfo *DestroyStringInfo(StringInfo *string_info)
835%
836%  A description of each parameter follows:
837%
838%    o string_info: the string info.
839%
840*/
841MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
842{
843  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
844  assert(string_info != (StringInfo *) NULL);
845  assert(string_info->signature == MagickSignature);
846  if (string_info->datum != (unsigned char *) NULL)
847    string_info->datum=(unsigned char *) RelinquishMagickMemory(
848      string_info->datum);
849  string_info->signature=(~MagickSignature);
850  string_info=(StringInfo *) RelinquishMagickMemory(string_info);
851  return(string_info);
852}
853
854/*
855%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
856%                                                                             %
857%                                                                             %
858%                                                                             %
859%   D e s t r o y S t r i n g L i s t                                         %
860%                                                                             %
861%                                                                             %
862%                                                                             %
863%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
864%
865%  DestroyStringList() zeros memory associated with a string list.
866%
867%  The format of the DestroyStringList method is:
868%
869%      char **DestroyStringList(char **list)
870%
871%  A description of each parameter follows:
872%
873%    o list: the string list.
874%
875*/
876MagickExport char **DestroyStringList(char **list)
877{
878  register ssize_t
879    i;
880
881  assert(list != (char **) NULL);
882  for (i=0; list[i] != (char *) NULL; i++)
883    list[i]=DestroyString(list[i]);
884  list=(char **) RelinquishMagickMemory(list);
885  return(list);
886}
887
888/*
889%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
890%                                                                             %
891%                                                                             %
892%                                                                             %
893%   E s c a p e S t r i n g                                                   %
894%                                                                             %
895%                                                                             %
896%                                                                             %
897%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
898%
899%  EscapeString() allocates memory for a backslash-escaped version of a
900%  source text string, copies the escaped version of the text to that
901%  memory location while adding backslash characters, and returns the
902%  escaped string.
903%
904%  The format of the EscapeString method is:
905%
906%      char *EscapeString(const char *source,const char escape)
907%
908%  A description of each parameter follows:
909%
910%    o allocate_string:  Method EscapeString returns the escaped string.
911%
912%    o source: A character string.
913%
914%    o escape: the quoted string termination character to escape (e.g. '"').
915%
916*/
917MagickExport char *EscapeString(const char *source,const char escape)
918{
919  char
920    *destination;
921
922  register char
923    *q;
924
925  register const char
926    *p;
927
928  size_t
929    length;
930
931  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
932  assert(source != (const char *) NULL);
933  length=strlen(source);
934  for (p=source; *p != '\0'; p++)
935    if ((*p == '\\') || (*p == escape))
936      {
937        if (~length < 1)
938          ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
939        length++;
940      }
941  destination=(char *) NULL;
942  if (~length >= (MaxTextExtent-1))
943    destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
944      sizeof(*destination));
945  if (destination == (char *) NULL)
946    ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
947  *destination='\0';
948  if (source != (char *) NULL)
949    {
950      q=destination;
951      for (p=source; *p != '\0'; p++)
952      {
953        if ((*p == '\\') || (*p == escape))
954          *q++='\\';
955        *q++=(*p);
956      }
957      *q='\0';
958    }
959  return(destination);
960}
961
962/*
963%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
964%                                                                             %
965%                                                                             %
966%                                                                             %
967%   F i l e T o S t r i n g                                                   %
968%                                                                             %
969%                                                                             %
970%                                                                             %
971%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
972%
973%  FileToString() returns the contents of a file as a string.
974%
975%  The format of the FileToString method is:
976%
977%      char *FileToString(const char *filename,const size_t extent,
978%        ExceptionInfo *exception)
979%
980%  A description of each parameter follows:
981%
982%    o filename: the filename.
983%
984%    o extent: Maximum length of the string.
985%
986%    o exception: return any errors or warnings in this structure.
987%
988*/
989MagickExport char *FileToString(const char *filename,const size_t extent,
990  ExceptionInfo *exception)
991{
992  size_t
993    length;
994
995  assert(filename != (const char *) NULL);
996  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
997  assert(exception != (ExceptionInfo *) NULL);
998  return((char *) FileToBlob(filename,extent,&length,exception));
999}
1000
1001/*
1002%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1003%                                                                             %
1004%                                                                             %
1005%                                                                             %
1006%   F i l e T o S t r i n g I n f o                                           %
1007%                                                                             %
1008%                                                                             %
1009%                                                                             %
1010%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1011%
1012%  FileToStringInfo() returns the contents of a file as a string.
1013%
1014%  The format of the FileToStringInfo method is:
1015%
1016%      StringInfo *FileToStringInfo(const char *filename,const size_t extent,
1017%        ExceptionInfo *exception)
1018%
1019%  A description of each parameter follows:
1020%
1021%    o filename: the filename.
1022%
1023%    o extent: Maximum length of the string.
1024%
1025%    o exception: return any errors or warnings in this structure.
1026%
1027*/
1028MagickExport StringInfo *FileToStringInfo(const char *filename,
1029  const size_t extent,ExceptionInfo *exception)
1030{
1031  StringInfo
1032    *string_info;
1033
1034  assert(filename != (const char *) NULL);
1035  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
1036  assert(exception != (ExceptionInfo *) NULL);
1037  string_info=AcquireStringInfo(0);
1038  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1039  string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1040  if (string_info->datum == (unsigned char *) NULL)
1041    {
1042      string_info=DestroyStringInfo(string_info);
1043      return((StringInfo *) NULL);
1044    }
1045  return(string_info);
1046}
1047
1048/*
1049%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1050%                                                                             %
1051%                                                                             %
1052%                                                                             %
1053%  F o r m a t M a g i c k S i z e                                            %
1054%                                                                             %
1055%                                                                             %
1056%                                                                             %
1057%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1058%
1059%  FormatMagickSize() converts a size to a human readable format, for example,
1060%  14k, 234m, 2.7g, or 3.0t.  Scaling is done by repetitively dividing by
1061%  1000.
1062%
1063%  The format of the FormatMagickSize method is:
1064%
1065%      ssize_t FormatMagickSize(const MagickSizeType size,char *format)
1066%
1067%  A description of each parameter follows:
1068%
1069%    o size:  convert this size to a human readable format.
1070%
1071%    o bi:  use power of two rather than power of ten.
1072%
1073%    o format:  human readable format.
1074%
1075*/
1076MagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1077  const MagickBooleanType bi,char *format)
1078{
1079  const char
1080    **units;
1081
1082  double
1083    bytes,
1084    length;
1085
1086  register ssize_t
1087    i,
1088    j;
1089
1090  ssize_t
1091    count;
1092
1093  static const char
1094    *bi_units[] =
1095    {
1096      "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1097    },
1098    *traditional_units[] =
1099    {
1100      "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
1101    };
1102
1103  bytes=1000.0;
1104  units=traditional_units;
1105  if (bi != MagickFalse)
1106    {
1107      bytes=1024.0;
1108      units=bi_units;
1109    }
1110#if defined(_MSC_VER) && (_MSC_VER == 1200)
1111  length=(double) ((MagickOffsetType) size);
1112#else
1113  length=(double) size;
1114#endif
1115  for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1116    length/=bytes;
1117  for (j=2; j < 12; j++)
1118  {
1119    count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
1120      units[i]);
1121    if (strchr(format,'+') == (char *) NULL)
1122      break;
1123  }
1124  return(count);
1125}
1126
1127/*
1128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1129%                                                                             %
1130%                                                                             %
1131%                                                                             %
1132%  F o r m a t M a g i c k T i m e                                            %
1133%                                                                             %
1134%                                                                             %
1135%                                                                             %
1136%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1137%
1138%  FormatMagickTime() returns the specified time in the Internet date/time
1139%  format and the length of the timestamp.
1140%
1141%  The format of the FormatMagickTime method is:
1142%
1143%      ssize_t FormatMagickTime(const time_t time,const size_t length,
1144%        char *timestamp)
1145%
1146%  A description of each parameter follows.
1147%
1148%   o time:  the time since the Epoch (00:00:00 UTC, January 1, 1970),
1149%     measured in seconds.
1150%
1151%   o length: the maximum length of the string.
1152%
1153%   o timestamp:  Return the Internet date/time here.
1154%
1155*/
1156MagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
1157  char *timestamp)
1158{
1159  ssize_t
1160    count;
1161
1162  struct tm
1163    gm_time,
1164    local_time;
1165
1166  time_t
1167    timezone;
1168
1169  assert(timestamp != (char *) NULL);
1170  (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
1171  (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
1172#if defined(MAGICKCORE_HAVE_LOCALTIME_R)
1173  (void) localtime_r(&time,&local_time);
1174#else
1175  {
1176    struct tm
1177      *my_time;
1178
1179    my_time=localtime(&time);
1180    if (my_time != (struct tm *) NULL)
1181      (void) memcpy(&local_time,my_time,sizeof(local_time));
1182  }
1183#endif
1184#if defined(MAGICKCORE_HAVE_GMTIME_R)
1185  (void) gmtime_r(&time,&gm_time);
1186#else
1187  {
1188    struct tm
1189      *my_time;
1190
1191    my_time=gmtime(&time);
1192    if (my_time != (struct tm *) NULL)
1193      (void) memcpy(&gm_time,my_time,sizeof(gm_time));
1194  }
1195#endif
1196  timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
1197    local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
1198    gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
1199    (local_time.tm_yday-gm_time.tm_yday)));
1200  count=FormatLocaleString(timestamp,length,
1201    "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
1202    local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1203    local_time.tm_min,local_time.tm_sec,(long) timezone);
1204  return(count);
1205}
1206
1207/*
1208%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1209%                                                                             %
1210%                                                                             %
1211%                                                                             %
1212%   G e t E n v i r o n m e n t V a l u e                                     %
1213%                                                                             %
1214%                                                                             %
1215%                                                                             %
1216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1217%
1218%  GetEnvironmentValue() returns the environment string that matches the
1219%  specified name.
1220%
1221%  The format of the GetEnvironmentValue method is:
1222%
1223%      char *GetEnvironmentValue(const char *name)
1224%
1225%  A description of each parameter follows:
1226%
1227%    o name: the environment name.
1228%
1229*/
1230MagickExport char *GetEnvironmentValue(const char *name)
1231{
1232  const char
1233    *environment;
1234
1235  environment=getenv(name);
1236  if (environment == (const char *) NULL)
1237    return((char *) NULL);
1238  return(ConstantString(environment));
1239}
1240
1241/*
1242%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1243%                                                                             %
1244%                                                                             %
1245%                                                                             %
1246%   G e t S t r i n g I n f o D a t u m                                       %
1247%                                                                             %
1248%                                                                             %
1249%                                                                             %
1250%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1251%
1252%  GetStringInfoDatum() returns the datum associated with the string.
1253%
1254%  The format of the GetStringInfoDatum method is:
1255%
1256%      unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1257%
1258%  A description of each parameter follows:
1259%
1260%    o string_info: the string info.
1261%
1262*/
1263MagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
1264{
1265  assert(string_info != (StringInfo *) NULL);
1266  assert(string_info->signature == MagickSignature);
1267  return(string_info->datum);
1268}
1269
1270/*
1271%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1272%                                                                             %
1273%                                                                             %
1274%                                                                             %
1275%   G e t S t r i n g I n f o L e n g t h                                     %
1276%                                                                             %
1277%                                                                             %
1278%                                                                             %
1279%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1280%
1281%  GetStringInfoLength() returns the string length.
1282%
1283%  The format of the GetStringInfoLength method is:
1284%
1285%      size_t GetStringInfoLength(const StringInfo *string_info)
1286%
1287%  A description of each parameter follows:
1288%
1289%    o string_info: the string info.
1290%
1291*/
1292MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
1293{
1294  assert(string_info != (StringInfo *) NULL);
1295  assert(string_info->signature == MagickSignature);
1296  return(string_info->length);
1297}
1298
1299/*
1300%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1301%                                                                             %
1302%                                                                             %
1303%                                                                             %
1304%   G e t S t r i n g I n f o P a t h                                         %
1305%                                                                             %
1306%                                                                             %
1307%                                                                             %
1308%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1309%
1310%  GetStringInfoPath() returns the path associated with the string.
1311%
1312%  The format of the GetStringInfoPath method is:
1313%
1314%      const char *GetStringInfoPath(const StringInfo *string_info)
1315%
1316%  A description of each parameter follows:
1317%
1318%    o string_info: the string info.
1319%
1320*/
1321MagickExport const char *GetStringInfoPath(const StringInfo *string_info)
1322{
1323  assert(string_info != (StringInfo *) NULL);
1324  assert(string_info->signature == MagickSignature);
1325  return(string_info->path);
1326}
1327
1328/*
1329%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1330%                                                                             %
1331%                                                                             %
1332%                                                                             %
1333+   I n t e r p r e t S i P r e f i x V a l u e                               %
1334%                                                                             %
1335%                                                                             %
1336%                                                                             %
1337%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1338%
1339%  InterpretSiPrefixValue() converts the initial portion of the string to a
1340%  double representation.  It also recognizes SI prefixes (e.g. B, KB, MiB,
1341%  etc.).
1342%
1343%  The format of the InterpretSiPrefixValue method is:
1344%
1345%      double InterpretSiPrefixValue(const char *value,char **sentinal)
1346%
1347%  A description of each parameter follows:
1348%
1349%    o value: the string value.
1350%
1351%    o sentinal:  if sentinal is not NULL, return a pointer to the character
1352%      after the last character used in the conversion.
1353%
1354*/
1355MagickExport double InterpretSiPrefixValue(const char *restrict string,
1356  char **restrict sentinal)
1357{
1358  char
1359    *q;
1360
1361  double
1362    value;
1363
1364  value=InterpretLocaleValue(string,&q);
1365  if (q != string)
1366    {
1367      if ((*q >= 'E') && (*q <= 'z'))
1368        {
1369          double
1370            e;
1371
1372          switch ((int) ((unsigned char) *q))
1373          {
1374            case 'y': e=(-24.0); break;
1375            case 'z': e=(-21.0); break;
1376            case 'a': e=(-18.0); break;
1377            case 'f': e=(-15.0); break;
1378            case 'p': e=(-12.0); break;
1379            case 'n': e=(-9.0); break;
1380            case 'u': e=(-6.0); break;
1381            case 'm': e=(-3.0); break;
1382            case 'c': e=(-2.0); break;
1383            case 'd': e=(-1.0); break;
1384            case 'h': e=2.0; break;
1385            case 'k': e=3.0; break;
1386            case 'K': e=3.0; break;
1387            case 'M': e=6.0; break;
1388            case 'G': e=9.0; break;
1389            case 'T': e=12.0; break;
1390            case 'P': e=15.0; break;
1391            case 'E': e=18.0; break;
1392            case 'Z': e=21.0; break;
1393            case 'Y': e=24.0; break;
1394            default: e=0.0; break;
1395          }
1396          if (e >= MagickEpsilon)
1397            {
1398              if (q[1] == 'i')
1399                {
1400                  value*=pow(2.0,e/0.3);
1401                  q+=2;
1402                }
1403              else
1404                {
1405                  value*=pow(10.0,e);
1406                  q++;
1407                }
1408            }
1409        }
1410      if (*q == 'B')
1411        q++;
1412    }
1413  if (sentinal != (char **) NULL)
1414    *sentinal=q;
1415  return(value);
1416}
1417
1418/*
1419%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1420%                                                                             %
1421%                                                                             %
1422%                                                                             %
1423%   I s S t r i n g T r u e                                                   %
1424%                                                                             %
1425%                                                                             %
1426%                                                                             %
1427%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1428%
1429%  IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
1430%  "1". Any other string or undefined returns MagickFalse.
1431%
1432%  Typically this is used to look at strings (options or artifacts) which
1433%  has a default value of "false", when not defined.
1434%
1435%  The format of the IsStringTrue method is:
1436%
1437%      MagickBooleanType IsStringTrue(const char *value)
1438%
1439%  A description of each parameter follows:
1440%
1441%    o value: Specifies a pointer to a character array.
1442%
1443*/
1444MagickExport MagickBooleanType IsStringTrue(const char *value)
1445{
1446  if (value == (const char *) NULL)
1447    return(MagickFalse);
1448  if (LocaleCompare(value,"true") == 0)
1449    return(MagickTrue);
1450  if (LocaleCompare(value,"on") == 0)
1451    return(MagickTrue);
1452  if (LocaleCompare(value,"yes") == 0)
1453    return(MagickTrue);
1454  if (LocaleCompare(value,"1") == 0)
1455    return(MagickTrue);
1456  return(MagickFalse);
1457}
1458
1459/*
1460%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1461%                                                                             %
1462%                                                                             %
1463%                                                                             %
1464%   I s S t r i n g N o t F a l s e                                           %
1465%                                                                             %
1466%                                                                             %
1467%                                                                             %
1468%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1469%
1470%  IsStringNotFalse() returns MagickTrue, unless the string specifically
1471%  has a value that makes this false.  that is if it has a value of
1472%  "false", "off", "no" or "0".
1473%
1474%  Typically this is used to look at strings (options or artifacts) which
1475%  has a default value of "true", when it has not been defined.
1476%
1477%  The format of the IsStringNotFalse method is:
1478%
1479%      MagickBooleanType IsStringNotFalse(const char *value)
1480%
1481%  A description of each parameter follows:
1482%
1483%    o value: Specifies a pointer to a character array.
1484%
1485*/
1486MagickExport MagickBooleanType IsStringNotFalse(const char *value)
1487{
1488  if (value == (const char *) NULL)
1489    return(MagickTrue);
1490  if (LocaleCompare(value,"false") == 0)
1491    return(MagickFalse);
1492  if (LocaleCompare(value,"off") == 0)
1493    return(MagickFalse);
1494  if (LocaleCompare(value,"no") == 0)
1495    return(MagickFalse);
1496  if (LocaleCompare(value,"0") == 0)
1497    return(MagickFalse);
1498  return(MagickTrue);
1499}
1500
1501/*
1502%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1503%                                                                             %
1504%                                                                             %
1505%                                                                             %
1506%   L o c a l e C o m p a r e                                                 %
1507%                                                                             %
1508%                                                                             %
1509%                                                                             %
1510%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1511%
1512%  LocaleCompare() performs a case-insensitive comparison of two strings
1513%  byte-by-byte, according to the ordering of the current locale encoding.
1514%  LocaleCompare returns an integer greater than, equal to, or less than 0,
1515%  if the string pointed to by p is greater than, equal to, or less than the
1516%  string pointed to by q respectively.  The sign of a non-zero return value
1517%  is determined by the sign of the difference between the values of the first
1518%  pair of bytes that differ in the strings being compared.
1519%
1520%  The format of the LocaleCompare method is:
1521%
1522%      int LocaleCompare(const char *p,const char *q)
1523%
1524%  A description of each parameter follows:
1525%
1526%    o p: A pointer to a character string.
1527%
1528%    o q: A pointer to a character string to compare to p.
1529%
1530*/
1531MagickExport int LocaleCompare(const char *p,const char *q)
1532{
1533  if ((p == (char *) NULL) && (q == (char *) NULL))
1534    return(0);
1535  if (p == (char *) NULL)
1536    return(-1);
1537  if (q == (char *) NULL)
1538    return(1);
1539#if defined(MAGICKCORE_HAVE_STRCASECMP)
1540  return(strcasecmp(p,q));
1541#else
1542  {
1543    register int
1544      c,
1545      d;
1546
1547    for ( ; ; )
1548    {
1549      c=(int) *((unsigned char *) p);
1550      d=(int) *((unsigned char *) q);
1551      if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
1552        break;
1553      p++;
1554      q++;
1555    }
1556    return(AsciiMap[c]-(int) AsciiMap[d]);
1557  }
1558#endif
1559}
1560
1561/*
1562%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1563%                                                                             %
1564%                                                                             %
1565%                                                                             %
1566%   L o c a l e L o w e r                                                     %
1567%                                                                             %
1568%                                                                             %
1569%                                                                             %
1570%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1571%
1572%  LocaleLower() transforms all of the characters in the supplied
1573%  null-terminated string, changing all uppercase letters to lowercase.
1574%
1575%  The format of the LocaleLower method is:
1576%
1577%      void LocaleLower(char *string)
1578%
1579%  A description of each parameter follows:
1580%
1581%    o string: A pointer to the string to convert to lower-case Locale.
1582%
1583*/
1584MagickExport void LocaleLower(char *string)
1585{
1586  register char
1587    *q;
1588
1589  assert(string != (char *) NULL);
1590  for (q=string; *q != '\0'; q++)
1591    *q=(char) tolower((int) *q);
1592}
1593
1594/*
1595%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1596%                                                                             %
1597%                                                                             %
1598%                                                                             %
1599%   L o c a l e N C o m p a r e                                               %
1600%                                                                             %
1601%                                                                             %
1602%                                                                             %
1603%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1604%
1605%  LocaleNCompare() performs a case-insensitive comparison of two strings
1606%  byte-by-byte, according to the ordering of the current locale encoding.
1607%
1608%  LocaleNCompare returns an integer greater than, equal to, or less than 0,
1609%  if the string pointed to by p is greater than, equal to, or less than the
1610%  string pointed to by q respectively.  The sign of a non-zero return value
1611%  is determined by the sign of the difference between the values of the first
1612%  pair of bytes that differ in the strings being compared.
1613%
1614%  The LocaleNCompare method makes the same comparison as LocaleCompare but
1615%  looks at a maximum of n bytes.  Bytes following a null byte are not
1616%  compared.
1617%
1618%  The format of the LocaleNCompare method is:
1619%
1620%      int LocaleNCompare(const char *p,const char *q,const size_t n)
1621%
1622%  A description of each parameter follows:
1623%
1624%    o p: A pointer to a character string.
1625%
1626%    o q: A pointer to a character string to compare to p.
1627%
1628%    o length: the number of characters to compare in strings p and q.
1629%
1630*/
1631MagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
1632{
1633  if ((p == (char *) NULL) && (q == (char *) NULL))
1634    return(0);
1635  if (p == (char *) NULL)
1636    return(-1);
1637  if (q == (char *) NULL)
1638    return(1);
1639#if defined(MAGICKCORE_HAVE_STRNCASECMP)
1640  return(strncasecmp(p,q,length));
1641#else
1642  {
1643    register int
1644      c,
1645      d;
1646
1647    register size_t
1648      i;
1649
1650    for (i=length; i != 0; i--)
1651    {
1652      c=(int) *((unsigned char *) p);
1653      d=(int) *((unsigned char *) q);
1654      if (AsciiMap[c] != AsciiMap[d])
1655        return(AsciiMap[c]-(int) AsciiMap[d]);
1656      if (c == 0)
1657        return(0);
1658      p++;
1659      q++;
1660    }
1661    return(0);
1662  }
1663#endif
1664}
1665
1666/*
1667%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1668%                                                                             %
1669%                                                                             %
1670%                                                                             %
1671%   L o c a l e U p p e r                                                     %
1672%                                                                             %
1673%                                                                             %
1674%                                                                             %
1675%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1676%
1677%  LocaleUpper() transforms all of the characters in the supplied
1678%  null-terminated string, changing all lowercase letters to uppercase.
1679%
1680%  The format of the LocaleUpper method is:
1681%
1682%      void LocaleUpper(char *string)
1683%
1684%  A description of each parameter follows:
1685%
1686%    o string: A pointer to the string to convert to upper-case Locale.
1687%
1688*/
1689MagickExport void LocaleUpper(char *string)
1690{
1691  register char
1692    *q;
1693
1694  assert(string != (char *) NULL);
1695  for (q=string; *q != '\0'; q++)
1696    *q=(char) toupper((int) *q);
1697}
1698
1699/*
1700%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1701%                                                                             %
1702%                                                                             %
1703%                                                                             %
1704%   P r i n t S t r i n g I n f o                                             %
1705%                                                                             %
1706%                                                                             %
1707%                                                                             %
1708%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1709%
1710%  PrintStringInfo() prints the string.
1711%
1712%  The format of the PrintStringInfo method is:
1713%
1714%      void PrintStringInfo(FILE *file,const char *id,
1715%        const StringInfo *string_info)
1716%
1717%  A description of each parameter follows:
1718%
1719%    o file: the file, typically stdout.
1720%
1721%    o id: the string id.
1722%
1723%    o string_info: the string info.
1724%
1725*/
1726MagickExport void PrintStringInfo(FILE *file,const char *id,
1727  const StringInfo *string_info)
1728{
1729  register const char
1730    *p;
1731
1732  register size_t
1733    i,
1734    j;
1735
1736  assert(id != (const char *) NULL);
1737  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
1738  assert(string_info != (StringInfo *) NULL);
1739  assert(string_info->signature == MagickSignature);
1740  p=(char *) string_info->datum;
1741  for (i=0; i < string_info->length; i++)
1742  {
1743    if (((int) ((unsigned char) *p) < 32) &&
1744        (isspace((int) ((unsigned char) *p)) == 0))
1745      break;
1746    p++;
1747  }
1748  if (i == string_info->length)
1749    {
1750      (void) fputs((char *) string_info->datum,file);
1751      (void) fputc('\n',file);
1752      return;
1753    }
1754  /*
1755    Convert string to a HEX list.
1756  */
1757  p=(char *) string_info->datum;
1758  for (i=0; i < string_info->length; i+=0x14)
1759  {
1760    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
1761    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1762    {
1763      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
1764      if ((j % 0x04) == 0)
1765        (void) fputc(' ',file);
1766    }
1767    for ( ; j <= 0x14; j++)
1768    {
1769      (void) fputc(' ',file);
1770      (void) fputc(' ',file);
1771      if ((j % 0x04) == 0)
1772        (void) fputc(' ',file);
1773    }
1774    (void) fputc(' ',file);
1775    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
1776    {
1777      if (isprint((int) ((unsigned char) *p)) != 0)
1778        (void) fputc(*p,file);
1779      else
1780        (void) fputc('-',file);
1781      p++;
1782    }
1783    (void) fputc('\n',file);
1784  }
1785}
1786
1787/*
1788%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1789%                                                                             %
1790%                                                                             %
1791%                                                                             %
1792%   R e s e t S t r i n g I n f o                                             %
1793%                                                                             %
1794%                                                                             %
1795%                                                                             %
1796%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1797%
1798%  ResetStringInfo() reset the string to all null bytes.
1799%
1800%  The format of the ResetStringInfo method is:
1801%
1802%      void ResetStringInfo(StringInfo *string_info)
1803%
1804%  A description of each parameter follows:
1805%
1806%    o string_info: the string info.
1807%
1808*/
1809MagickExport void ResetStringInfo(StringInfo *string_info)
1810{
1811  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1812  assert(string_info != (StringInfo *) NULL);
1813  assert(string_info->signature == MagickSignature);
1814  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1815}
1816
1817/*
1818%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1819%                                                                             %
1820%                                                                             %
1821%                                                                             %
1822%   S e t S t r i n g I n f o                                                 %
1823%                                                                             %
1824%                                                                             %
1825%                                                                             %
1826%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1827%
1828%  SetStringInfo() copies the source string to the destination string.
1829%
1830%  The format of the SetStringInfo method is:
1831%
1832%      void SetStringInfo(StringInfo *string_info,const StringInfo *source)
1833%
1834%  A description of each parameter follows:
1835%
1836%    o string_info: the string info.
1837%
1838%    o source: the source string.
1839%
1840*/
1841MagickExport void SetStringInfo(StringInfo *string_info,
1842  const StringInfo *source)
1843{
1844  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1845  assert(string_info != (StringInfo *) NULL);
1846  assert(string_info->signature == MagickSignature);
1847  assert(source != (StringInfo *) NULL);
1848  assert(source->signature == MagickSignature);
1849  if (string_info->length == 0)
1850    return;
1851  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
1852  (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1853    source->length));
1854}
1855
1856/*
1857%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1858%                                                                             %
1859%                                                                             %
1860%                                                                             %
1861%   S e t S t r i n g I n f o D a t u m                                       %
1862%                                                                             %
1863%                                                                             %
1864%                                                                             %
1865%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1866%
1867%  SetStringInfoDatum() copies bytes from the source string for the length of
1868%  the destination string.
1869%
1870%  The format of the SetStringInfoDatum method is:
1871%
1872%      void SetStringInfoDatum(StringInfo *string_info,
1873%        const unsigned char *source)
1874%
1875%  A description of each parameter follows:
1876%
1877%    o string_info: the string info.
1878%
1879%    o source: the source string.
1880%
1881*/
1882MagickExport void SetStringInfoDatum(StringInfo *string_info,
1883  const unsigned char *source)
1884{
1885  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1886  assert(string_info != (StringInfo *) NULL);
1887  assert(string_info->signature == MagickSignature);
1888  if (string_info->length != 0)
1889    (void) memcpy(string_info->datum,source,string_info->length);
1890}
1891
1892/*
1893%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1894%                                                                             %
1895%                                                                             %
1896%                                                                             %
1897%   S e t S t r i n g I n f o L e n g t h                                     %
1898%                                                                             %
1899%                                                                             %
1900%                                                                             %
1901%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1902%
1903%  SetStringInfoLength() set the string length to the specified value.
1904%
1905%  The format of the SetStringInfoLength method is:
1906%
1907%      void SetStringInfoLength(StringInfo *string_info,const size_t length)
1908%
1909%  A description of each parameter follows:
1910%
1911%    o string_info: the string info.
1912%
1913%    o length: the string length.
1914%
1915*/
1916MagickExport void SetStringInfoLength(StringInfo *string_info,
1917  const size_t length)
1918{
1919  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1920  assert(string_info != (StringInfo *) NULL);
1921  assert(string_info->signature == MagickSignature);
1922  if (~length < MaxTextExtent)
1923    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1924  string_info->length=length;
1925  if (string_info->datum == (unsigned char *) NULL)
1926    string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1927      MaxTextExtent,sizeof(*string_info->datum));
1928  else
1929    string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1930      length+MaxTextExtent,sizeof(*string_info->datum));
1931  if (string_info->datum == (unsigned char *) NULL)
1932    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1933}
1934
1935/*
1936%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1937%                                                                             %
1938%                                                                             %
1939%                                                                             %
1940%   S e t S t r i n g I n f o D a t u m                                       %
1941%                                                                             %
1942%                                                                             %
1943%                                                                             %
1944%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1945%
1946%  SetStringInfoPath() sets the path associated with the string.
1947%
1948%  The format of the SetStringInfoPath method is:
1949%
1950%      void SetStringInfoPath(StringInfo *string_info,const char *path)
1951%
1952%  A description of each parameter follows:
1953%
1954%    o string_info: the string info.
1955%
1956%    o path: the path.
1957%
1958*/
1959MagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
1960{
1961  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1962  assert(string_info != (StringInfo *) NULL);
1963  assert(string_info->signature == MagickSignature);
1964  assert(path != (const char *) NULL);
1965  (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1966}
1967
1968/*
1969%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1970%                                                                             %
1971%                                                                             %
1972%                                                                             %
1973%   S p l i t S t r i n g I n f o                                             %
1974%                                                                             %
1975%                                                                             %
1976%                                                                             %
1977%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1978%
1979%  SplitStringInfo() splits a string into two and returns it.
1980%
1981%  The format of the SplitStringInfo method is:
1982%
1983%      StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
1984%
1985%  A description of each parameter follows:
1986%
1987%    o string_info: the string info.
1988%
1989*/
1990MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1991  const size_t offset)
1992{
1993  StringInfo
1994    *split_info;
1995
1996  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1997  assert(string_info != (StringInfo *) NULL);
1998  assert(string_info->signature == MagickSignature);
1999  if (offset > string_info->length)
2000    return((StringInfo *) NULL);
2001  split_info=AcquireStringInfo(offset);
2002  SetStringInfo(split_info,string_info);
2003  (void) memmove(string_info->datum,string_info->datum+offset,
2004    string_info->length-offset+MaxTextExtent);
2005  SetStringInfoLength(string_info,string_info->length-offset);
2006  return(split_info);
2007}
2008
2009/*
2010%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2011%                                                                             %
2012%                                                                             %
2013%                                                                             %
2014%   S t r i n g I n f o T o S t r i n g                                       %
2015%                                                                             %
2016%                                                                             %
2017%                                                                             %
2018%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2019%
2020%  StringInfoToString() converts a string info string to a C string.
2021%
2022%  The format of the StringInfoToString method is:
2023%
2024%      char *StringInfoToString(const StringInfo *string_info)
2025%
2026%  A description of each parameter follows:
2027%
2028%    o string_info: the string.
2029%
2030*/
2031MagickExport char *StringInfoToString(const StringInfo *string_info)
2032{
2033  char
2034    *string;
2035
2036  size_t
2037    length;
2038
2039  string=(char *) NULL;
2040  length=string_info->length;
2041  if (~length >= (MaxTextExtent-1))
2042    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
2043  if (string == (char *) NULL)
2044    return((char *) NULL);
2045  (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
2046  string[length]='\0';
2047  return(string);
2048}
2049
2050/*
2051%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2052%                                                                             %
2053%                                                                             %
2054%                                                                             %
2055%   S t r i n g I n f o T o H e x S t r i n g                                 %
2056%                                                                             %
2057%                                                                             %
2058%                                                                             %
2059%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2060%
2061%  StringInfoToHexString() converts a string info string to a C string.
2062%
2063%  The format of the StringInfoToHexString method is:
2064%
2065%      char *StringInfoToHexString(const StringInfo *string_info)
2066%
2067%  A description of each parameter follows:
2068%
2069%    o string_info: the string.
2070%
2071*/
2072MagickExport char *StringInfoToHexString(const StringInfo *string_info)
2073{
2074  char
2075    *string;
2076
2077  register const unsigned char
2078    *p;
2079
2080  register ssize_t
2081    i;
2082
2083  register unsigned char
2084    *q;
2085
2086  size_t
2087    length;
2088
2089  unsigned char
2090    hex_digits[16];
2091
2092  length=string_info->length;
2093  if (~length < MaxTextExtent)
2094    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2095  string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2096  if (string == (char *) NULL)
2097    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2098  hex_digits[0]='0';
2099  hex_digits[1]='1';
2100  hex_digits[2]='2';
2101  hex_digits[3]='3';
2102  hex_digits[4]='4';
2103  hex_digits[5]='5';
2104  hex_digits[6]='6';
2105  hex_digits[7]='7';
2106  hex_digits[8]='8';
2107  hex_digits[9]='9';
2108  hex_digits[10]='a';
2109  hex_digits[11]='b';
2110  hex_digits[12]='c';
2111  hex_digits[13]='d';
2112  hex_digits[14]='e';
2113  hex_digits[15]='f';
2114  p=string_info->datum;
2115  q=(unsigned char *) string;
2116  for (i=0; i < (ssize_t) string_info->length; i++)
2117  {
2118    *q++=hex_digits[(*p >> 4) & 0x0f];
2119    *q++=hex_digits[*p & 0x0f];
2120    p++;
2121  }
2122  *q='\0';
2123  return(string);
2124}
2125
2126/*
2127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2128%                                                                             %
2129%                                                                             %
2130%                                                                             %
2131%  S t r i n g T o A r g v                                                    %
2132%                                                                             %
2133%                                                                             %
2134%                                                                             %
2135%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2136%
2137%  StringToArgv() converts a text string into command line arguments.
2138%  The 'argv' array of arguments, is returned while the number of arguments
2139%  is returned via the provided integer variable pointer.
2140%
2141%  Simple 'word' tokenizer, which allows for each word to be optionally
2142%  quoted.  However it will not allow use of partial quotes, or escape
2143%  characters.
2144%
2145%  The format of the StringToArgv method is:
2146%
2147%      char **StringToArgv(const char *text,int *argc)
2148%
2149%  A description of each parameter follows:
2150%
2151%    o argv:  Method StringToArgv returns the string list unless an error
2152%      occurs, otherwise NULL.
2153%
2154%    o text:  Specifies the string to segment into a list.
2155%
2156%    o argc:  This integer pointer returns the number of arguments in the
2157%      list.
2158%
2159*/
2160MagickExport char **StringToArgv(const char *text,int *argc)
2161{
2162  char
2163    **argv;
2164
2165  register const char
2166    *p,
2167    *q;
2168
2169  register ssize_t
2170    i;
2171
2172  *argc=0;
2173  if (text == (char *) NULL)
2174    return((char **) NULL);
2175  /*
2176    Determine the number of arguments.
2177  */
2178  for (p=text; *p != '\0'; )
2179  {
2180    while (isspace((int) ((unsigned char) *p)) != 0)
2181      p++;
2182    if (*p == '\0')
2183      break;
2184    (*argc)++;
2185    if (*p == '"')
2186      for (p++; (*p != '"') && (*p != '\0'); p++) ;
2187    if (*p == '\'')
2188      for (p++; (*p != '\'') && (*p != '\0'); p++) ;
2189    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2190      p++;
2191  }
2192  (*argc)++;
2193  argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
2194  if (argv == (char **) NULL)
2195    ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
2196  /*
2197    Convert string to an ASCII list.
2198  */
2199  argv[0]=AcquireString("magick");
2200  p=text;
2201  for (i=1; i < (ssize_t) *argc; i++)
2202  {
2203    while (isspace((int) ((unsigned char) *p)) != 0)
2204      p++;
2205    q=p;
2206    if (*q == '"')
2207      {
2208        p++;
2209        for (q++; (*q != '"') && (*q != '\0'); q++) ;
2210      }
2211    else
2212      if (*q == '\'')
2213        {
2214          p++;
2215          for (q++; (*q != '\'') && (*q != '\0'); q++) ;
2216        }
2217      else
2218        while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
2219          q++;
2220    argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2221      sizeof(**argv));
2222    if (argv[i] == (char *) NULL)
2223      {
2224        for (i--; i >= 0; i--)
2225          argv[i]=DestroyString(argv[i]);
2226        argv=(char **) RelinquishMagickMemory(argv);
2227        ThrowFatalException(ResourceLimitFatalError,
2228          "UnableToConvertStringToARGV");
2229      }
2230    (void) memcpy(argv[i],p,(size_t) (q-p));
2231    argv[i][q-p]='\0';
2232    p=q;
2233    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
2234      p++;
2235  }
2236  argv[i]=(char *) NULL;
2237  return(argv);
2238}
2239
2240/*
2241%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2242%                                                                             %
2243%                                                                             %
2244%                                                                             %
2245%   S t r i n g T o A r r a y O f D o u b l e s                               %
2246%                                                                             %
2247%                                                                             %
2248%                                                                             %
2249%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2250%
2251%  StringToArrayOfDoubles() converts a string of space or comma seperated
2252%  numbers into array of floating point numbers (doubles). Any number that
2253%  failes to parse properly will produce a syntax error. As will two commas
2254%  without a  number between them.  However a final comma at the end will
2255%  not be regarded as an error so as to simplify automatic list generation.
2256%
2257%  A NULL value is returned on syntax or memory errors.
2258%
2259%  Use RelinquishMagickMemory() to free returned array when finished.
2260%
2261%  The format of the StringToArrayOfDoubles method is:
2262%
2263%     double *StringToArrayOfDoubles(const char *string,
2264%          size_t *count, ExceptionInfo *exception)
2265%
2266%  A description of each parameter follows:
2267%
2268%    o string: the string containing the comma/space seperated values.
2269%
2270%    o count: returns number of arguments in returned array
2271%
2272%    o exception: return 'memory failure' exceptions
2273%
2274*/
2275MagickExport double *StringToArrayOfDoubles(const char *string,
2276     ssize_t *count, ExceptionInfo *exception)
2277{
2278  const char
2279    *p;
2280
2281  char
2282    *q;
2283
2284  double
2285    *array;
2286
2287  register ssize_t
2288    i;
2289
2290  /* Determine count of values, and check syntax */
2291  *count=0;
2292  p=string;
2293  i=0;
2294  while( *p != '\0' )
2295  {
2296    (void) StringToDouble(p, &q);       /* get value - ignores leading space */
2297    if (p == q) return((double *)NULL); /* no value found */
2298    p=q; i++;                           /* inc value count */
2299    while ( isspace((int)*p) ) p++;     /* skip spaces */
2300    if ( *p == ',' )           p++;     /* skip comma */
2301    while ( isspace((int)*p) ) p++;     /* and more spaces */
2302  }
2303
2304  /* Allocate floating point argument list */
2305  *count=i;
2306  array=(double *) AcquireQuantumMemory(i,sizeof(*array));
2307  if (array == (double *) NULL) {
2308    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2309    (void) ThrowMagickException(exception,GetMagickModule(),
2310         ResourceLimitFatalError,"MemoryAllocationFailed"," ");
2311    return((double *)NULL);
2312  }
2313
2314  /* Fill in the floating point values */
2315  p=string;
2316  i=0;
2317  while( *p != '\0' && i < *count ) {
2318    array[i++]=StringToDouble(p,&q);
2319    p=q;
2320    while ( isspace((int)*p) || *p == ',' ) p++;
2321  }
2322
2323  return(array);
2324}
2325
2326/*
2327%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2328%                                                                             %
2329%                                                                             %
2330%                                                                             %
2331+   S t r i n g T o k e n                                                     %
2332%                                                                             %
2333%                                                                             %
2334%                                                                             %
2335%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2336%
2337%  StringToken() Looks for any one of given delimiters and splits the string
2338%  into two separate strings by replacing the delimiter character found with a
2339%  nul character.
2340%
2341%  The given string pointer is changed to point to the string following the
2342%  delimiter character found, or NULL.  A pointer to the start of the
2343%  string is returned, representing the token before the delimiter.
2344%
2345%  In may ways this is equivent to the strtok() C library function, but with
2346%  multiple delimiter characters rather than a delimiter string.
2347%
2348%  The format of the StringToken method is:
2349%
2350%      char *StringToken(const char *delimiters,char **string)
2351%
2352%  A description of each parameter follows:
2353%
2354%    o delimiters: one or more delimiters.
2355%
2356%    o string: return the first token in the string.  If none is found, return
2357%      NULL.
2358%
2359*/
2360MagickExport char *StringToken(const char *delimiters,char **string)
2361{
2362  char
2363    *q;
2364
2365  register char
2366    *p;
2367
2368  register const char
2369    *r;
2370
2371  register int
2372    c,
2373    d;
2374
2375  p=(*string);
2376  if (p == (char *) NULL)
2377    return((char *) NULL);
2378  q=p;
2379  for ( ; ; )
2380  {
2381    c=(*p++);
2382    r=delimiters;
2383    do
2384    {
2385      d=(*r++);
2386      if (c == d)
2387        {
2388          if (c == '\0')
2389            p=(char *) NULL;
2390          else
2391            p[-1]='\0';
2392          *string=p;
2393          return(q);
2394        }
2395    } while (d != '\0');
2396  }
2397}
2398
2399/*
2400%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2401%                                                                             %
2402%                                                                             %
2403%                                                                             %
2404%  S t r i n g T o L i s t                                                    %
2405%                                                                             %
2406%                                                                             %
2407%                                                                             %
2408%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2409%
2410%  StringToList() converts a text string into a list by segmenting the text
2411%  string at each carriage return discovered.  The list is converted to HEX
2412%  characters if any control characters are discovered within the text string.
2413%
2414%  The format of the StringToList method is:
2415%
2416%      char **StringToList(const char *text)
2417%
2418%  A description of each parameter follows:
2419%
2420%    o text:  Specifies the string to segment into a list.
2421%
2422*/
2423MagickExport char **StringToList(const char *text)
2424{
2425  char
2426    **textlist;
2427
2428  register const char
2429    *p;
2430
2431  register ssize_t
2432    i;
2433
2434  size_t
2435    lines;
2436
2437  if (text == (char *) NULL)
2438    return((char **) NULL);
2439  for (p=text; *p != '\0'; p++)
2440    if (((int) ((unsigned char) *p) < 32) &&
2441        (isspace((int) ((unsigned char) *p)) == 0))
2442      break;
2443  if (*p == '\0')
2444    {
2445      register const char
2446        *q;
2447
2448      /*
2449        Convert string to an ASCII list.
2450      */
2451      lines=1;
2452      for (p=text; *p != '\0'; p++)
2453        if (*p == '\n')
2454          lines++;
2455      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2456        sizeof(*textlist));
2457      if (textlist == (char **) NULL)
2458        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2459      p=text;
2460      for (i=0; i < (ssize_t) lines; i++)
2461      {
2462        for (q=p; *q != '\0'; q++)
2463          if ((*q == '\r') || (*q == '\n'))
2464            break;
2465        textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
2466          sizeof(**textlist));
2467        if (textlist[i] == (char *) NULL)
2468          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2469        (void) memcpy(textlist[i],p,(size_t) (q-p));
2470        textlist[i][q-p]='\0';
2471        if (*q == '\r')
2472          q++;
2473        p=q+1;
2474      }
2475    }
2476  else
2477    {
2478      char
2479        hex_string[MaxTextExtent];
2480
2481      register char
2482        *q;
2483
2484      register ssize_t
2485        j;
2486
2487      /*
2488        Convert string to a HEX list.
2489      */
2490      lines=(size_t) (strlen(text)/0x14)+1;
2491      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
2492        sizeof(*textlist));
2493      if (textlist == (char **) NULL)
2494        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2495      p=text;
2496      for (i=0; i < (ssize_t) lines; i++)
2497      {
2498        textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
2499          sizeof(**textlist));
2500        if (textlist[i] == (char *) NULL)
2501          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2502        (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2503          (long) (0x14*i));
2504        q=textlist[i]+strlen(textlist[i]);
2505        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2506        {
2507          (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
2508          (void) CopyMagickString(q,hex_string,MaxTextExtent);
2509          q+=2;
2510          if ((j % 0x04) == 0)
2511            *q++=' ';
2512        }
2513        for ( ; j <= 0x14; j++)
2514        {
2515          *q++=' ';
2516          *q++=' ';
2517          if ((j % 0x04) == 0)
2518            *q++=' ';
2519        }
2520        *q++=' ';
2521        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
2522        {
2523          if (isprint((int) ((unsigned char) *p)) != 0)
2524            *q++=(*p);
2525          else
2526            *q++='-';
2527          p++;
2528        }
2529        *q='\0';
2530      }
2531    }
2532  textlist[i]=(char *) NULL;
2533  return(textlist);
2534}
2535
2536/*
2537%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2538%                                                                             %
2539%                                                                             %
2540%                                                                             %
2541%   S t r i n g T o S t r i n g I n f o                                       %
2542%                                                                             %
2543%                                                                             %
2544%                                                                             %
2545%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2546%
2547%  StringToStringInfo() converts a string to a StringInfo type.
2548%
2549%  The format of the StringToStringInfo method is:
2550%
2551%      StringInfo *StringToStringInfo(const char *string)
2552%
2553%  A description of each parameter follows:
2554%
2555%    o string:  The string.
2556%
2557*/
2558MagickExport StringInfo *StringToStringInfo(const char *string)
2559{
2560  StringInfo
2561    *string_info;
2562
2563  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2564  assert(string != (const char *) NULL);
2565  string_info=AcquireStringInfo(strlen(string));
2566  SetStringInfoDatum(string_info,(const unsigned char *) string);
2567  return(string_info);
2568}
2569
2570/*
2571%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2572%                                                                             %
2573%                                                                             %
2574%                                                                             %
2575%   S t r i p S t r i n g                                                     %
2576%                                                                             %
2577%                                                                             %
2578%                                                                             %
2579%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2580%
2581%  StripString() strips any whitespace or quotes from the beginning and end of
2582%  a string of characters.
2583%
2584%  The format of the StripString method is:
2585%
2586%      void StripString(char *message)
2587%
2588%  A description of each parameter follows:
2589%
2590%    o message: Specifies an array of characters.
2591%
2592*/
2593MagickExport void StripString(char *message)
2594{
2595  register char
2596    *p,
2597    *q;
2598
2599  size_t
2600    length;
2601
2602  assert(message != (char *) NULL);
2603  if (*message == '\0')
2604    return;
2605  length=strlen(message);
2606  p=message;
2607  while (isspace((int) ((unsigned char) *p)) != 0)
2608    p++;
2609  if ((*p == '\'') || (*p == '"'))
2610    p++;
2611  q=message+length-1;
2612  while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
2613    q--;
2614  if (q > p)
2615    if ((*q == '\'') || (*q == '"'))
2616      q--;
2617  (void) memmove(message,p,(size_t) (q-p+1));
2618  message[q-p+1]='\0';
2619  for (p=message; *p != '\0'; p++)
2620    if (*p == '\n')
2621      *p=' ';
2622}
2623
2624/*
2625%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2626%                                                                             %
2627%                                                                             %
2628%                                                                             %
2629%   S u b s t i t u t e S t r i n g                                           %
2630%                                                                             %
2631%                                                                             %
2632%                                                                             %
2633%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2634%
2635%  SubstituteString() performs string substitution on a string, replacing the
2636%  string with the substituted version. Buffer must be allocated from the heap.
2637%  If the string is matched and status, MagickTrue is returned otherwise
2638%  MagickFalse.
2639%
2640%  The format of the SubstituteString method is:
2641%
2642%      MagickBooleanType SubstituteString(char **string,const char *search,
2643%        const char *replace)
2644%
2645%  A description of each parameter follows:
2646%
2647%    o string: the string to perform replacements on;  replaced with new
2648%      allocation if a replacement is made.
2649%
2650%    o search: search for this string.
2651%
2652%    o replace: replace any matches with this string.
2653%
2654*/
2655MagickExport MagickBooleanType SubstituteString(char **string,
2656  const char *search,const char *replace)
2657{
2658  MagickBooleanType
2659    status;
2660
2661  register char
2662    *p;
2663
2664  size_t
2665    extent,
2666    replace_extent,
2667    search_extent;
2668
2669  ssize_t
2670    offset;
2671
2672  status=MagickFalse;
2673  search_extent=0,
2674  replace_extent=0;
2675  for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
2676  {
2677    if (search_extent == 0)
2678      search_extent=strlen(search);
2679    if (strncmp(p,search,search_extent) != 0)
2680      continue;
2681    /*
2682      We found a match.
2683    */
2684    status=MagickTrue;
2685    if (replace_extent == 0)
2686      replace_extent=strlen(replace);
2687    if (replace_extent > search_extent)
2688      {
2689        /*
2690          Make room for the replacement string.
2691        */
2692        offset=(ssize_t) (p-(*string));
2693        extent=strlen(*string)+replace_extent-search_extent+1;
2694        *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2695          sizeof(*p));
2696        if (*string == (char *) NULL)
2697          ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2698        p=(*string)+offset;
2699      }
2700    /*
2701      Replace string.
2702    */
2703    if (search_extent != replace_extent)
2704      (void) CopyMagickMemory(p+replace_extent,p+search_extent,
2705        strlen(p+search_extent)+1);
2706    (void) CopyMagickMemory(p,replace,replace_extent);
2707    p+=replace_extent-1;
2708  }
2709  return(status);
2710}
2711