13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                  SSSSS   TTTTT  RRRR   IIIII  N   N   GGGG                  %
7670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                  SS        T    R   R    I    NN  N  G                      %
8670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                   SSS      T    RRRR     I    N N N  G GGG                  %
9670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                     SS     T    R R      I    N  NN  G   G                  %
10670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                  SSSSS     T    R  R   IIIII  N   N   GGGG                  %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                        MagickCore String Methods                            %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                             Software Design                                 %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                  Cristy                                     %
17670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                               August 2003                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%  You may not use this file except in compliance with the license.  You may  %
2499bbf2c9e414ade263949978671025728413c1c9cristy%  obtain a copy of the license at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2899bbf2c9e414ade263949978671025728413c1c9cristy%  unless required by applicable law or agreed to in writing, software        %
2999bbf2c9e414ade263949978671025728413c1c9cristy%  distributed under the license is distributed on an "as is" basis,          %
3099bbf2c9e414ade263949978671025728413c1c9cristy%  without warranties or conditions of any kind, either express or implied.   %
31670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%  See the license for the specific language governing permissions and        %
3299bbf2c9e414ade263949978671025728413c1c9cristy%  limitations under the license.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4099bbf2c9e414ade263949978671025728413c1c9cristy  include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
47007e925e29fea767305ade6e1d635e5e517a13b3dirk#include "MagickCore/image-private.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/locale_.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/log.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
52d2d11ec3ae6f94d5b49cbaf90e7f9ca18c252d29cristy#include "MagickCore/nt-base-private.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/signature-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
57b1d483a6a6a5678173db9d60bec52dd5a37826beanthony#include "MagickCore/string-private.h"
5818c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy#include "MagickCore/utility-private.h"
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6199bbf2c9e414ade263949978671025728413c1c9cristy  static declarations.
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
639125cd55db81cd4269ea998e0aa724b93e89ccf4Cristy#ifdef __VMS
649125cd55db81cd4269ea998e0aa724b93e89ccf4Cristy#define asciimap AsciiMap
659125cd55db81cd4269ea998e0aa724b93e89ccf4Cristy#endif
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const unsigned char
688e7a461ec2538f7cb4adfeef811cb5dd07e8da83cristy  AsciiMap[] =
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xfc, 0xfd, 0xfe, 0xff,
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g                                                 %
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
106104f8932a48379d3355160642b3de6f0611a7d19anthony%  AcquireString() returns an new extented string, containing a clone of the
107104f8932a48379d3355160642b3de6f0611a7d19anthony%  given string.
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
109151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy%  An extended string is the string length, plus an extra MagickPathExtent space
1105364f9cfe8b3e8765f5a05663ae075abe6236c93cristy%  to allow for the string to be actively worked on.
111104f8932a48379d3355160642b3de6f0611a7d19anthony%
112104f8932a48379d3355160642b3de6f0611a7d19anthony%  The returned string shoud be freed using DestoryString().
113b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireString method is:
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *AcquireString(const char *source)
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *AcquireString(const char *source)
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
134151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
13554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
136151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  destination=(char *) AcquireQuantumMemory(length+MagickPathExtent,
13754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    sizeof(*destination));
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
14254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
14354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g I n f o                                         %
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireStringInfo() allocates the StringInfo structure.
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireStringInfo method is:
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *AcquireStringInfo(const size_t length)
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *AcquireStringInfo(const size_t length)
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17473bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info == (StringInfo *) NULL)
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
178e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  string_info->signature=MagickCoreSignature;
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
1808a68c249442d46dd785dba54a03fb9242574ed63cristy  string_info->datum=(unsigned char *) NULL;
181151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~string_info->length >= (MagickPathExtent-1))
1828a68c249442d46dd785dba54a03fb9242574ed63cristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(
183151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      string_info->length+MagickPathExtent,sizeof(*string_info->datum));
1848a68c249442d46dd785dba54a03fb9242574ed63cristy  if (string_info->datum == (unsigned char *) NULL)
1858a68c249442d46dd785dba54a03fb9242574ed63cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1948723e4bcd840478cecfd29891e792edb499cd0e9cristy%   B l o b T o S t r i n g I n f o                                           %
1958723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1968723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1978723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1988723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1998723e4bcd840478cecfd29891e792edb499cd0e9cristy%
200104f8932a48379d3355160642b3de6f0611a7d19anthony%  BlobToStringInfo() returns the contents of a blob as a StringInfo structure
201151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy%  with MagickPathExtent extra space.
2028723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2038723e4bcd840478cecfd29891e792edb499cd0e9cristy%  The format of the BlobToStringInfo method is:
2048723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2058723e4bcd840478cecfd29891e792edb499cd0e9cristy%      StringInfo *BlobToStringInfo(const void *blob,const size_t length)
2068723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2078723e4bcd840478cecfd29891e792edb499cd0e9cristy%  A description of each parameter follows:
2088723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2098723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o blob: the blob.
2108723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2118723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o length: the length of the blob.
2128723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2138723e4bcd840478cecfd29891e792edb499cd0e9cristy*/
2148723e4bcd840478cecfd29891e792edb499cd0e9cristyMagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
2158723e4bcd840478cecfd29891e792edb499cd0e9cristy{
2168723e4bcd840478cecfd29891e792edb499cd0e9cristy  StringInfo
2178723e4bcd840478cecfd29891e792edb499cd0e9cristy    *string_info;
2188723e4bcd840478cecfd29891e792edb499cd0e9cristy
2198723e4bcd840478cecfd29891e792edb499cd0e9cristy  string_info=AcquireStringInfo(0);
220151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
2215ce7dacfa253b94e098b33c97b2b3eca8397edcccristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
222f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy  string_info->length=length;
2235ce7dacfa253b94e098b33c97b2b3eca8397edcccristy  if (string_info->datum == (unsigned char *) NULL)
2245ce7dacfa253b94e098b33c97b2b3eca8397edcccristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
225151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      MagickPathExtent,sizeof(*string_info->datum));
2265ce7dacfa253b94e098b33c97b2b3eca8397edcccristy  else
2275ce7dacfa253b94e098b33c97b2b3eca8397edcccristy    string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
228151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      length+MagickPathExtent,sizeof(*string_info->datum));
2298723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (string_info->datum == (unsigned char *) NULL)
2308723e4bcd840478cecfd29891e792edb499cd0e9cristy    {
2318723e4bcd840478cecfd29891e792edb499cd0e9cristy      string_info=DestroyStringInfo(string_info);
2328723e4bcd840478cecfd29891e792edb499cd0e9cristy      return((StringInfo *) NULL);
2338723e4bcd840478cecfd29891e792edb499cd0e9cristy    }
2348723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (blob != (const void *) NULL)
2358723e4bcd840478cecfd29891e792edb499cd0e9cristy    (void) memcpy(string_info->datum,blob,length);
2368723e4bcd840478cecfd29891e792edb499cd0e9cristy  return(string_info);
2378723e4bcd840478cecfd29891e792edb499cd0e9cristy}
2388723e4bcd840478cecfd29891e792edb499cd0e9cristy
2398723e4bcd840478cecfd29891e792edb499cd0e9cristy/*
2408723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2418723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2428723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2438723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g                                                     %
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
250104f8932a48379d3355160642b3de6f0611a7d19anthony%  CloneString() replaces or frees the destination string to make it
251a42df255c73726a530ac51cc6867bb71a8d23370cristy%  a clone of the input string plus MagickPathExtent more space so the string
252a42df255c73726a530ac51cc6867bb71a8d23370cristy%  may be worked on.
25372feaa664126c198b9ccd072b6ef181338a76c6canthony%
254104f8932a48379d3355160642b3de6f0611a7d19anthony%  If source is a NULL pointer the destination string will be freed and set to
255104f8932a48379d3355160642b3de6f0611a7d19anthony%  a NULL pointer.  A pointer to the stored in the destination is also returned.
25672feaa664126c198b9ccd072b6ef181338a76c6canthony%
257104f8932a48379d3355160642b3de6f0611a7d19anthony%  When finished the non-NULL string should be freed using DestoryString()
258104f8932a48379d3355160642b3de6f0611a7d19anthony%  or using CloneString() with a NULL pointed for the source.
259067622389550e83c76724917c7e5c55b0887d153anthony%
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneString method is:
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *CloneString(char **destination,const char *source)
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *CloneString(char **destination,const char *source)
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*destination != (char *) NULL)
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *destination=DestroyString(*destination);
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(source);
289151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
291a42df255c73726a530ac51cc6867bb71a8d23370cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+
292a42df255c73726a530ac51cc6867bb71a8d23370cristy    MagickPathExtent,sizeof(**destination));
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
29554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (length != 0)
296f7e6ab4637e31098c9cfd70546aed44870c27ee5cristy    (void) memcpy(*destination,source,length*sizeof(**destination));
297208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  (*destination)[length]='\0';
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(*destination);
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g I n f o                                             %
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloneStringInfo() clones a copy of the StringInfo structure.
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneStringInfo method is:
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *CloneStringInfo(const StringInfo *string_info)
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *clone_info;
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
329e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  clone_info=AcquireStringInfo(string_info->length);
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
33254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(clone_info);
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o m p a r e S t r i n g I n f o                                         %
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CompareStringInfo() compares the two datums target and source.  It returns
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  an integer less than, equal to, or greater than zero if target is found,
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  respectively, to be less than, to match, or be greater than source.
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CompareStringInfo method is:
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int CompareStringInfo(const StringInfo *target,const StringInfo *source)
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target: the target string.
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport int CompareStringInfo(const StringInfo *target,
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(target != (StringInfo *) NULL);
370e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(target->signature == MagickCoreSignature);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
372e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=memcmp(target->datum,source->datum,MagickMin(target->length,
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source->length));
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != 0)
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target->length == source->length)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target->length < source->length ? -1 : 1);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e M a g i c k S t r i n g                             %
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateMagickString() concatenates the source string to the destination
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.  The destination buffer is always null-terminated even if the
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string must be truncated.
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateMagickString method is:
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t ConcatenateMagickString(char *destination,const char *source,
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t ConcatenateMagickString(char *destination,
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source,const size_t length)
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char *) NULL);
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(length >= 1);
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length;
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((i-- != 0) && (*q != '\0'))
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=(size_t) (q-destination);
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length-count;
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == 0)
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(count+strlen(p));
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (*p != '\0')
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (i != 1)
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i--;
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count+(p-source));
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g                                         %
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateString() appends a copy of string source, including the
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  terminating null character, to the end of string destination.
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateString method is:
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ConcatenateString(char **destination,
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *source)
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ConcatenateString(char **destination,
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source)
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
48154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    destination_length,
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length,
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_length;
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination_length=strlen(*destination);
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source_length=strlen(source);
49554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  length=destination_length;
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source_length)
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length+=source_length;
499151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
501a42df255c73726a530ac51cc6867bb71a8d23370cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+
502a42df255c73726a530ac51cc6867bb71a8d23370cristy    MagickPathExtent,sizeof(**destination));
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
50554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (source_length != 0)
50654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy((*destination)+destination_length,source,source_length);
50754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (*destination)[length]='\0';
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g I n f o                                 %
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateStringInfo() concatenates the source string to the destination
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateStringInfo method is:
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ConcatenateStringInfo(StringInfo *string_info,
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *source)
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ConcatenateStringInfo(StringInfo *string_info,
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
544e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const StringInfo *) NULL);
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source->length)
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,length+source->length);
55054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum+length,source->datum,source->length);
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                         %
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConfigureFileToStringInfo() returns the contents of a configure file as a
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConfigureFileToStringInfo method is:
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *ConfigureFileToStringInfo(const char *filename)
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
57799bbf2c9e414ade263949978671025728413c1c9cristyMagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file;
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset;
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  void
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
59818c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy  file=open_utf8(filename,O_RDONLY | O_BINARY,0);
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == -1)
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
6017f31770d102a777269fa2452cc6a1ce304da4e12cristy  offset=(MagickOffsetType) lseek(file,0,SEEK_END);
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(size_t) offset;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
609151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length >= (MagickPathExtent-1))
610a42df255c73726a530ac51cc6867bb71a8d23370cristy    string=(char *) AcquireQuantumMemory(length+MagickPathExtent,
611a42df255c73726a530ac51cc6867bb71a8d23370cristy      sizeof(*string));
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string == (char *) NULL)
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map=MapBlob(file,ReadMode,0,length);
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map != (void *) NULL)
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
62054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy      (void) memcpy(string,map,length);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) UnmapBlob(map,length);
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register size_t
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ssize_t
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count;
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6317f31770d102a777269fa2452cc6a1ce304da4e12cristy      (void) lseek(file,0,SEEK_SET);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < length; i+=count)
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          SSIZE_MAX));
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (count <= 0)
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=0;
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (errno != EINTR)
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (i < length)
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          file=close(file)-1;
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          string=DestroyString(string);
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((StringInfo *) NULL);
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string[length]='\0';
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  file=close(file)-1;
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
653cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk  string_info->path=ConstantString(filename);
6545ce7dacfa253b94e098b33c97b2b3eca8397edcccristy  string_info->length=length;
6557fb9fc1a2796365be394aa5927e7773ca07f10eecristy  if (string_info->datum != (unsigned char *) NULL)
6567fb9fc1a2796365be394aa5927e7773ca07f10eecristy    string_info->datum=(unsigned char *) RelinquishMagickMemory(
6577fb9fc1a2796365be394aa5927e7773ca07f10eecristy      string_info->datum);
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->datum=(unsigned char *) string;
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n s t a n t S t r i n g                                               %
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
673104f8932a48379d3355160642b3de6f0611a7d19anthony%  ConstantString() allocates exactly the needed memory for a string and
674104f8932a48379d3355160642b3de6f0611a7d19anthony%  copies the source string to that memory location.  A NULL string pointer
675104f8932a48379d3355160642b3de6f0611a7d19anthony%  will allocate an empty string containing just the NUL character.
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
677104f8932a48379d3355160642b3de6f0611a7d19anthony%  When finished the string should be freed using DestoryString()
678067622389550e83c76724917c7e5c55b0887d153anthony%
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConstantString method is:
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *ConstantString(const char *source)
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *ConstantString(const char *source)
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length >= 1UL)
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
70654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
70754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o p y M a g i c k S t r i n g                                           %
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
722067622389550e83c76724917c7e5c55b0887d153anthony%  CopyMagickString() copies the source string to the destination string, with
723067622389550e83c76724917c7e5c55b0887d153anthony%  out exceeding the given pre-declared length.
724067622389550e83c76724917c7e5c55b0887d153anthony%
725067622389550e83c76724917c7e5c55b0887d153anthony%  The destination buffer is always null-terminated even if the string must be
726067622389550e83c76724917c7e5c55b0887d153anthony%  truncated.  The return value is the minimum of the source string length or
727067622389550e83c76724917c7e5c55b0887d153anthony%  the length parameter.
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CopyMagickString method is:
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t CopyMagickString(const char *destination,char *source,
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t CopyMagickString(char *destination,const char *source,
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n;
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75577e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy  if (source == (const char *) NULL)
75677e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy    return(0);
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (n=length; n > 4; n-=4)
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (n != 0)
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (n--; n != 0; n--)
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q=(*p++);
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\0')
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((size_t) (p-source-1));
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length != 0)
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q='\0';
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((size_t) (p-source-1));
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g                                                 %
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyString() destroys memory associated with a string.
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyString method is:
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *DestroyString(char *string)
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: the string.
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *DestroyString(char *string)
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) RelinquishMagickMemory(string));
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g I n f o                                         %
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringInfo() destroys memory associated with the StringInfo structure.
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringInfo method is:
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *DestroyStringInfo(StringInfo *string_info)
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
843e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum != (unsigned char *) NULL)
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) RelinquishMagickMemory(
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info->datum);
847cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk  if (string_info->path != (char *) NULL)
8481e7a6d0970f5a12914cb512407d14c9e605f62a7dirk    string_info->path=DestroyString(string_info->path);
849e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  string_info->signature=(~MagickCoreSignature);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=(StringInfo *) RelinquishMagickMemory(string_info);
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g L i s t                                         %
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringList() zeros memory associated with a string list.
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringList method is:
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **DestroyStringList(char **list)
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o list: the string list.
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **DestroyStringList(char **list)
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
878bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(list != (char **) NULL);
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; list[i] != (char *) NULL; i++)
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list[i]=DestroyString(list[i]);
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  list=(char **) RelinquishMagickMemory(list);
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(list);
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E s c a p e S t r i n g                                                   %
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EscapeString() allocates memory for a backslash-escaped version of a
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  source text string, copies the escaped version of the text to that
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory location while adding backslash characters, and returns the
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  escaped string.
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EscapeString method is:
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *EscapeString(const char *source,const char escape)
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o allocate_string:  Method EscapeString returns the escaped string.
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o escape: the quoted string termination character to escape (e.g. '"').
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *EscapeString(const char *source,const char escape)
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
93234838f589a9c3dff858321d07926c66f7f7fa2f7Cristy  length=0;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=source; *p != '\0'; p++)
93434838f589a9c3dff858321d07926c66f7f7fa2f7Cristy  {
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == '\\') || (*p == escape))
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (~length < 1)
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length++;
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94134838f589a9c3dff858321d07926c66f7f7fa2f7Cristy    length++;
94234838f589a9c3dff858321d07926c66f7f7fa2f7Cristy  }
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
944151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length >= (MagickPathExtent-1))
945151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    destination=(char *) AcquireQuantumMemory(length+MagickPathExtent,
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(*destination));
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
9504662a13513c15a6545b44bead832ebcbdcf522cacristy  q=destination;
9514662a13513c15a6545b44bead832ebcbdcf522cacristy  for (p=source; *p != '\0'; p++)
9524662a13513c15a6545b44bead832ebcbdcf522cacristy  {
9534662a13513c15a6545b44bead832ebcbdcf522cacristy    if ((*p == '\\') || (*p == escape))
9544662a13513c15a6545b44bead832ebcbdcf522cacristy      *q++='\\';
9554662a13513c15a6545b44bead832ebcbdcf522cacristy    *q++=(*p);
9564662a13513c15a6545b44bead832ebcbdcf522cacristy  }
9574662a13513c15a6545b44bead832ebcbdcf522cacristy  *q='\0';
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g                                                   %
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToString() returns the contents of a file as a string.
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToString method is:
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *FileToString(const char *filename,const size_t extent,
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *FileToString(const char *filename,const size_t extent,
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) FileToBlob(filename,extent,&length,exception));
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g I n f o                                           %
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToStringInfo() returns the contents of a file as a string.
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToStringInfo method is:
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *FileToStringInfo(const char *filename,const size_t extent,
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *FileToStringInfo(const char *filename,
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t extent,ExceptionInfo *exception)
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
1037cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk  string_info->path=ConstantString(filename);
10387fb9fc1a2796365be394aa5927e7773ca07f10eecristy  if (string_info->datum != (unsigned char *) NULL)
10397fb9fc1a2796365be394aa5927e7773ca07f10eecristy    string_info->datum=(unsigned char *) RelinquishMagickMemory(
10407fb9fc1a2796365be394aa5927e7773ca07f10eecristy      string_info->datum);
1041cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk  string_info->datum=(unsigned char *) FileToBlob(filename,extent,
1042cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk    &string_info->length,exception);
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info=DestroyStringInfo(string_info);
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k S i z e                                            %
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickSize() converts a size to a human readable format, for example,
10632ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy%  14k, 234m, 2.7g, or 3.0t.  Scaling is done by repetitively dividing by
1064c15ce496469497409afa4e9b67f135726e720ac3cristy%  1000.
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickSize method is:
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
106840937044c58de334456bbfb2b6fed5ab03fd2946cristy%      ssize_t FormatMagickSize(const MagickSizeType size,const char *suffix,
1069d4618c0bfed02b00a0b112dfc619da885355e189cristy%        const size_t length,char *format)
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o size:  convert this size to a human readable format.
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1075b9080c9660565c4ab556254f276bfeca3d4edf02cristy%    o bi:  use power of two rather than power of ten.
1076b9080c9660565c4ab556254f276bfeca3d4edf02cristy%
107740937044c58de334456bbfb2b6fed5ab03fd2946cristy%    o suffix:  append suffix, typically B or P.
107840937044c58de334456bbfb2b6fed5ab03fd2946cristy%
1079d4618c0bfed02b00a0b112dfc619da885355e189cristy%    o length: the maximum length of the string.
1080d4618c0bfed02b00a0b112dfc619da885355e189cristy%
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o format:  human readable format.
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
108499bbf2c9e414ade263949978671025728413c1c9cristyMagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1085d4618c0bfed02b00a0b112dfc619da885355e189cristy  const MagickBooleanType bi,const char *suffix,const size_t length,
1086d4618c0bfed02b00a0b112dfc619da885355e189cristy  char *format)
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1088b9080c9660565c4ab556254f276bfeca3d4edf02cristy  const char
1089b9080c9660565c4ab556254f276bfeca3d4edf02cristy    **units;
1090b9080c9660565c4ab556254f276bfeca3d4edf02cristy
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
1092b9080c9660565c4ab556254f276bfeca3d4edf02cristy    bytes,
1093d4618c0bfed02b00a0b112dfc619da885355e189cristy    extent;
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1095bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10999d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
11009d314ff2c17a77996c05413c2013880387e50f0ecristy    count;
11019d314ff2c17a77996c05413c2013880387e50f0ecristy
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
1103b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *bi_units[] =
1104b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
11052ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1106b9080c9660565c4ab556254f276bfeca3d4edf02cristy    },
1107b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *traditional_units[] =
11089bf9da36285c017ede08022f833c722ac503aff1cristy    {
11092ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
11109bf9da36285c017ede08022f833c722ac503aff1cristy    };
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1112b9080c9660565c4ab556254f276bfeca3d4edf02cristy  bytes=1000.0;
1113b9080c9660565c4ab556254f276bfeca3d4edf02cristy  units=traditional_units;
1114b9080c9660565c4ab556254f276bfeca3d4edf02cristy  if (bi != MagickFalse)
1115b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
1116b9080c9660565c4ab556254f276bfeca3d4edf02cristy      bytes=1024.0;
1117b9080c9660565c4ab556254f276bfeca3d4edf02cristy      units=bi_units;
1118b9080c9660565c4ab556254f276bfeca3d4edf02cristy    }
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(_MSC_VER) && (_MSC_VER == 1200)
1120d4618c0bfed02b00a0b112dfc619da885355e189cristy  extent=(double) ((MagickOffsetType) size);
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
1122d4618c0bfed02b00a0b112dfc619da885355e189cristy  extent=(double) size;
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1124d4618c0bfed02b00a0b112dfc619da885355e189cristy  for (i=0; (extent >= bytes) && (units[i+1] != (const char *) NULL); i++)
1125d4618c0bfed02b00a0b112dfc619da885355e189cristy    extent/=bytes;
1126c3b9b36ae7d6ec7ef880abfcf3fae7dd4bdb51f7cristy  count=0;
11279bf9da36285c017ede08022f833c722ac503aff1cristy  for (j=2; j < 12; j++)
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
112940937044c58de334456bbfb2b6fed5ab03fd2946cristy    if (suffix == (const char *) NULL)
1130d4618c0bfed02b00a0b112dfc619da885355e189cristy      count=FormatLocaleString(format,length,"%.*g%s",(int) (i+j),extent,
1131d4618c0bfed02b00a0b112dfc619da885355e189cristy        units[i]);
113240937044c58de334456bbfb2b6fed5ab03fd2946cristy    else
1133d4618c0bfed02b00a0b112dfc619da885355e189cristy      count=FormatLocaleString(format,length,"%.*g%s%s",(int) (i+j),extent,
1134d4618c0bfed02b00a0b112dfc619da885355e189cristy        units[i],suffix);
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (strchr(format,'+') == (char *) NULL)
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k T i m e                                            %
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickTime() returns the specified time in the Internet date/time
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  format and the length of the timestamp.
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickTime method is:
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      ssize_t FormatMagickTime(const time_t time,const size_t length,
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        char *timestamp)
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1162d4618c0bfed02b00a0b112dfc619da885355e189cristy%    o time:  the time since the Epoch (00:00:00 UTC, January 1, 1970),
1163d4618c0bfed02b00a0b112dfc619da885355e189cristy%      measured in seconds.
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1165d4618c0bfed02b00a0b112dfc619da885355e189cristy%    o length: the maximum length of the string.
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1167d4618c0bfed02b00a0b112dfc619da885355e189cristy%    o timestamp:  Return the Internet date/time here.
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1170bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyMagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char *timestamp)
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1173bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  struct tm
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time,
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time;
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timezone;
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(timestamp != (char *) NULL);
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_LOCALTIME_R)
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) localtime_r(&time,&local_time);
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1190bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=localtime(&time);
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&local_time,my_time,sizeof(local_time));
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_GMTIME_R)
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) gmtime_r(&time,&gm_time);
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1202bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=gmtime(&time);
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&gm_time,my_time,sizeof(gm_time));
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (local_time.tm_yday-gm_time.tm_yday)));
1214b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  count=FormatLocaleString(timestamp,length,
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1217f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy    local_time.tm_min,local_time.tm_sec,(long) timezone);
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t E n v i r o n m e n t V a l u e                                     %
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetEnvironmentValue() returns the environment string that matches the
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified name.
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetEnvironmentValue method is:
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *GetEnvironmentValue(const char *name)
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the environment name.
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
124499bbf2c9e414ade263949978671025728413c1c9cristyMagickExport char *GetEnvironmentValue(const char *name)
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *environment;
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  environment=getenv(name);
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (environment == (const char *) NULL)
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(ConstantString(environment));
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o D a t u m                                       %
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoDatum() returns the datum associated with the string.
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoDatum method is:
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1280e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->datum);
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o L e n g t h                                     %
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoLength() returns the string length.
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoLength method is:
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t GetStringInfoLength(const StringInfo *string_info)
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t GetStringInfoLength(const StringInfo *string_info)
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1309e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->length);
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o P a t h                                         %
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoPath() returns the path associated with the string.
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoPath method is:
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetStringInfoPath(const StringInfo *string_info)
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetStringInfoPath(const StringInfo *string_info)
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1338e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->path);
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1347dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy+   I n t e r p r e t S i P r e f i x V a l u e                               %
1348dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1349dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1350dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1351dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1352dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1353dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  InterpretSiPrefixValue() converts the initial portion of the string to a
1354dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  double representation.  It also recognizes SI prefixes (e.g. B, KB, MiB,
1355dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  etc.).
1356dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1357dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  The format of the InterpretSiPrefixValue method is:
1358dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1359dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%      double InterpretSiPrefixValue(const char *value,char **sentinal)
1360dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1361dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  A description of each parameter follows:
1362dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1363dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%    o value: the string value.
1364dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1365dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%    o sentinal:  if sentinal is not NULL, return a pointer to the character
1366dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%      after the last character used in the conversion.
1367dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1368dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy*/
136905d2ff7ebf21f659f5b11e45afb294e152f4330cdirkMagickExport double InterpretSiPrefixValue(const char *magick_restrict string,
137005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  char **magick_restrict sentinal)
1371dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy{
1372dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  char
1373dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    *q;
1374dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1375dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  double
1376dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    value;
1377dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1378dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  value=InterpretLocaleValue(string,&q);
1379dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  if (q != string)
1380dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    {
1381dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy      if ((*q >= 'E') && (*q <= 'z'))
1382dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        {
1383dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy          double
1384dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            e;
1385dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
13860c2684f14358e568d33818fd9182c3aad93c4c0dcristy          switch ((int) ((unsigned char) *q))
13870c2684f14358e568d33818fd9182c3aad93c4c0dcristy          {
13880c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'y': e=(-24.0); break;
13890c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'z': e=(-21.0); break;
13900c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'a': e=(-18.0); break;
13910c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'f': e=(-15.0); break;
13920c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'p': e=(-12.0); break;
13930c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'n': e=(-9.0); break;
13940c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'u': e=(-6.0); break;
13950c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'm': e=(-3.0); break;
13960c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'c': e=(-2.0); break;
13970c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'd': e=(-1.0); break;
13980c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'h': e=2.0; break;
13990c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'k': e=3.0; break;
14000c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'K': e=3.0; break;
14010c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'M': e=6.0; break;
14020c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'G': e=9.0; break;
14030c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'T': e=12.0; break;
14040c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'P': e=15.0; break;
14050c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'E': e=18.0; break;
14060c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'Z': e=21.0; break;
14070c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'Y': e=24.0; break;
14080c2684f14358e568d33818fd9182c3aad93c4c0dcristy            default: e=0.0; break;
14090c2684f14358e568d33818fd9182c3aad93c4c0dcristy          }
1410dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy          if (e >= MagickEpsilon)
1411dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            {
1412dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy              if (q[1] == 'i')
1413dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                {
1414dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  value*=pow(2.0,e/0.3);
1415dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  q+=2;
1416dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                }
1417dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy              else
1418dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                {
1419dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  value*=pow(10.0,e);
1420dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  q++;
1421dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                }
1422dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            }
1423dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        }
142440937044c58de334456bbfb2b6fed5ab03fd2946cristy      if ((*q == 'B') || (*q == 'P'))
1425099a73566dcb0cddef83ca4e94fe3e2534e6b19ecristy        q++;
1426dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    }
1427dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  if (sentinal != (char **) NULL)
1428dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    *sentinal=q;
1429dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  return(value);
1430dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy}
1431dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1432dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy/*
1433dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1434dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1435dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1436dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
14376f2013165d72f7d8ef5f66bb9453126d88113809anthony%   I s S t r i n g T r u e                                                   %
14386f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14396f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14406f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14416f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14426f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14436f2013165d72f7d8ef5f66bb9453126d88113809anthony%  IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
14446f2013165d72f7d8ef5f66bb9453126d88113809anthony%  "1". Any other string or undefined returns MagickFalse.
14456f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14466f2013165d72f7d8ef5f66bb9453126d88113809anthony%  Typically this is used to look at strings (options or artifacts) which
14476f2013165d72f7d8ef5f66bb9453126d88113809anthony%  has a default value of "false", when not defined.
14486f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14496f2013165d72f7d8ef5f66bb9453126d88113809anthony%  The format of the IsStringTrue method is:
14506f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14516f2013165d72f7d8ef5f66bb9453126d88113809anthony%      MagickBooleanType IsStringTrue(const char *value)
14526f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14536f2013165d72f7d8ef5f66bb9453126d88113809anthony%  A description of each parameter follows:
14546f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14556f2013165d72f7d8ef5f66bb9453126d88113809anthony%    o value: Specifies a pointer to a character array.
14566f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14576f2013165d72f7d8ef5f66bb9453126d88113809anthony*/
14586f2013165d72f7d8ef5f66bb9453126d88113809anthonyMagickExport MagickBooleanType IsStringTrue(const char *value)
14596f2013165d72f7d8ef5f66bb9453126d88113809anthony{
14606f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (value == (const char *) NULL)
14616f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14626f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"true") == 0)
14636f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14646f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"on") == 0)
14656f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14666f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"yes") == 0)
14676f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14686f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"1") == 0)
14696f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14706f2013165d72f7d8ef5f66bb9453126d88113809anthony  return(MagickFalse);
14716f2013165d72f7d8ef5f66bb9453126d88113809anthony}
14726f2013165d72f7d8ef5f66bb9453126d88113809anthony
14736f2013165d72f7d8ef5f66bb9453126d88113809anthony/*
14746f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14756f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14766f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14776f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14789a846de2088aabf3d58a275d2157b40c53d8597ddirk%   I s S t r i n g F a l s e                                                 %
14796f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14806f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14816f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14826f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14836f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14849a846de2088aabf3d58a275d2157b40c53d8597ddirk%  IsStringFalse() returns MagickTrue if the value is "false", "off", "no" or
14859a846de2088aabf3d58a275d2157b40c53d8597ddirk%  "0". Any other string or undefined returns MagickFalse.
14866f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14876f2013165d72f7d8ef5f66bb9453126d88113809anthony%  Typically this is used to look at strings (options or artifacts) which
14886f2013165d72f7d8ef5f66bb9453126d88113809anthony%  has a default value of "true", when it has not been defined.
14896f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14909a846de2088aabf3d58a275d2157b40c53d8597ddirk%  The format of the IsStringFalse method is:
14916f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14929a846de2088aabf3d58a275d2157b40c53d8597ddirk%      MagickBooleanType IsStringFalse(const char *value)
14936f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14946f2013165d72f7d8ef5f66bb9453126d88113809anthony%  A description of each parameter follows:
14956f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14966f2013165d72f7d8ef5f66bb9453126d88113809anthony%    o value: Specifies a pointer to a character array.
14976f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14986f2013165d72f7d8ef5f66bb9453126d88113809anthony*/
14999a846de2088aabf3d58a275d2157b40c53d8597ddirkMagickExport MagickBooleanType IsStringFalse(const char *value)
15006f2013165d72f7d8ef5f66bb9453126d88113809anthony{
15016f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (value == (const char *) NULL)
15026f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
15039a846de2088aabf3d58a275d2157b40c53d8597ddirk  if (LocaleCompare(value,"false") == 0)
15049a846de2088aabf3d58a275d2157b40c53d8597ddirk    return(MagickTrue);
15056f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"off") == 0)
15069a846de2088aabf3d58a275d2157b40c53d8597ddirk    return(MagickTrue);
15076f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"no") == 0)
15089a846de2088aabf3d58a275d2157b40c53d8597ddirk    return(MagickTrue);
15096f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"0") == 0)
15109a846de2088aabf3d58a275d2157b40c53d8597ddirk    return(MagickTrue);
15119a846de2088aabf3d58a275d2157b40c53d8597ddirk  return(MagickFalse);
15126f2013165d72f7d8ef5f66bb9453126d88113809anthony}
15136f2013165d72f7d8ef5f66bb9453126d88113809anthony
15146f2013165d72f7d8ef5f66bb9453126d88113809anthony/*
15156f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15166f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15176f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15186f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   P r i n t S t r i n g I n f o                                             %
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PrintStringInfo() prints the string.
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PrintStringInfo method is:
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void PrintStringInfo(FILE *file,const char *id,
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *string_info)
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file: the file, typically stdout.
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o id: the string id.
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void PrintStringInfo(FILE *file,const char *id,
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *string_info)
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(id != (const char *) NULL);
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1553e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i++)
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
15622d8723c6c8513a97ec8ba8bd1dd971ea28d9e13dcristy  (void) FormatLocaleFile(file,"%s(%.20g): ",id,(double) string_info->length);
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == string_info->length)
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
156553ea28bdea98fe4b2cbd5811ef61b2ac4fa5d721cristy      for (i=0; i < string_info->length; i++)
156653ea28bdea98fe4b2cbd5811ef61b2ac4fa5d721cristy        (void) fputc(string_info->datum[i],file);
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc('\n',file);
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to a HEX list.
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i+=0x14)
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1576b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1579b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for ( ; j <= 0x14; j++)
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc(' ',file);
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isprint((int) ((unsigned char) *p)) != 0)
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(*p,file);
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc('-',file);
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc('\n',file);
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e s e t S t r i n g I n f o                                             %
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ResetStringInfo() reset the string to all null bytes.
16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ResetStringInfo method is:
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ResetStringInfo(StringInfo *string_info)
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ResetStringInfo(StringInfo *string_info)
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1628e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
163440639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
163540639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
163640639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
163740639d173aa8c76b850d625c630b711fee4dcfb8Cristy%   S a n t i z e S t r i n g                                                 %
163840639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
163940639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
164040639d173aa8c76b850d625c630b711fee4dcfb8Cristy%                                                                             %
164140639d173aa8c76b850d625c630b711fee4dcfb8Cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164240639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
164340639d173aa8c76b850d625c630b711fee4dcfb8Cristy%  SanitizeString() returns an new string removes all characters except
164440639d173aa8c76b850d625c630b711fee4dcfb8Cristy%  letters, digits and !#$%&'*+-=?^_`{|}~@.[].
164540639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
164640639d173aa8c76b850d625c630b711fee4dcfb8Cristy%  The returned string shoud be freed using DestoryString().
164740639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
164840639d173aa8c76b850d625c630b711fee4dcfb8Cristy%  The format of the SanitizeString method is:
164940639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
165040639d173aa8c76b850d625c630b711fee4dcfb8Cristy%      char *SanitizeString(const char *source)
165140639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
165240639d173aa8c76b850d625c630b711fee4dcfb8Cristy%  A description of each parameter follows:
165340639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
165440639d173aa8c76b850d625c630b711fee4dcfb8Cristy%    o source: A character string.
165540639d173aa8c76b850d625c630b711fee4dcfb8Cristy%
165640639d173aa8c76b850d625c630b711fee4dcfb8Cristy*/
165740639d173aa8c76b850d625c630b711fee4dcfb8CristyMagickExport char *SanitizeString(const char *source)
165840639d173aa8c76b850d625c630b711fee4dcfb8Cristy{
165940639d173aa8c76b850d625c630b711fee4dcfb8Cristy  char
166040639d173aa8c76b850d625c630b711fee4dcfb8Cristy    *sanitize_source;
166140639d173aa8c76b850d625c630b711fee4dcfb8Cristy
166240639d173aa8c76b850d625c630b711fee4dcfb8Cristy  const char
166340639d173aa8c76b850d625c630b711fee4dcfb8Cristy    *q;
166440639d173aa8c76b850d625c630b711fee4dcfb8Cristy
166540639d173aa8c76b850d625c630b711fee4dcfb8Cristy  register char
166640639d173aa8c76b850d625c630b711fee4dcfb8Cristy    *p;
166740639d173aa8c76b850d625c630b711fee4dcfb8Cristy
166840639d173aa8c76b850d625c630b711fee4dcfb8Cristy  static char
166940639d173aa8c76b850d625c630b711fee4dcfb8Cristy    whitelist[] =
167040639d173aa8c76b850d625c630b711fee4dcfb8Cristy      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
167140639d173aa8c76b850d625c630b711fee4dcfb8Cristy      "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
167240639d173aa8c76b850d625c630b711fee4dcfb8Cristy
167340639d173aa8c76b850d625c630b711fee4dcfb8Cristy  sanitize_source=AcquireString(source);
167440639d173aa8c76b850d625c630b711fee4dcfb8Cristy  p=sanitize_source;
167540639d173aa8c76b850d625c630b711fee4dcfb8Cristy  q=sanitize_source+strlen(sanitize_source);
167640639d173aa8c76b850d625c630b711fee4dcfb8Cristy  for (p+=strspn(p,whitelist); p != q; p+=strspn(p,whitelist))
167740639d173aa8c76b850d625c630b711fee4dcfb8Cristy    *p='_';
167840639d173aa8c76b850d625c630b711fee4dcfb8Cristy  return(sanitize_source);
167940639d173aa8c76b850d625c630b711fee4dcfb8Cristy}
168040639d173aa8c76b850d625c630b711fee4dcfb8Cristy
168140639d173aa8c76b850d625c630b711fee4dcfb8Cristy/*
168240639d173aa8c76b850d625c630b711fee4dcfb8Cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o                                                 %
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfo() copies the source string to the destination string.
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfo method is:
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfo(StringInfo *string_info,const StringInfo *source)
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfo(StringInfo *string_info,
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1709e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
1711e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length == 0)
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
171554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
171654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    source->length));
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoDatum() copies bytes from the source string for the length of
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the destination string.
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoDatum method is:
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoDatum(StringInfo *string_info,
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const unsigned char *source)
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoDatum(StringInfo *string_info,
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char *source)
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1749e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
175154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(string_info->datum,source,string_info->length);
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o L e n g t h                                     %
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoLength() set the string length to the specified value.
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoLength method is:
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoLength(StringInfo *string_info,const size_t length)
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoLength(StringInfo *string_info,
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1782e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
1783151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
1788151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      MagickPathExtent,sizeof(*string_info->datum));
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
1791151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      length+MagickPathExtent,sizeof(*string_info->datum));
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoPath() sets the path associated with the string.
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoPath method is:
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoPath(StringInfo *string_info,const char *path)
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o path: the path.
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1823e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(path != (const char *) NULL);
1825cecec52e2776178c2aa65a2c500fdc4eb175aa1fdirk  string_info->path=ConstantString(path);
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S p l i t S t r i n g I n f o                                             %
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SplitStringInfo() splits a string into two and returns it.
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SplitStringInfo method is:
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t offset)
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *split_info;
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
1857e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(string_info->signature == MagickCoreSignature);
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (offset > string_info->length)
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  split_info=AcquireStringInfo(offset);
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfo(split_info,string_info);
18621bd862cf6e1ac2d4d43eac8fb35eeb96a24f1cbacristy  (void) memmove(string_info->datum,string_info->datum+offset,
1863151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    string_info->length-offset+MagickPathExtent);
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,string_info->length-offset);
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(split_info);
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g I n f o T o S t r i n g                                       %
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringInfoToString() converts a string info string to a C string.
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringInfoToString method is:
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringInfoToString(const StringInfo *string_info)
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string.
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringInfoToString(const StringInfo *string_info)
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
1900151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length >= (MagickPathExtent-1))
1901a42df255c73726a530ac51cc6867bb71a8d23370cristy    string=(char *) AcquireQuantumMemory(length+MagickPathExtent,
1902a42df255c73726a530ac51cc6867bb71a8d23370cristy      sizeof(*string));
1903208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  if (string == (char *) NULL)
1904208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    return((char *) NULL);
190554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
1906208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  string[length]='\0';
19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string);
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1915b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%   S t r i n g I n f o T o H e x S t r i n g                                 %
1916b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
1917b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
1918b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
1919b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1920b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1921b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  StringInfoToHexString() converts a string info string to a C string.
1922b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1923b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The format of the StringInfoToHexString method is:
1924b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1925b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%      char *StringInfoToHexString(const StringInfo *string_info)
1926b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1927b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  A description of each parameter follows:
1928b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1929b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%    o string_info: the string.
1930b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1931b1d483a6a6a5678173db9d60bec52dd5a37826beanthony*/
1932b1d483a6a6a5678173db9d60bec52dd5a37826beanthonyMagickExport char *StringInfoToHexString(const StringInfo *string_info)
1933b1d483a6a6a5678173db9d60bec52dd5a37826beanthony{
1934b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  char
1935b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *string;
1936b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1937b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register const unsigned char
1938b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *p;
1939b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1940b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register ssize_t
1941b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    i;
1942b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1943b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register unsigned char
1944b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q;
1945b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1946b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  size_t
1947b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    length;
1948b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1949b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  unsigned char
1950b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    hex_digits[16];
1951b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1952b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  length=string_info->length;
1953151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  if (~length < MagickPathExtent)
1954b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
1955a42df255c73726a530ac51cc6867bb71a8d23370cristy  string=(char *) AcquireQuantumMemory(length+MagickPathExtent,2*
1956a42df255c73726a530ac51cc6867bb71a8d23370cristy    sizeof(*string));
1957b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  if (string == (char *) NULL)
1958b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
1959b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[0]='0';
1960b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[1]='1';
1961b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[2]='2';
1962b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[3]='3';
1963b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[4]='4';
1964b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[5]='5';
1965b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[6]='6';
1966b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[7]='7';
1967b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[8]='8';
1968b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[9]='9';
1969b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[10]='a';
1970b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[11]='b';
1971b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[12]='c';
1972b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[13]='d';
1973b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[14]='e';
1974b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[15]='f';
1975b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  p=string_info->datum;
1976b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  q=(unsigned char *) string;
1977b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  for (i=0; i < (ssize_t) string_info->length; i++)
1978b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  {
1979b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q++=hex_digits[(*p >> 4) & 0x0f];
1980b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q++=hex_digits[*p & 0x0f];
1981b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    p++;
1982b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  }
1983b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *q='\0';
1984b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  return(string);
1985b1d483a6a6a5678173db9d60bec52dd5a37826beanthony}
1986b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
1987b1d483a6a6a5678173db9d60bec52dd5a37826beanthony/*
1988b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1989b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
1990b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
1991b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o A r g v                                                    %
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToArgv() converts a text string into command line arguments.
199931f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  The 'argv' array of arguments, is returned while the number of arguments
200031f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  is returned via the provided integer variable pointer.
200131f1bf7bb6ee2698a2afab42ee0329b11663636canthony%
200231f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  Simple 'word' tokenizer, which allows for each word to be optionally
200331f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  quoted.  However it will not allow use of partial quotes, or escape
200431f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  characters.
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToArgv method is:
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToArgv(const char *text,int *argc)
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argv:  Method StringToArgv returns the string list unless an error
20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      occurs, otherwise NULL.
20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argc:  This integer pointer returns the number of arguments in the
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      list.
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToArgv(const char *text,int *argc)
20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **argv;
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2030bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *argc=0;
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine the number of arguments.
20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; )
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
2043a20c904a6f3e3a11939d5260485be72d5c849c63cristy    if (*p == '\0')
204474895d33fcb55c51dd9205984fadb102e20bae16cristy      break;
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (*argc)++;
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '"')
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '"') && (*p != '\0'); p++) ;
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\'')
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '\'') && (*p != '\0'); p++) ;
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (*argc)++;
20541b26e1f30a41ec15901231d6baba7345e2d3cd50cristy  argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (argv == (char **) NULL)
20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
20573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to an ASCII list.
20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[0]=AcquireString("magick");
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=text;
2062bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=1; i < (ssize_t) *argc; i++)
20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=p;
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '"')
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q++; (*q != '"') && (*q != '\0'); q++) ;
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\'')
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
207506b15f4383540e74d93dbe58488e193619b09df7cristy          p++;
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (q++; (*q != '\'') && (*q != '\0'); q++) ;
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
2081151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MagickPathExtent,
20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(**argv));
20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (argv[i] == (char *) NULL)
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i--; i >= 0; i--)
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          argv[i]=DestroyString(argv[i]);
20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        argv=(char **) RelinquishMagickMemory(argv);
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,
20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToConvertStringToARGV");
20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
209154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(argv[i],p,(size_t) (q-p));
2092208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    argv[i][q-p]='\0';
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=q;
20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
20973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[i]=(char *) NULL;
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(argv);
20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2106b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%   S t r i n g T o A r r a y O f D o u b l e s                               %
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21126ab8238b93100582301c2b2f4de26b17537c43d3glennrp%  StringToArrayOfDoubles() converts a string of space or comma separated
2113b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  numbers into array of floating point numbers (doubles). Any number that
2114b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  failes to parse properly will produce a syntax error. As will two commas
2115b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  without a  number between them.  However a final comma at the end will
2116b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  not be regarded as an error so as to simplify automatic list generation.
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2118b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  A NULL value is returned on syntax or memory errors.
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2120b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  Use RelinquishMagickMemory() to free returned array when finished.
2121b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2122b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The format of the StringToArrayOfDoubles method is:
2123b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
212466336b0d0c7625c8df9601a1f4b8af36759b5776cristy%     double *StringToArrayOfDoubles(const char *string,size_t *count,
212566336b0d0c7625c8df9601a1f4b8af36759b5776cristy%       ExceptionInfo *exception)
21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21296ab8238b93100582301c2b2f4de26b17537c43d3glennrp%    o string: the string containing the comma/space separated values.
2130b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2131b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%    o count: returns number of arguments in returned array
2132b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2133520857341848779f2abe19f520c3213c4e315a5dcristy%    o exception: return any errors or warnings in this structure.
2134520857341848779f2abe19f520c3213c4e315a5dcristy%
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2136520857341848779f2abe19f520c3213c4e315a5dcristyMagickExport double *StringToArrayOfDoubles(const char *string,ssize_t *count,
2137520857341848779f2abe19f520c3213c4e315a5dcristy  ExceptionInfo *exception)
21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
2140b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q;
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21420a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  const char
21430a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    *p;
21440a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy
2145b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  double
2146b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *array;
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2148bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21510a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  /*
21520a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    Determine count of values, and check syntax.
21530a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  */
2154b0de93fdedaac769cb08e15b3ec176d4c9078907cristy  assert(exception != (ExceptionInfo *) NULL);
2155e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
2156b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *count=0;
2157b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  i=0;
21580a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  p=string;
21590a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  while (*p != '\0')
2160b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  {
21610a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    (void) StringToDouble(p,&q);  /* get value - ignores leading space */
21620a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    if (p == q)
21630a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy      return((double *) NULL);  /* no value found */
21640a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    p=q;
21650a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    i++;  /* increment value count */
21660a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    while (isspace((int) ((unsigned char) *p)) != 0)
21670a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy      p++;  /* skip spaces */
21680a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    if (*p == ',')
21690a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy      p++;  /* skip comma */
21700a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    while (isspace((int) ((unsigned char) *p)) != 0)
21710a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy      p++;  /* and more spaces */
2172b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  }
21730a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  /*
21740a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    Allocate floating point argument list.
21750a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  */
2176b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *count=i;
21770a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  array=(double *) AcquireQuantumMemory((size_t) i,sizeof(*array));
21780a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  if (array == (double *) NULL)
217970ca022b682f119009b341432aecd7a1662138afcristy    {
218070ca022b682f119009b341432aecd7a1662138afcristy      (void) ThrowMagickException(exception,GetMagickModule(),
218170ca022b682f119009b341432aecd7a1662138afcristy        ResourceLimitError,"MemoryAllocationFailed","`%s'","");
218270ca022b682f119009b341432aecd7a1662138afcristy      return((double *) NULL);
218370ca022b682f119009b341432aecd7a1662138afcristy    }
21840a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  /*
21850a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    Fill in the floating point values.
21860a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  */
2187b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  i=0;
21880a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  p=string;
21890a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  while ((*p != '\0') && (i < *count))
21900a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy  {
2191b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    array[i++]=StringToDouble(p,&q);
2192b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    p=q;
21930a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy    while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ','))
21940a887dc2ac15d4a89a9237401f06c2f748e0ec2bcristy      p++;
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2196b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  return(array);
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2204b1d483a6a6a5678173db9d60bec52dd5a37826beanthony+   S t r i n g T o k e n                                                     %
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
221066336b0d0c7625c8df9601a1f4b8af36759b5776cristy%  StringToken() looks for any one of given delimiters and splits the string
2211b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  into two separate strings by replacing the delimiter character found with a
2212b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  nul character.
2213b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2214b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The given string pointer is changed to point to the string following the
2215b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  delimiter character found, or NULL.  A pointer to the start of the
2216b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  string is returned, representing the token before the delimiter.
2217b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2218b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  In may ways this is equivent to the strtok() C library function, but with
2219b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  multiple delimiter characters rather than a delimiter string.
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToken method is:
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringToken(const char *delimiters,char **string)
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o delimiters: one or more delimiters.
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: return the first token in the string.  If none is found, return
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      NULL.
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringToken(const char *delimiters,char **string)
22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *r;
22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c,
22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    d;
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(*string);
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
2251b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  q=p;
2252b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  for ( ; ; )
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c=(*p++);
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    r=delimiters;
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    do
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      d=(*r++);
22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (c == d)
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (c == '\0')
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(char *) NULL;
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p[-1]='\0';
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *string=p;
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(q);
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    } while (d != '\0');
22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o L i s t                                                    %
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToList() converts a text string into a list by segmenting the text
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string at each carriage return discovered.  The list is converted to HEX
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  characters if any control characters are discovered within the text string.
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToList method is:
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToList(const char *text)
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToList(const char *text)
22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **textlist;
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2304bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2307bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    lines;
23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; p++)
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*p == '\0')
23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register const char
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to an ASCII list.
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      lines=1;
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p=text; *p != '\0'; p++)
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*p == '\n')
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          lines++;
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2333bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q=p; *q != '\0'; q++)
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((*q == '\r') || (*q == '\n'))
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2338a42df255c73726a530ac51cc6867bb71a8d23370cristy        textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+
2339a42df255c73726a530ac51cc6867bb71a8d23370cristy          MagickPathExtent,sizeof(**textlist));
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
234254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy        (void) memcpy(textlist[i],p,(size_t) (q-p));
2343208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy        textlist[i][q-p]='\0';
23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*q == '\r')
23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=q+1;
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
2352151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        hex_string[MagickPathExtent];
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2357bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register ssize_t
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j;
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to a HEX list.
23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2363bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      lines=(size_t) (strlen(text)/0x14)+1;
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2369bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2371151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        textlist[i]=(char *) AcquireQuantumMemory(2UL*MagickPathExtent,
23722e25ee6694d278f85b4b3b9169fe0017aac8ab8ecristy          sizeof(**textlist));
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2375151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(textlist[i],MagickPathExtent,"0x%08lx: ",
2376f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy          (long) (0x14*i));
23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=textlist[i]+strlen(textlist[i]);
2378bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2380151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(hex_string,MagickPathExtent,"%02x",*(p+j));
2381151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(q,hex_string,MagickPathExtent);
23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q+=2;
23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for ( ; j <= 0x14; j++)
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=' ';
2394bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (isprint((int) ((unsigned char) *p)) != 0)
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(*p);
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++='-';
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q='\0';
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  textlist[i]=(char *) NULL;
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(textlist);
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g T o S t r i n g I n f o                                       %
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2420bca58f3e54324602dbfe91102715646f23a2ad99cristy%  StringToStringInfo() converts a string to a StringInfo type.
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToStringInfo method is:
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *StringToStringInfo(const char *string)
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string:  The string.
24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *StringToStringInfo(const char *string)
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (const char *) NULL);
2437bca58f3e54324602dbfe91102715646f23a2ad99cristy  string_info=AcquireStringInfo(strlen(string));
24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoDatum(string_info,(const unsigned char *) string);
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i p S t r i n g                                                     %
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StripString() strips any whitespace or quotes from the beginning and end of
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a string of characters.
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StripString method is:
24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void StripString(char *message)
24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o message: Specifies an array of characters.
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void StripString(char *message)
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(message != (char *) NULL);
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*message == '\0')
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(message);
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=message;
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (isspace((int) ((unsigned char) *p)) != 0)
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((*p == '\'') || (*p == '"'))
24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=message+length-1;
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q--;
24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q > p)
24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*q == '\'') || (*q == '"'))
24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q--;
2489a63c1ba89fd24334d128308e74acbcaee52f4ba3cristy  (void) memmove(message,p,(size_t) (q-p+1));
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message[q-p+1]='\0';
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=message; *p != '\0'; p++)
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\n')
24933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *p=' ';
24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
24973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S u b s t i t u t e S t r i n g                                           %
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2507f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  SubstituteString() performs string substitution on a string, replacing the
2508f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  string with the substituted version. Buffer must be allocated from the heap.
2509bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  If the string is matched and status, MagickTrue is returned otherwise
2510bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  MagickFalse.
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SubstituteString method is:
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2514f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%      MagickBooleanType SubstituteString(char **string,const char *search,
25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *replace)
25163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2519f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%    o string: the string to perform replacements on;  replaced with new
25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      allocation if a replacement is made.
25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2522bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o search: search for this string.
25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2524bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o replace: replace any matches with this string.
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2527f1b72c1946e0ea84ad884f358cbcc595ab162b10cristyMagickExport MagickBooleanType SubstituteString(char **string,
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *search,const char *replace)
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2530bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  MagickBooleanType
2531bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    status;
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2533bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  register char
2534bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    *p;
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2537bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    extent,
2538bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    replace_extent,
2539bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    search_extent;
2540bc3392ad730a0886c1fabc9ae546b4de30a98526cristy
2541f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  ssize_t
2542f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    offset;
2543f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy
2544bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  status=MagickFalse;
2545bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  search_extent=0,
2546bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  replace_extent=0;
2547f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2549f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (search_extent == 0)
2550f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy      search_extent=strlen(search);
2551f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (strncmp(p,search,search_extent) != 0)
2552bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      continue;
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2554bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      We found a match.
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2556f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    status=MagickTrue;
2557bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent == 0)
2558bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      replace_extent=strlen(replace);
2559bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent > search_extent)
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2561bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        /*
2562bc3392ad730a0886c1fabc9ae546b4de30a98526cristy          Make room for the replacement string.
2563bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        */
2564de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        offset=(ssize_t) (p-(*string));
2565e08c3b83ee93ae67d66b8a8163b2165bc389b7d7cristy        extent=strlen(*string)+replace_extent-search_extent+1;
2566151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        *string=(char *) ResizeQuantumMemory(*string,extent+MagickPathExtent,
2567f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy          sizeof(*p));
2568f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        if (*string == (char *) NULL)
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2570f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        p=(*string)+offset;
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2573bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      Replace string.
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2575bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (search_extent != replace_extent)
25760a9b3721bfaf93092820843450387092e7c30b0bcristy      (void) CopyMagickMemory(p+replace_extent,p+search_extent,
25770a9b3721bfaf93092820843450387092e7c30b0bcristy        strlen(p+search_extent)+1);
25780a9b3721bfaf93092820843450387092e7c30b0bcristy    (void) CopyMagickMemory(p,replace,replace_extent);
2579f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    p+=replace_extent-1;
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2581bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  return(status);
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2583