string.c revision 067622389550e83c76724917c7e5c55b0887d153
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                                 %
16670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                               John Cristy                                   %
17670aa3c328eb7d97a3edd44ef7b4244d2effa935cristy%                               August 2003                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
201454be7db7a897f42cd40e4165f945d77196a6f8cristy%  Copyright 1999-2012 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"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/locale_.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/log.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
51d2d11ec3ae6f94d5b49cbaf90e7f9ca18c252d29cristy#include "MagickCore/nt-base-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/signature-private.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
56b1d483a6a6a5678173db9d60bec52dd5a37826beanthony#include "MagickCore/string-private.h"
5718c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy#include "MagickCore/utility-private.h"
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6099bbf2c9e414ade263949978671025728413c1c9cristy  static declarations.
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const unsigned char
6499bbf2c9e414ade263949978671025728413c1c9cristy  asciimap[] =
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xfc, 0xfd, 0xfe, 0xff,
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g                                                 %
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireString() allocates memory for a string and copies the source string
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to that memory location (and returns it).
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
105b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The returned string shoud be freed using DestoryString() or
106b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  RelinquishMagickMemory() when finished.
107b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireString method is:
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *AcquireString(const char *source)
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *AcquireString(const char *source)
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
12854aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (~length < MaxTextExtent)
12954aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
13054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
13154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    sizeof(*destination));
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
13654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
13754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g I n f o                                         %
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireStringInfo() allocates the StringInfo structure.
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireStringInfo method is:
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *AcquireStringInfo(const size_t length)
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *AcquireStringInfo(const size_t length)
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16873bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info == (StringInfo *) NULL)
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->signature=MagickSignature;
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info->datum=(unsigned char *) NULL;
17737e0b38220ae42c2f0aba086d2252b7cbebcd434cristy      if (~string_info->length >= (MaxTextExtent-1))
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        string_info->datum=(unsigned char *) AcquireQuantumMemory(
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          string_info->length+MaxTextExtent,sizeof(*string_info->datum));
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (string_info->datum == (unsigned char *) NULL)
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1918723e4bcd840478cecfd29891e792edb499cd0e9cristy%   B l o b T o S t r i n g I n f o                                           %
1928723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1938723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1948723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1958723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1968723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1978723e4bcd840478cecfd29891e792edb499cd0e9cristy%  BlobToStringInfo() returns the contents of a blob as a string.
1988723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1998723e4bcd840478cecfd29891e792edb499cd0e9cristy%  The format of the BlobToStringInfo method is:
2008723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2018723e4bcd840478cecfd29891e792edb499cd0e9cristy%      StringInfo *BlobToStringInfo(const void *blob,const size_t length)
2028723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2038723e4bcd840478cecfd29891e792edb499cd0e9cristy%  A description of each parameter follows:
2048723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2058723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o blob: the blob.
2068723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2078723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o length: the length of the blob.
2088723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2098723e4bcd840478cecfd29891e792edb499cd0e9cristy*/
2108723e4bcd840478cecfd29891e792edb499cd0e9cristyMagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
2118723e4bcd840478cecfd29891e792edb499cd0e9cristy{
2128723e4bcd840478cecfd29891e792edb499cd0e9cristy  StringInfo
2138723e4bcd840478cecfd29891e792edb499cd0e9cristy    *string_info;
2148723e4bcd840478cecfd29891e792edb499cd0e9cristy
2158723e4bcd840478cecfd29891e792edb499cd0e9cristy  string_info=AcquireStringInfo(0);
216f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy  string_info->length=length;
217a10e07483be74957a2b75f4ae0776bff433947a4cristy  if (~string_info->length >= (MaxTextExtent-1))
218f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(
219f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy      string_info->length+MaxTextExtent,sizeof(*string_info->datum));
2208723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (string_info->datum == (unsigned char *) NULL)
2218723e4bcd840478cecfd29891e792edb499cd0e9cristy    {
2228723e4bcd840478cecfd29891e792edb499cd0e9cristy      string_info=DestroyStringInfo(string_info);
2238723e4bcd840478cecfd29891e792edb499cd0e9cristy      return((StringInfo *) NULL);
2248723e4bcd840478cecfd29891e792edb499cd0e9cristy    }
2258723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (blob != (const void *) NULL)
2268723e4bcd840478cecfd29891e792edb499cd0e9cristy    (void) memcpy(string_info->datum,blob,length);
2278723e4bcd840478cecfd29891e792edb499cd0e9cristy  return(string_info);
2288723e4bcd840478cecfd29891e792edb499cd0e9cristy}
2298723e4bcd840478cecfd29891e792edb499cd0e9cristy
2308723e4bcd840478cecfd29891e792edb499cd0e9cristy/*
2318723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2328723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2338723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2348723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g                                                     %
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloneString() allocates memory for the destination string and copies
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the source string to that memory location.
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24472feaa664126c198b9ccd072b6ef181338a76c6canthony%  If source is a NULL pointer the destination will also be set to a NULL
24572feaa664126c198b9ccd072b6ef181338a76c6canthony%  point (any existing string is freed).  Otherwise the memory is allocated
24672feaa664126c198b9ccd072b6ef181338a76c6canthony%  (or resized) and the source string copied into it.
24772feaa664126c198b9ccd072b6ef181338a76c6canthony%
24872feaa664126c198b9ccd072b6ef181338a76c6canthony%  A pointer to the copy of the source string, or NULL is returned.
24972feaa664126c198b9ccd072b6ef181338a76c6canthony%
250067622389550e83c76724917c7e5c55b0887d153anthony%  Free the string using DestoryString().
251067622389550e83c76724917c7e5c55b0887d153anthony%
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneString method is:
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *CloneString(char **destination,const char *source)
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *CloneString(char **destination,const char *source)
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*destination != (char *) NULL)
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *destination=DestroyString(*destination);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(source);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
285b936f7089f8bd56bf771c7cb6017a9af98a4ffd5cristy    sizeof(**destination));
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
28854aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (length != 0)
289f7e6ab4637e31098c9cfd70546aed44870c27ee5cristy    (void) memcpy(*destination,source,length*sizeof(**destination));
290208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  (*destination)[length]='\0';
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(*destination);
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g I n f o                                             %
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloneStringInfo() clones a copy of the StringInfo structure.
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneStringInfo method is:
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *CloneStringInfo(const StringInfo *string_info)
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *clone_info;
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  clone_info=AcquireStringInfo(string_info->length);
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
32654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(clone_info);
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o m p a r e S t r i n g I n f o                                         %
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CompareStringInfo() compares the two datums target and source.  It returns
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  an integer less than, equal to, or greater than zero if target is found,
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  respectively, to be less than, to match, or be greater than source.
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CompareStringInfo method is:
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int CompareStringInfo(const StringInfo *target,const StringInfo *source)
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target: the target string.
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline size_t MagickMin(const size_t x,const size_t y)
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < y)
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport int CompareStringInfo(const StringInfo *target,
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(target != (StringInfo *) NULL);
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(target->signature == MagickSignature);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source->signature == MagickSignature);
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=memcmp(target->datum,source->datum,MagickMin(target->length,
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source->length));
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != 0)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target->length == source->length)
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target->length < source->length ? -1 : 1);
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e M a g i c k S t r i n g                             %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateMagickString() concatenates the source string to the destination
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.  The destination buffer is always null-terminated even if the
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string must be truncated.
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateMagickString method is:
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t ConcatenateMagickString(char *destination,const char *source,
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t ConcatenateMagickString(char *destination,
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source,const size_t length)
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char *) NULL);
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(length >= 1);
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length;
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((i-- != 0) && (*q != '\0'))
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=(size_t) (q-destination);
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length-count;
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == 0)
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(count+strlen(p));
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (*p != '\0')
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (i != 1)
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i--;
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count+(p-source));
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g                                         %
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateString() appends a copy of string source, including the
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  terminating null character, to the end of string destination.
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateString method is:
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ConcatenateString(char **destination,
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *source)
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ConcatenateString(char **destination,
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source)
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
48354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    destination_length,
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length,
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_length;
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination_length=strlen(*destination);
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source_length=strlen(source);
49754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  length=destination_length;
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source_length)
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length+=source_length;
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
504cf1667cdd8f64c3d41e5cf404bce8799e3b5da9bcristy    sizeof(**destination));
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
50754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (source_length != 0)
50854aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy((*destination)+destination_length,source,source_length);
50954aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (*destination)[length]='\0';
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g I n f o                                 %
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateStringInfo() concatenates the source string to the destination
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateStringInfo method is:
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ConcatenateStringInfo(StringInfo *string_info,
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *source)
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ConcatenateStringInfo(StringInfo *string_info,
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const StringInfo *) NULL);
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source->length)
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,length+source->length);
55354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum+length,source->datum,source->length);
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                         %
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConfigureFileToStringInfo() returns the contents of a configure file as a
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConfigureFileToStringInfo method is:
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *ConfigureFileToStringInfo(const char *filename)
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
58099bbf2c9e414ade263949978671025728413c1c9cristyMagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file;
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset;
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  void
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map;
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
60118c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy  file=open_utf8(filename,O_RDONLY | O_BINARY,0);
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == -1)
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
6047f31770d102a777269fa2452cc6a1ce304da4e12cristy  offset=(MagickOffsetType) lseek(file,0,SEEK_END);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(size_t) offset;
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
61237e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string == (char *) NULL)
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map=MapBlob(file,ReadMode,0,length);
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map != (void *) NULL)
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
62254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy      (void) memcpy(string,map,length);
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) UnmapBlob(map,length);
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register size_t
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ssize_t
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count;
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6337f31770d102a777269fa2452cc6a1ce304da4e12cristy      (void) lseek(file,0,SEEK_SET);
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < length; i+=count)
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          SSIZE_MAX));
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (count <= 0)
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=0;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (errno != EINTR)
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (i < length)
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          file=close(file)-1;
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          string=DestroyString(string);
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((StringInfo *) NULL);
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string[length]='\0';
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  file=close(file)-1;
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->datum=(unsigned char *) string;
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n s t a n t S t r i n g                                               %
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConstantString() allocates memory for a string and copies the source string
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to that memory location (and returns it).  Use it for strings that you do
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  do not expect to change over its lifetime.
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
676067622389550e83c76724917c7e5c55b0887d153anthony%  When finished free the string using DestoryString().
677067622389550e83c76724917c7e5c55b0887d153anthony%
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConstantString method is:
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *ConstantString(const char *source)
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *ConstantString(const char *source)
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length >= 1UL)
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
70554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
70654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o p y M a g i c k S t r i n g                                           %
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
721067622389550e83c76724917c7e5c55b0887d153anthony%  CopyMagickString() copies the source string to the destination string, with
722067622389550e83c76724917c7e5c55b0887d153anthony%  out exceeding the given pre-declared length.
723067622389550e83c76724917c7e5c55b0887d153anthony%
724067622389550e83c76724917c7e5c55b0887d153anthony%  The destination buffer is always null-terminated even if the string must be
725067622389550e83c76724917c7e5c55b0887d153anthony%  truncated.  The return value is the minimum of the source string length or
726067622389550e83c76724917c7e5c55b0887d153anthony%  the length parameter.
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CopyMagickString method is:
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t CopyMagickString(const char *destination,char *source,
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t CopyMagickString(char *destination,const char *source,
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n;
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75477e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy  if (source == (const char *) NULL)
75577e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy    return(0);
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (n=length; n > 4; n-=4)
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (n != 0)
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (n--; n != 0; n--)
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q=(*p++);
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\0')
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((size_t) (p-source-1));
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length != 0)
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q='\0';
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((size_t) (p-source-1));
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g                                                 %
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyString() destroys memory associated with a string.
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyString method is:
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *DestroyString(char *string)
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: the string.
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *DestroyString(char *string)
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) RelinquishMagickMemory(string));
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g I n f o                                         %
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringInfo() destroys memory associated with the StringInfo structure.
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringInfo method is:
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *DestroyStringInfo(StringInfo *string_info)
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum != (unsigned char *) NULL)
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) RelinquishMagickMemory(
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info->datum);
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->signature=(~MagickSignature);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=(StringInfo *) RelinquishMagickMemory(string_info);
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g L i s t                                         %
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringList() zeros memory associated with a string list.
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringList method is:
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **DestroyStringList(char **list)
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o list: the string list.
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **DestroyStringList(char **list)
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
876bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(list != (char **) NULL);
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; list[i] != (char *) NULL; i++)
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list[i]=DestroyString(list[i]);
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  list=(char **) RelinquishMagickMemory(list);
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(list);
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E s c a p e S t r i n g                                                   %
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EscapeString() allocates memory for a backslash-escaped version of a
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  source text string, copies the escaped version of the text to that
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory location while adding backslash characters, and returns the
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  escaped string.
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EscapeString method is:
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *EscapeString(const char *source,const char escape)
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o allocate_string:  Method EscapeString returns the escaped string.
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o escape: the quoted string termination character to escape (e.g. '"').
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *EscapeString(const char *source,const char escape)
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(source);
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=source; *p != '\0'; p++)
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == '\\') || (*p == escape))
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (~length < 1)
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length++;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
94037e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(*destination));
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=destination;
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p=source; *p != '\0'; p++)
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((*p == '\\') || (*p == escape))
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++='\\';
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q='\0';
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g                                                   %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToString() returns the contents of a file as a string.
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToString method is:
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *FileToString(const char *filename,const size_t extent,
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *FileToString(const char *filename,const size_t extent,
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) FileToBlob(filename,extent,&length,exception));
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g I n f o                                           %
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToStringInfo() returns the contents of a file as a string.
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToStringInfo method is:
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *FileToStringInfo(const char *filename,const size_t extent,
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *FileToStringInfo(const char *filename,
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t extent,ExceptionInfo *exception)
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info=DestroyStringInfo(string_info);
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k S i z e                                            %
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickSize() converts a size to a human readable format, for example,
10582ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy%  14k, 234m, 2.7g, or 3.0t.  Scaling is done by repetitively dividing by
1059c15ce496469497409afa4e9b67f135726e720ac3cristy%  1000.
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickSize method is:
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1063bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      ssize_t FormatMagickSize(const MagickSizeType size,char *format)
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o size:  convert this size to a human readable format.
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1069b9080c9660565c4ab556254f276bfeca3d4edf02cristy%    o bi:  use power of two rather than power of ten.
1070b9080c9660565c4ab556254f276bfeca3d4edf02cristy%
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o format:  human readable format.
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
107499bbf2c9e414ade263949978671025728413c1c9cristyMagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1075b9080c9660565c4ab556254f276bfeca3d4edf02cristy  const MagickBooleanType bi,char *format)
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1077b9080c9660565c4ab556254f276bfeca3d4edf02cristy  const char
1078b9080c9660565c4ab556254f276bfeca3d4edf02cristy    **units;
1079b9080c9660565c4ab556254f276bfeca3d4edf02cristy
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
1081b9080c9660565c4ab556254f276bfeca3d4edf02cristy    bytes,
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1084bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10889d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
10899d314ff2c17a77996c05413c2013880387e50f0ecristy    count;
10909d314ff2c17a77996c05413c2013880387e50f0ecristy
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
1092b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *bi_units[] =
1093b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
10942ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1095b9080c9660565c4ab556254f276bfeca3d4edf02cristy    },
1096b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *traditional_units[] =
10979bf9da36285c017ede08022f833c722ac503aff1cristy    {
10982ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
10999bf9da36285c017ede08022f833c722ac503aff1cristy    };
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1101b9080c9660565c4ab556254f276bfeca3d4edf02cristy  bytes=1000.0;
1102b9080c9660565c4ab556254f276bfeca3d4edf02cristy  units=traditional_units;
1103b9080c9660565c4ab556254f276bfeca3d4edf02cristy  if (bi != MagickFalse)
1104b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
1105b9080c9660565c4ab556254f276bfeca3d4edf02cristy      bytes=1024.0;
1106b9080c9660565c4ab556254f276bfeca3d4edf02cristy      units=bi_units;
1107b9080c9660565c4ab556254f276bfeca3d4edf02cristy    }
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(_MSC_VER) && (_MSC_VER == 1200)
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(double) ((MagickOffsetType) size);
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(double) size;
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1113b9080c9660565c4ab556254f276bfeca3d4edf02cristy  for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1114b9080c9660565c4ab556254f276bfeca3d4edf02cristy    length/=bytes;
11159bf9da36285c017ede08022f833c722ac503aff1cristy  for (j=2; j < 12; j++)
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1117b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      units[i]);
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (strchr(format,'+') == (char *) NULL)
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k T i m e                                            %
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickTime() returns the specified time in the Internet date/time
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  format and the length of the timestamp.
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickTime method is:
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1141bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      ssize_t FormatMagickTime(const time_t time,const size_t length,
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        char *timestamp)
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o time:  the time since the Epoch (00:00:00 UTC, January 1, 1970),
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     measured in seconds.
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o length: the maximum length of the string.
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o timestamp:  Return the Internet date/time here.
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1154bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyMagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char *timestamp)
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  struct tm
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time,
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time;
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timezone;
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(timestamp != (char *) NULL);
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_LOCALTIME_R)
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) localtime_r(&time,&local_time);
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1174bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=localtime(&time);
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&local_time,my_time,sizeof(local_time));
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_GMTIME_R)
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) gmtime_r(&time,&gm_time);
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1186bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=gmtime(&time);
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&gm_time,my_time,sizeof(gm_time));
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (local_time.tm_yday-gm_time.tm_yday)));
1198b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  count=FormatLocaleString(timestamp,length,
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1201f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy    local_time.tm_min,local_time.tm_sec,(long) timezone);
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t E n v i r o n m e n t V a l u e                                     %
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetEnvironmentValue() returns the environment string that matches the
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified name.
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetEnvironmentValue method is:
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *GetEnvironmentValue(const char *name)
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the environment name.
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
122899bbf2c9e414ade263949978671025728413c1c9cristyMagickExport char *GetEnvironmentValue(const char *name)
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *environment;
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  environment=getenv(name);
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (environment == (const char *) NULL)
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(ConstantString(environment));
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o D a t u m                                       %
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoDatum() returns the datum associated with the string.
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoDatum method is:
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->datum);
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o L e n g t h                                     %
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoLength() returns the string length.
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoLength method is:
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t GetStringInfoLength(const StringInfo *string_info)
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t GetStringInfoLength(const StringInfo *string_info)
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->length);
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o P a t h                                         %
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoPath() returns the path associated with the string.
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoPath method is:
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetStringInfoPath(const StringInfo *string_info)
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetStringInfoPath(const StringInfo *string_info)
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->path);
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1331dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy+   I n t e r p r e t S i P r e f i x V a l u e                               %
1332dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1333dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1334dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1335dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1336dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1337dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  InterpretSiPrefixValue() converts the initial portion of the string to a
1338dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  double representation.  It also recognizes SI prefixes (e.g. B, KB, MiB,
1339dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  etc.).
1340dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1341dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  The format of the InterpretSiPrefixValue method is:
1342dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1343dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%      double InterpretSiPrefixValue(const char *value,char **sentinal)
1344dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1345dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%  A description of each parameter follows:
1346dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1347dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%    o value: the string value.
1348dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1349dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%    o sentinal:  if sentinal is not NULL, return a pointer to the character
1350dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%      after the last character used in the conversion.
1351dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%
1352dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy*/
1353dbdd0e35efc03c9bccda644f5407db38b7c17eeccristyMagickExport double InterpretSiPrefixValue(const char *restrict string,
1354dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  char **restrict sentinal)
1355dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy{
1356dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  char
1357dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    *q;
1358dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1359dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  double
1360dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    value;
1361dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1362dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  value=InterpretLocaleValue(string,&q);
1363dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  if (q != string)
1364dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    {
1365dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy      if ((*q >= 'E') && (*q <= 'z'))
1366dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        {
1367dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy          double
1368dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            e;
1369dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
13700c2684f14358e568d33818fd9182c3aad93c4c0dcristy          switch ((int) ((unsigned char) *q))
13710c2684f14358e568d33818fd9182c3aad93c4c0dcristy          {
13720c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'y': e=(-24.0); break;
13730c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'z': e=(-21.0); break;
13740c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'a': e=(-18.0); break;
13750c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'f': e=(-15.0); break;
13760c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'p': e=(-12.0); break;
13770c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'n': e=(-9.0); break;
13780c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'u': e=(-6.0); break;
13790c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'm': e=(-3.0); break;
13800c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'c': e=(-2.0); break;
13810c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'd': e=(-1.0); break;
13820c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'h': e=2.0; break;
13830c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'k': e=3.0; break;
13840c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'K': e=3.0; break;
13850c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'M': e=6.0; break;
13860c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'G': e=9.0; break;
13870c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'T': e=12.0; break;
13880c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'P': e=15.0; break;
13890c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'E': e=18.0; break;
13900c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'Z': e=21.0; break;
13910c2684f14358e568d33818fd9182c3aad93c4c0dcristy            case 'Y': e=24.0; break;
13920c2684f14358e568d33818fd9182c3aad93c4c0dcristy            default: e=0.0; break;
13930c2684f14358e568d33818fd9182c3aad93c4c0dcristy          }
1394dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy          if (e >= MagickEpsilon)
1395dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            {
1396dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy              if (q[1] == 'i')
1397dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                {
1398dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  value*=pow(2.0,e/0.3);
1399dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  q+=2;
1400dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                }
1401dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy              else
1402dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                {
1403dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  value*=pow(10.0,e);
1404dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                  q++;
1405dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy                }
1406dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy            }
1407dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        }
1408c0f1ed139581fbc6f0200243db6ccd87532e1644cristy      if (*q == 'B')
1409099a73566dcb0cddef83ca4e94fe3e2534e6b19ecristy        q++;
1410dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    }
1411dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  if (sentinal != (char **) NULL)
1412dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy    *sentinal=q;
1413dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy  return(value);
1414dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy}
1415dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy
1416dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy/*
1417dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1418dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1419dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
1420dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy%                                                                             %
14216f2013165d72f7d8ef5f66bb9453126d88113809anthony%   I s S t r i n g T r u e                                                   %
14226f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14236f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14246f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14256f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14266f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14276f2013165d72f7d8ef5f66bb9453126d88113809anthony%  IsStringTrue() returns MagickTrue if the value is "true", "on", "yes" or
14286f2013165d72f7d8ef5f66bb9453126d88113809anthony%  "1". Any other string or undefined returns MagickFalse.
14296f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14306f2013165d72f7d8ef5f66bb9453126d88113809anthony%  Typically this is used to look at strings (options or artifacts) which
14316f2013165d72f7d8ef5f66bb9453126d88113809anthony%  has a default value of "false", when not defined.
14326f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14336f2013165d72f7d8ef5f66bb9453126d88113809anthony%  The format of the IsStringTrue method is:
14346f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14356f2013165d72f7d8ef5f66bb9453126d88113809anthony%      MagickBooleanType IsStringTrue(const char *value)
14366f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14376f2013165d72f7d8ef5f66bb9453126d88113809anthony%  A description of each parameter follows:
14386f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14396f2013165d72f7d8ef5f66bb9453126d88113809anthony%    o value: Specifies a pointer to a character array.
14406f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14416f2013165d72f7d8ef5f66bb9453126d88113809anthony*/
14426f2013165d72f7d8ef5f66bb9453126d88113809anthonyMagickExport MagickBooleanType IsStringTrue(const char *value)
14436f2013165d72f7d8ef5f66bb9453126d88113809anthony{
14446f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (value == (const char *) NULL)
14456f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14466f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"true") == 0)
14476f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14486f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"on") == 0)
14496f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14506f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"yes") == 0)
14516f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14526f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"1") == 0)
14536f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14546f2013165d72f7d8ef5f66bb9453126d88113809anthony  return(MagickFalse);
14556f2013165d72f7d8ef5f66bb9453126d88113809anthony}
14566f2013165d72f7d8ef5f66bb9453126d88113809anthony
14576f2013165d72f7d8ef5f66bb9453126d88113809anthony/*
14586f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14596f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14606f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14616f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14626f2013165d72f7d8ef5f66bb9453126d88113809anthony%   I s S t r i n g N o t F a l s e                                           %
14636f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14646f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14656f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
14666f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14676f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14686f2013165d72f7d8ef5f66bb9453126d88113809anthony%  IsStringNotFalse() returns MagickTrue, unless the string specifically
14696f2013165d72f7d8ef5f66bb9453126d88113809anthony%  has a value that makes this false.  that is if it has a value of
14706f2013165d72f7d8ef5f66bb9453126d88113809anthony%  "false", "off", "no" or "0".
14716f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14726f2013165d72f7d8ef5f66bb9453126d88113809anthony%  Typically this is used to look at strings (options or artifacts) which
14736f2013165d72f7d8ef5f66bb9453126d88113809anthony%  has a default value of "true", when it has not been defined.
14746f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14756f2013165d72f7d8ef5f66bb9453126d88113809anthony%  The format of the IsStringNotFalse method is:
14766f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14776f2013165d72f7d8ef5f66bb9453126d88113809anthony%      MagickBooleanType IsStringNotFalse(const char *value)
14786f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14796f2013165d72f7d8ef5f66bb9453126d88113809anthony%  A description of each parameter follows:
14806f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14816f2013165d72f7d8ef5f66bb9453126d88113809anthony%    o value: Specifies a pointer to a character array.
14826f2013165d72f7d8ef5f66bb9453126d88113809anthony%
14836f2013165d72f7d8ef5f66bb9453126d88113809anthony*/
14846f2013165d72f7d8ef5f66bb9453126d88113809anthonyMagickExport MagickBooleanType IsStringNotFalse(const char *value)
14856f2013165d72f7d8ef5f66bb9453126d88113809anthony{
14866f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (value == (const char *) NULL)
14876f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickTrue);
14886f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"false") == 0)
14896f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14906f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"off") == 0)
14916f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14926f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"no") == 0)
14936f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14946f2013165d72f7d8ef5f66bb9453126d88113809anthony  if (LocaleCompare(value,"0") == 0)
14956f2013165d72f7d8ef5f66bb9453126d88113809anthony    return(MagickFalse);
14966f2013165d72f7d8ef5f66bb9453126d88113809anthony  return(MagickTrue);
14976f2013165d72f7d8ef5f66bb9453126d88113809anthony}
14986f2013165d72f7d8ef5f66bb9453126d88113809anthony
14996f2013165d72f7d8ef5f66bb9453126d88113809anthony/*
15006f2013165d72f7d8ef5f66bb9453126d88113809anthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15016f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15026f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15036f2013165d72f7d8ef5f66bb9453126d88113809anthony%                                                                             %
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e C o m p a r e                                                 %
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleCompare() performs a case-insensitive comparison of two strings
15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  byte-by-byte, according to the ordering of the current locale encoding.
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleCompare returns an integer greater than, equal to, or less than 0,
15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  if the string pointed to by p is greater than, equal to, or less than the
15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string pointed to by q respectively.  The sign of a non-zero return value
15157a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%  is determined by the sign of the difference between the values of the first
15167a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%  pair of bytes that differ in the strings being compared.
15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleCompare method is:
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1520de58b416b4e5170fd208f357abd6f06c8b6672e8cristy%      int LocaleCompare(const char *p,const char *q)
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o p: A pointer to a character string.
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o q: A pointer to a character string to compare to p.
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1529de58b416b4e5170fd208f357abd6f06c8b6672e8cristyMagickExport int LocaleCompare(const char *p,const char *q)
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((p == (char *) NULL) && (q == (char *) NULL))
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(-1);
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q == (char *) NULL)
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(1);
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_STRCASECMP)
153827397b2a1c8338aae3601fcb4b4b2030107819abcristy  return(strcasecmp(p,q));
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1541de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    register int
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c,
1543a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      d;
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1545a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy    for ( ; ; )
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1547de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      c=(int) *((unsigned char *) p);
1548de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      d=(int) *((unsigned char *) q);
1549de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
1551a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      p++;
1552a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      q++;
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1554de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    return(AsciiMap[c]-(int) AsciiMap[d]);
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e L o w e r                                                     %
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleLower() transforms all of the characters in the supplied
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  null-terminated string, changing all uppercase letters to lowercase.
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleLower method is:
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void LocaleLower(char *string)
15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: A pointer to the string to convert to lower-case Locale.
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void LocaleLower(char *string)
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (char *) NULL);
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=string; *q != '\0'; q++)
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(char) tolower((int) *q);
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e N C o m p a r e                                               %
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1603067622389550e83c76724917c7e5c55b0887d153anthony%  LocaleNCompare() performs a case-insensitive comparison of two strings
1604067622389550e83c76724917c7e5c55b0887d153anthony%  byte-by-byte, according to the ordering of the current locale encoding.
1605067622389550e83c76724917c7e5c55b0887d153anthony%
1606067622389550e83c76724917c7e5c55b0887d153anthony%  LocaleNCompare returns an integer greater than, equal to, or less than 0,
1607067622389550e83c76724917c7e5c55b0887d153anthony%  if the string pointed to by p is greater than, equal to, or less than the
1608067622389550e83c76724917c7e5c55b0887d153anthony%  string pointed to by q respectively.  The sign of a non-zero return value
1609067622389550e83c76724917c7e5c55b0887d153anthony%  is determined by the sign of the difference between the values of the first
1610067622389550e83c76724917c7e5c55b0887d153anthony%  pair of bytes that differ in the strings being compared.
1611067622389550e83c76724917c7e5c55b0887d153anthony%
1612067622389550e83c76724917c7e5c55b0887d153anthony%  The LocaleNCompare method makes the same comparison as LocaleCompare but
1613067622389550e83c76724917c7e5c55b0887d153anthony%  looks at a maximum of n bytes.  Bytes following a null byte are not
1614067622389550e83c76724917c7e5c55b0887d153anthony%  compared.
16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleNCompare method is:
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1618de58b416b4e5170fd208f357abd6f06c8b6672e8cristy%      int LocaleNCompare(const char *p,const char *q,const size_t n)
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o p: A pointer to a character string.
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o q: A pointer to a character string to compare to p.
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16267a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%    o length: the number of characters to compare in strings p and q.
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1629de58b416b4e5170fd208f357abd6f06c8b6672e8cristyMagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
163178c2169582d169faeb7fc02a06b5188b6dbd970ecristy  if ((p == (char *) NULL) && (q == (char *) NULL))
163278c2169582d169faeb7fc02a06b5188b6dbd970ecristy    return(0);
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(-1);
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q == (char *) NULL)
16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(1);
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_STRNCASECMP)
163827397b2a1c8338aae3601fcb4b4b2030107819abcristy  return(strncasecmp(p,q,length));
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1641de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    register int
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c,
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      d;
16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1645b6af4a59b2597fbbedca1c2d388a48a917fa7e72cristy    register size_t
1646c4cded1326b13304ea1084f15c44653a8fa2744dcristy      i;
1647b6af4a59b2597fbbedca1c2d388a48a917fa7e72cristy
1648c4cded1326b13304ea1084f15c44653a8fa2744dcristy    for (i=length; i != 0; i--)
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1650de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      c=(int) *((unsigned char *) p);
1651de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      d=(int) *((unsigned char *) q);
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (AsciiMap[c] != AsciiMap[d])
1653de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        return(AsciiMap[c]-(int) AsciiMap[d]);
1654de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      if (c == 0)
1655de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        return(0);
16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1659de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    return(0);
16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e U p p e r                                                     %
16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleUpper() transforms all of the characters in the supplied
16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  null-terminated string, changing all lowercase letters to uppercase.
16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleUpper method is:
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void LocaleUpper(char *string)
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: A pointer to the string to convert to upper-case Locale.
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void LocaleUpper(char *string)
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (char *) NULL);
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=string; *q != '\0'; q++)
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(char) toupper((int) *q);
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   P r i n t S t r i n g I n f o                                             %
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PrintStringInfo() prints the string.
17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PrintStringInfo method is:
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void PrintStringInfo(FILE *file,const char *id,
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *string_info)
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file: the file, typically stdout.
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o id: the string id.
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void PrintStringInfo(FILE *file,const char *id,
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *string_info)
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(id != (const char *) NULL);
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i++)
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == string_info->length)
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputs((char *) string_info->datum,file);
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc('\n',file);
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to a HEX list.
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i+=0x14)
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1758b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1761b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for ( ; j <= 0x14; j++)
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc(' ',file);
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isprint((int) ((unsigned char) *p)) != 0)
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(*p,file);
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc('-',file);
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc('\n',file);
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e s e t S t r i n g I n f o                                             %
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ResetStringInfo() reset the string to all null bytes.
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ResetStringInfo method is:
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ResetStringInfo(StringInfo *string_info)
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ResetStringInfo(StringInfo *string_info)
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o                                                 %
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfo() copies the source string to the destination string.
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfo method is:
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfo(StringInfo *string_info,const StringInfo *source)
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfo(StringInfo *string_info,
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source->signature == MagickSignature);
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length == 0)
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
185054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
185154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    source->length));
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoDatum() copies bytes from the source string for the length of
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the destination string.
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoDatum method is:
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoDatum(StringInfo *string_info,
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const unsigned char *source)
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoDatum(StringInfo *string_info,
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char *source)
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
188754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(string_info->datum,source,string_info->length);
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o L e n g t h                                     %
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoLength() set the string length to the specified value.
19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoLength method is:
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoLength(StringInfo *string_info,const size_t length)
19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoLength(StringInfo *string_info,
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MaxTextExtent,sizeof(*string_info->datum));
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length+MaxTextExtent,sizeof(*string_info->datum));
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoPath() sets the path associated with the string.
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoPath method is:
19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoPath(StringInfo *string_info,const char *path)
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o path: the path.
19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(path != (const char *) NULL);
19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,path,MaxTextExtent);
19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S p l i t S t r i n g I n f o                                             %
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SplitStringInfo() splits a string into two and returns it.
19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SplitStringInfo method is:
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t offset)
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *split_info;
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (offset > string_info->length)
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  split_info=AcquireStringInfo(offset);
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfo(split_info,string_info);
20011bd862cf6e1ac2d4d43eac8fb35eeb96a24f1cbacristy  (void) memmove(string_info->datum,string_info->datum+offset,
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->length-offset+MaxTextExtent);
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,string_info->length-offset);
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(split_info);
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g I n f o T o S t r i n g                                       %
20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringInfoToString() converts a string info string to a C string.
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringInfoToString method is:
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringInfoToString(const StringInfo *string_info)
20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string.
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringInfoToString(const StringInfo *string_info)
20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
203937e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
2041208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  if (string == (char *) NULL)
2042208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    return((char *) NULL);
204354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
2044208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  string[length]='\0';
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string);
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2053b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%   S t r i n g I n f o T o H e x S t r i n g                                 %
2054b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
2055b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
2056b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
2057b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2058b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2059b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  StringInfoToHexString() converts a string info string to a C string.
2060b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2061b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The format of the StringInfoToHexString method is:
2062b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2063b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%      char *StringInfoToHexString(const StringInfo *string_info)
2064b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2065b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  A description of each parameter follows:
2066b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2067b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%    o string_info: the string.
2068b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2069b1d483a6a6a5678173db9d60bec52dd5a37826beanthony*/
2070b1d483a6a6a5678173db9d60bec52dd5a37826beanthonyMagickExport char *StringInfoToHexString(const StringInfo *string_info)
2071b1d483a6a6a5678173db9d60bec52dd5a37826beanthony{
2072b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  char
2073b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *string;
2074b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2075b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register const unsigned char
2076b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *p;
2077b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2078b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register ssize_t
2079b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    i;
2080b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2081b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  register unsigned char
2082b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q;
2083b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2084b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  size_t
2085b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    length;
2086b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2087b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  unsigned char
2088b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    hex_digits[16];
2089b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2090b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  length=string_info->length;
2091b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  if (~length < MaxTextExtent)
2092b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2093b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
2094b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  if (string == (char *) NULL)
2095b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2096b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[0]='0';
2097b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[1]='1';
2098b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[2]='2';
2099b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[3]='3';
2100b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[4]='4';
2101b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[5]='5';
2102b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[6]='6';
2103b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[7]='7';
2104b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[8]='8';
2105b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[9]='9';
2106b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[10]='a';
2107b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[11]='b';
2108b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[12]='c';
2109b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[13]='d';
2110b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[14]='e';
2111b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  hex_digits[15]='f';
2112b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  p=string_info->datum;
2113b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  q=(unsigned char *) string;
2114b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  for (i=0; i < (ssize_t) string_info->length; i++)
2115b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  {
2116b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q++=hex_digits[(*p >> 4) & 0x0f];
2117b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q++=hex_digits[*p & 0x0f];
2118b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    p++;
2119b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  }
2120b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *q='\0';
2121b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  return(string);
2122b1d483a6a6a5678173db9d60bec52dd5a37826beanthony}
2123b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2124b1d483a6a6a5678173db9d60bec52dd5a37826beanthony/*
2125b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2126b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
2127b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
2128b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%                                                                             %
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o A r g v                                                    %
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToArgv() converts a text string into command line arguments.
213631f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  The 'argv' array of arguments, is returned while the number of arguments
213731f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  is returned via the provided integer variable pointer.
213831f1bf7bb6ee2698a2afab42ee0329b11663636canthony%
213931f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  Simple 'word' tokenizer, which allows for each word to be optionally
214031f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  quoted.  However it will not allow use of partial quotes, or escape
214131f1bf7bb6ee2698a2afab42ee0329b11663636canthony%  characters.
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToArgv method is:
21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToArgv(const char *text,int *argc)
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argv:  Method StringToArgv returns the string list unless an error
21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      occurs, otherwise NULL.
21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argc:  This integer pointer returns the number of arguments in the
21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      list.
21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToArgv(const char *text,int *argc)
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **argv;
21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2167bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *argc=0;
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine the number of arguments.
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; )
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
2180a20c904a6f3e3a11939d5260485be72d5c849c63cristy    if (*p == '\0')
218174895d33fcb55c51dd9205984fadb102e20bae16cristy      break;
21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (*argc)++;
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '"')
21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '"') && (*p != '\0'); p++) ;
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\'')
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '\'') && (*p != '\0'); p++) ;
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (*argc)++;
21911b26e1f30a41ec15901231d6baba7345e2d3cd50cristy  argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (argv == (char **) NULL)
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to an ASCII list.
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[0]=AcquireString("magick");
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=text;
2199bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=1; i < (ssize_t) *argc; i++)
22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=p;
22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '"')
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q++; (*q != '"') && (*q != '\0'); q++) ;
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\'')
22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
221206b15f4383540e74d93dbe58488e193619b09df7cristy          p++;
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (q++; (*q != '\'') && (*q != '\0'); q++) ;
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(**argv));
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (argv[i] == (char *) NULL)
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i--; i >= 0; i--)
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          argv[i]=DestroyString(argv[i]);
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        argv=(char **) RelinquishMagickMemory(argv);
22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToConvertStringToARGV");
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
222854aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(argv[i],p,(size_t) (q-p));
2229208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    argv[i][q-p]='\0';
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=q;
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[i]=(char *) NULL;
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(argv);
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2243b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%   S t r i n g T o A r r a y O f D o u b l e s                               %
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2249b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  StringToArrayOfDoubles() converts a string of space or comma seperated
2250b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  numbers into array of floating point numbers (doubles). Any number that
2251b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  failes to parse properly will produce a syntax error. As will two commas
2252b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  without a  number between them.  However a final comma at the end will
2253b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  not be regarded as an error so as to simplify automatic list generation.
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2255b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  A NULL value is returned on syntax or memory errors.
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2257b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  Use RelinquishMagickMemory() to free returned array when finished.
2258b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2259b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The format of the StringToArrayOfDoubles method is:
2260b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2261b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%     double *StringToArrayOfDoubles(const char *string,
2262b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%          size_t *count, ExceptionInfo *exception)
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2266b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%    o string: the string containing the comma/space seperated values.
2267b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2268b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%    o count: returns number of arguments in returned array
2269b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2270b86be3d014b8b982fe182d839327924565bd8070cristy%    o exception: return 'memory failure' exceptions
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2273b1d483a6a6a5678173db9d60bec52dd5a37826beanthonyMagickExport double *StringToArrayOfDoubles(const char *string,
2274b1d483a6a6a5678173db9d60bec52dd5a37826beanthony     ssize_t *count, ExceptionInfo *exception)
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2276b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  const char
2277b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *p;
2278b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
2280b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *q;
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2282b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  double
2283b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    *array;
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2285bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2288b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  /* Determine count of values, and check syntax */
2289b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *count=0;
2290b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  p=string;
2291b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  i=0;
2292b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  while( *p != '\0' )
2293b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  {
2294b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    (void) StringToDouble(p, &q);       /* get value - ignores leading space */
2295b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    if (p == q) return((double *)NULL); /* no value found */
2296b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    p=q; i++;                           /* inc value count */
2297b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    while ( isspace((int)*p) ) p++;     /* skip spaces */
2298b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    if ( *p == ',' )           p++;     /* skip comma */
2299b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    while ( isspace((int)*p) ) p++;     /* and more spaces */
2300b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  }
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2302b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  /* Allocate floating point argument list */
2303b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  *count=i;
2304b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  array=(double *) AcquireQuantumMemory(i,sizeof(*array));
2305b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  if (array == (double *) NULL) {
2306b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2307b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    (void) ThrowMagickException(exception,GetMagickModule(),
2308b1d483a6a6a5678173db9d60bec52dd5a37826beanthony         ResourceLimitFatalError,"MemoryAllocationFailed"," ");
2309b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    return((double *)NULL);
2310b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  }
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2312b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  /* Fill in the floating point values */
2313b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  p=string;
2314b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  i=0;
2315b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  while( *p != '\0' && i < *count ) {
2316b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    array[i++]=StringToDouble(p,&q);
2317b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    p=q;
2318b1d483a6a6a5678173db9d60bec52dd5a37826beanthony    while ( isspace((int)*p) || *p == ',' ) p++;
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2320b1d483a6a6a5678173db9d60bec52dd5a37826beanthony
2321b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  return(array);
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2329b1d483a6a6a5678173db9d60bec52dd5a37826beanthony+   S t r i n g T o k e n                                                     %
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2335b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  StringToken() Looks for any one of given delimiters and splits the string
2336b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  into two separate strings by replacing the delimiter character found with a
2337b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  nul character.
2338b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2339b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  The given string pointer is changed to point to the string following the
2340b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  delimiter character found, or NULL.  A pointer to the start of the
2341b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  string is returned, representing the token before the delimiter.
2342b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%
2343b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  In may ways this is equivent to the strtok() C library function, but with
2344b1d483a6a6a5678173db9d60bec52dd5a37826beanthony%  multiple delimiter characters rather than a delimiter string.
23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToken method is:
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringToken(const char *delimiters,char **string)
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o delimiters: one or more delimiters.
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: return the first token in the string.  If none is found, return
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      NULL.
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringToken(const char *delimiters,char **string)
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *r;
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c,
23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    d;
23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(*string);
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
2376b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  q=p;
2377b1d483a6a6a5678173db9d60bec52dd5a37826beanthony  for ( ; ; )
23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c=(*p++);
23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    r=delimiters;
23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    do
23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      d=(*r++);
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (c == d)
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (c == '\0')
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(char *) NULL;
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p[-1]='\0';
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *string=p;
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(q);
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    } while (d != '\0');
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o L i s t                                                    %
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToList() converts a text string into a list by segmenting the text
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string at each carriage return discovered.  The list is converted to HEX
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  characters if any control characters are discovered within the text string.
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToList method is:
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToList(const char *text)
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToList(const char *text)
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **textlist;
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2429bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2432bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    lines;
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; p++)
24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*p == '\0')
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register const char
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to an ASCII list.
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      lines=1;
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p=text; *p != '\0'; p++)
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*p == '\n')
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          lines++;
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q=p; *q != '\0'; q++)
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((*q == '\r') || (*q == '\n'))
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
24642e25ee6694d278f85b4b3b9169fe0017aac8ab8ecristy          sizeof(**textlist));
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
246754aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy        (void) memcpy(textlist[i],p,(size_t) (q-p));
2468208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy        textlist[i][q-p]='\0';
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*q == '\r')
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=q+1;
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hex_string[MaxTextExtent];
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2482bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register ssize_t
24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j;
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to a HEX list.
24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2488bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      lines=(size_t) (strlen(text)/0x14)+1;
24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
24933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2494bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
24972e25ee6694d278f85b4b3b9169fe0017aac8ab8ecristy          sizeof(**textlist));
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2500b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2501f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy          (long) (0x14*i));
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=textlist[i]+strlen(textlist[i]);
2503bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2505b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(q,hex_string,MaxTextExtent);
25073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q+=2;
25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for ( ; j <= 0x14; j++)
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
25163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=' ';
2519bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (isprint((int) ((unsigned char) *p)) != 0)
25223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(*p);
25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++='-';
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q='\0';
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  textlist[i]=(char *) NULL;
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(textlist);
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g T o S t r i n g I n f o                                       %
25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2545bca58f3e54324602dbfe91102715646f23a2ad99cristy%  StringToStringInfo() converts a string to a StringInfo type.
25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToStringInfo method is:
25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *StringToStringInfo(const char *string)
25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string:  The string.
25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *StringToStringInfo(const char *string)
25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (const char *) NULL);
2563bca58f3e54324602dbfe91102715646f23a2ad99cristy  string_info=AcquireStringInfo(strlen(string));
25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoDatum(string_info,(const unsigned char *) string);
25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i p S t r i n g                                                     %
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
25773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StripString() strips any whitespace or quotes from the beginning and end of
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a string of characters.
25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StripString method is:
25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void StripString(char *message)
25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o message: Specifies an array of characters.
25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void StripString(char *message)
25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(message != (char *) NULL);
26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*message == '\0')
26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(message);
26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=message;
26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (isspace((int) ((unsigned char) *p)) != 0)
26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((*p == '\'') || (*p == '"'))
26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=message+length-1;
26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
26113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q--;
26123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q > p)
26133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*q == '\'') || (*q == '"'))
26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q--;
2615a63c1ba89fd24334d128308e74acbcaee52f4ba3cristy  (void) memmove(message,p,(size_t) (q-p+1));
26163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message[q-p+1]='\0';
26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=message; *p != '\0'; p++)
26183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\n')
26193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *p=' ';
26203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
26213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
26233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S u b s t i t u t e S t r i n g                                           %
26283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2633f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  SubstituteString() performs string substitution on a string, replacing the
2634f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  string with the substituted version. Buffer must be allocated from the heap.
2635bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  If the string is matched and status, MagickTrue is returned otherwise
2636bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  MagickFalse.
26373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SubstituteString method is:
26393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2640f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%      MagickBooleanType SubstituteString(char **string,const char *search,
26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *replace)
26423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
26443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2645f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%    o string: the string to perform replacements on;  replaced with new
26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      allocation if a replacement is made.
26473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2648bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o search: search for this string.
26493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2650bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o replace: replace any matches with this string.
26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2653f1b72c1946e0ea84ad884f358cbcc595ab162b10cristyMagickExport MagickBooleanType SubstituteString(char **string,
26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *search,const char *replace)
26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2656bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  MagickBooleanType
2657bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    status;
26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2659bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  register char
2660bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    *p;
26613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2663bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    extent,
2664bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    replace_extent,
2665bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    search_extent;
2666bc3392ad730a0886c1fabc9ae546b4de30a98526cristy
2667f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  ssize_t
2668f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    offset;
2669f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy
2670bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  status=MagickFalse;
2671bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  search_extent=0,
2672bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  replace_extent=0;
2673f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2675f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (search_extent == 0)
2676f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy      search_extent=strlen(search);
2677f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (strncmp(p,search,search_extent) != 0)
2678bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      continue;
26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2680bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      We found a match.
26813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2682f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    status=MagickTrue;
2683bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent == 0)
2684bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      replace_extent=strlen(replace);
2685bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent > search_extent)
26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2687bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        /*
2688bc3392ad730a0886c1fabc9ae546b4de30a98526cristy          Make room for the replacement string.
2689bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        */
2690de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        offset=(ssize_t) (p-(*string));
2691e08c3b83ee93ae67d66b8a8163b2165bc389b7d7cristy        extent=strlen(*string)+replace_extent-search_extent+1;
2692f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2693f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy          sizeof(*p));
2694f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        if (*string == (char *) NULL)
26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2696f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        p=(*string)+offset;
26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2699bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      Replace string.
27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2701bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (search_extent != replace_extent)
27020a9b3721bfaf93092820843450387092e7c30b0bcristy      (void) CopyMagickMemory(p+replace_extent,p+search_extent,
27030a9b3721bfaf93092820843450387092e7c30b0bcristy        strlen(p+search_extent)+1);
27040a9b3721bfaf93092820843450387092e7c30b0bcristy    (void) CopyMagickMemory(p,replace,replace_extent);
2705f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    p+=replace_extent-1;
27063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2707bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  return(status);
27083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2709