string.c revision 77e3fcc5964bb24d44e3a362a82a80bca4f9d43b
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
699bbf2c9e414ade263949978671025728413c1c9cristy%                  sssss   ttttt  rrrr   iiiii  n   n   gggg                  %
799bbf2c9e414ade263949978671025728413c1c9cristy%                  ss        t    r   r    i    nn  n  g                      %
899bbf2c9e414ade263949978671025728413c1c9cristy%                   sss      t    rrrr     i    n n n  g ggg                  %
999bbf2c9e414ade263949978671025728413c1c9cristy%                     ss     t    r r      i    n  nn  g   g                  %
1099bbf2c9e414ade263949978671025728413c1c9cristy%                  sssss     t    r  r   iiiii  n   n   gggg                  %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1399bbf2c9e414ade263949978671025728413c1c9cristy%                        MagickCore string methods                            %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1599bbf2c9e414ade263949978671025728413c1c9cristy%                             software design                                 %
1699bbf2c9e414ade263949978671025728413c1c9cristy%                               john cristy                                   %
1799bbf2c9e414ade263949978671025728413c1c9cristy%                               august 2003                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2099bbf2c9e414ade263949978671025728413c1c9cristy%  copyright 1999-2011 imagemagick studio llc, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2399bbf2c9e414ade263949978671025728413c1c9cristy%  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.   %
3199bbf2c9e414ade263949978671025728413c1c9cristy%  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"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/signature-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
5518c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy#include "MagickCore/utility-private.h"
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5899bbf2c9e414ade263949978671025728413c1c9cristy  static declarations.
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const unsigned char
6299bbf2c9e414ade263949978671025728413c1c9cristy  asciimap[] =
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    0xfc, 0xfd, 0xfe, 0xff,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g                                                 %
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireString() allocates memory for a string and copies the source string
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to that memory location (and returns it).
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireString method is:
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *AcquireString(const char *source)
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *AcquireString(const char *source)
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
12354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (~length < MaxTextExtent)
12454aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
12554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
12654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    sizeof(*destination));
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
13154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
13254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e S t r i n g I n f o                                         %
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireStringInfo() allocates the StringInfo structure.
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireStringInfo method is:
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *AcquireStringInfo(const size_t length)
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *AcquireStringInfo(const size_t length)
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info == (StringInfo *) NULL)
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->signature=MagickSignature;
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info->datum=(unsigned char *) NULL;
17237e0b38220ae42c2f0aba086d2252b7cbebcd434cristy      if (~string_info->length >= (MaxTextExtent-1))
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        string_info->datum=(unsigned char *) AcquireQuantumMemory(
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          string_info->length+MaxTextExtent,sizeof(*string_info->datum));
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (string_info->datum == (unsigned char *) NULL)
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1868723e4bcd840478cecfd29891e792edb499cd0e9cristy%   B l o b T o S t r i n g I n f o                                           %
1878723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1888723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1898723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
1908723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1918723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1928723e4bcd840478cecfd29891e792edb499cd0e9cristy%  BlobToStringInfo() returns the contents of a blob as a string.
1938723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1948723e4bcd840478cecfd29891e792edb499cd0e9cristy%  The format of the BlobToStringInfo method is:
1958723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1968723e4bcd840478cecfd29891e792edb499cd0e9cristy%      StringInfo *BlobToStringInfo(const void *blob,const size_t length)
1978723e4bcd840478cecfd29891e792edb499cd0e9cristy%
1988723e4bcd840478cecfd29891e792edb499cd0e9cristy%  A description of each parameter follows:
1998723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2008723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o blob: the blob.
2018723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2028723e4bcd840478cecfd29891e792edb499cd0e9cristy%    o length: the length of the blob.
2038723e4bcd840478cecfd29891e792edb499cd0e9cristy%
2048723e4bcd840478cecfd29891e792edb499cd0e9cristy*/
2058723e4bcd840478cecfd29891e792edb499cd0e9cristyMagickExport StringInfo *BlobToStringInfo(const void *blob,const size_t length)
2068723e4bcd840478cecfd29891e792edb499cd0e9cristy{
2078723e4bcd840478cecfd29891e792edb499cd0e9cristy  StringInfo
2088723e4bcd840478cecfd29891e792edb499cd0e9cristy    *string_info;
2098723e4bcd840478cecfd29891e792edb499cd0e9cristy
2108723e4bcd840478cecfd29891e792edb499cd0e9cristy  string_info=AcquireStringInfo(0);
211f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy  string_info->length=length;
212a10e07483be74957a2b75f4ae0776bff433947a4cristy  if (~string_info->length >= (MaxTextExtent-1))
213f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(
214f83163456f47ac94ba9b1e83d540f3f08d9e7f1ccristy      string_info->length+MaxTextExtent,sizeof(*string_info->datum));
2158723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (string_info->datum == (unsigned char *) NULL)
2168723e4bcd840478cecfd29891e792edb499cd0e9cristy    {
2178723e4bcd840478cecfd29891e792edb499cd0e9cristy      string_info=DestroyStringInfo(string_info);
2188723e4bcd840478cecfd29891e792edb499cd0e9cristy      return((StringInfo *) NULL);
2198723e4bcd840478cecfd29891e792edb499cd0e9cristy    }
2208723e4bcd840478cecfd29891e792edb499cd0e9cristy  if (blob != (const void *) NULL)
2218723e4bcd840478cecfd29891e792edb499cd0e9cristy    (void) memcpy(string_info->datum,blob,length);
2228723e4bcd840478cecfd29891e792edb499cd0e9cristy  return(string_info);
2238723e4bcd840478cecfd29891e792edb499cd0e9cristy}
2248723e4bcd840478cecfd29891e792edb499cd0e9cristy
2258723e4bcd840478cecfd29891e792edb499cd0e9cristy/*
2268723e4bcd840478cecfd29891e792edb499cd0e9cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2278723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2288723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2298723e4bcd840478cecfd29891e792edb499cd0e9cristy%                                                                             %
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g                                                     %
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloneString() allocates memory for the destination string and copies
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the source string to that memory location.
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneString method is:
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *CloneString(char **destination,const char *source)
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *CloneString(char **destination,const char *source)
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*destination != (char *) NULL)
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *destination=DestroyString(*destination);
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(*destination);
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(source);
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
272b936f7089f8bd56bf771c7cb6017a9af98a4ffd5cristy    sizeof(**destination));
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
27554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (length != 0)
276f7e6ab4637e31098c9cfd70546aed44870c27ee5cristy    (void) memcpy(*destination,source,length*sizeof(**destination));
277208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  (*destination)[length]='\0';
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(*destination);
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o n e S t r i n g I n f o                                             %
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloneStringInfo() clones a copy of the StringInfo structure.
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloneStringInfo method is:
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *CloneStringInfo(const StringInfo *string_info)
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *clone_info;
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  clone_info=AcquireStringInfo(string_info->length);
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
31354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(clone_info);
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o m p a r e S t r i n g I n f o                                         %
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CompareStringInfo() compares the two datums target and source.  It returns
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  an integer less than, equal to, or greater than zero if target is found,
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  respectively, to be less than, to match, or be greater than source.
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CompareStringInfo method is:
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int CompareStringInfo(const StringInfo *target,const StringInfo *source)
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target: the target string.
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline size_t MagickMin(const size_t x,const size_t y)
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < y)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport int CompareStringInfo(const StringInfo *target,
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(target != (StringInfo *) NULL);
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(target->signature == MagickSignature);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source->signature == MagickSignature);
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=memcmp(target->datum,source->datum,MagickMin(target->length,
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source->length));
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != 0)
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target->length == source->length)
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target->length < source->length ? -1 : 1);
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e M a g i c k S t r i n g                             %
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateMagickString() concatenates the source string to the destination
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.  The destination buffer is always null-terminated even if the
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string must be truncated.
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateMagickString method is:
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t ConcatenateMagickString(char *destination,const char *source,
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t ConcatenateMagickString(char *destination,
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source,const size_t length)
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char *) NULL);
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(length >= 1);
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length;
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((i-- != 0) && (*q != '\0'))
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=(size_t) (q-destination);
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=length-count;
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == 0)
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(count+strlen(p));
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (*p != '\0')
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (i != 1)
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i--;
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count+(p-source));
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g                                         %
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateString() appends a copy of string source, including the
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  terminating null character, to the end of string destination.
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateString method is:
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ConcatenateString(char **destination,
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *source)
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination:  A pointer to a character string.
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ConcatenateString(char **destination,
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *source)
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
47054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    destination_length,
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length,
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_length;
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(destination != (char **) NULL);
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source == (const char *) NULL)
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *destination=AcquireString(source);
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
48254aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination_length=strlen(*destination);
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source_length=strlen(source);
48454aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  length=destination_length;
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source_length)
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length+=source_length;
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
491cf1667cdd8f64c3d41e5cf404bce8799e3b5da9bcristy    sizeof(**destination));
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*destination == (char *) NULL)
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
49454aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  if (source_length != 0)
49554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy((*destination)+destination_length,source,source_length);
49654aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (*destination)[length]='\0';
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n c a t e n a t e S t r i n g I n f o                                 %
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConcatenateStringInfo() concatenates the source string to the destination
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConcatenateStringInfo method is:
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ConcatenateStringInfo(StringInfo *string_info,
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *source)
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ConcatenateStringInfo(StringInfo *string_info,
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const StringInfo *) NULL);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < source->length)
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,length+source->length);
54054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum+length,source->datum,source->length);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                         %
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConfigureFileToStringInfo() returns the contents of a configure file as a
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConfigureFileToStringInfo method is:
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *ConfigureFileToStringInfo(const char *filename)
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
56799bbf2c9e414ade263949978671025728413c1c9cristyMagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file;
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset;
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  void
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map;
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
58818c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy  file=open_utf8(filename,O_RDONLY | O_BINARY,0);
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == -1)
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
5917f31770d102a777269fa2452cc6a1ce304da4e12cristy  offset=(MagickOffsetType) lseek(file,0,SEEK_END);
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(size_t) offset;
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
59937e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string == (char *) NULL)
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file=close(file)-1;
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map=MapBlob(file,ReadMode,0,length);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map != (void *) NULL)
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
60954aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy      (void) memcpy(string,map,length);
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) UnmapBlob(map,length);
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register size_t
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ssize_t
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count;
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6207f31770d102a777269fa2452cc6a1ce304da4e12cristy      (void) lseek(file,0,SEEK_SET);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < length; i+=count)
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          SSIZE_MAX));
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (count <= 0)
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=0;
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (errno != EINTR)
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (i < length)
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          file=close(file)-1;
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          string=DestroyString(string);
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((StringInfo *) NULL);
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string[length]='\0';
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  file=close(file)-1;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->datum=(unsigned char *) string;
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o n s t a n t S t r i n g                                               %
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ConstantString() allocates memory for a string and copies the source string
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to that memory location (and returns it).  Use it for strings that you do
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  do not expect to change over its lifetime.
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ConstantString method is:
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *ConstantString(const char *source)
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *ConstantString(const char *source)
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=0;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length+=strlen(source);
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length >= 1UL)
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
69054aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(destination,source,length*sizeof(*destination));
69154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  destination[length]='\0';
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C o p y M a g i c k S t r i n g                                           %
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CopyMagickString() copies the source string to the destination string.  The
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  destination buffer is always null-terminated even if the string must be
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  truncated.  The return value is the minimum of the source string length
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  or the length parameter.
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CopyMagickString method is:
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t CopyMagickString(const char *destination,char *source,
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length)
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o destination: the destination string.
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the destination string.
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t CopyMagickString(char *destination,const char *source,
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n;
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
73777e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy  if (source == (const char *) NULL)
73877e3fcc5964bb24d44e3a362a82a80bca4f9d43bcristy    return(0);
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=source;
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=destination;
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (n=length; n > 4; n-=4)
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(*p++);
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '\0')
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((size_t) (p-source-1));
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (n != 0)
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (n--; n != 0; n--)
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q=(*p++);
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\0')
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((size_t) (p-source-1));
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length != 0)
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q='\0';
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((size_t) (p-source-1));
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g                                                 %
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyString() destroys memory associated with a string.
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyString method is:
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *DestroyString(char *string)
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: the string.
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *DestroyString(char *string)
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) RelinquishMagickMemory(string));
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g I n f o                                         %
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringInfo() destroys memory associated with the StringInfo structure.
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringInfo method is:
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *DestroyStringInfo(StringInfo *string_info)
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum != (unsigned char *) NULL)
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) RelinquishMagickMemory(
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info->datum);
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->signature=(~MagickSignature);
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=(StringInfo *) RelinquishMagickMemory(string_info);
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y S t r i n g L i s t                                         %
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyStringList() zeros memory associated with a string list.
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyStringList method is:
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **DestroyStringList(char **list)
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o list: the string list.
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **DestroyStringList(char **list)
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
859bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(list != (char **) NULL);
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; list[i] != (char *) NULL; i++)
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list[i]=DestroyString(list[i]);
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  list=(char **) RelinquishMagickMemory(list);
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(list);
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E s c a p e S t r i n g                                                   %
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EscapeString() allocates memory for a backslash-escaped version of a
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  source text string, copies the escaped version of the text to that
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory location while adding backslash characters, and returns the
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  escaped string.
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EscapeString method is:
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *EscapeString(const char *source,const char escape)
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o allocate_string:  Method EscapeString returns the escaped string.
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: A character string.
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o escape: the quoted string termination character to escape (e.g. '"').
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *EscapeString(const char *source,const char escape)
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination;
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (const char *) NULL);
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(source);
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=source; *p != '\0'; p++)
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == '\\') || (*p == escape))
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (~length < 1)
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length++;
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  destination=(char *) NULL;
92337e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(*destination));
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (destination == (char *) NULL)
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *destination='\0';
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (source != (char *) NULL)
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=destination;
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p=source; *p != '\0'; p++)
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((*p == '\\') || (*p == escape))
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++='\\';
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q='\0';
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(destination);
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g                                                   %
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToString() returns the contents of a file as a string.
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToString method is:
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *FileToString(const char *filename,const size_t extent,
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *FileToString(const char *filename,const size_t extent,
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((char *) FileToBlob(filename,extent,&length,exception));
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F i l e T o S t r i n g I n f o                                           %
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FileToStringInfo() returns the contents of a file as a string.
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FileToStringInfo method is:
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *FileToStringInfo(const char *filename,const size_t extent,
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the filename.
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o extent: Maximum length of the string.
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *FileToStringInfo(const char *filename,
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t extent,ExceptionInfo *exception)
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (const char *) NULL);
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info=AcquireStringInfo(0);
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      string_info=DestroyStringInfo(string_info);
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((StringInfo *) NULL);
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k S i z e                                            %
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickSize() converts a size to a human readable format, for example,
10412ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy%  14k, 234m, 2.7g, or 3.0t.  Scaling is done by repetitively dividing by
1042c15ce496469497409afa4e9b67f135726e720ac3cristy%  1000.
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickSize method is:
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1046bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      ssize_t FormatMagickSize(const MagickSizeType size,char *format)
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o size:  convert this size to a human readable format.
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1052b9080c9660565c4ab556254f276bfeca3d4edf02cristy%    o bi:  use power of two rather than power of ten.
1053b9080c9660565c4ab556254f276bfeca3d4edf02cristy%
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o format:  human readable format.
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
105799bbf2c9e414ade263949978671025728413c1c9cristyMagickExport ssize_t FormatMagickSize(const MagickSizeType size,
1058b9080c9660565c4ab556254f276bfeca3d4edf02cristy  const MagickBooleanType bi,char *format)
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1060b9080c9660565c4ab556254f276bfeca3d4edf02cristy  const char
1061b9080c9660565c4ab556254f276bfeca3d4edf02cristy    **units;
1062b9080c9660565c4ab556254f276bfeca3d4edf02cristy
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
1064b9080c9660565c4ab556254f276bfeca3d4edf02cristy    bytes,
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1067bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10719d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
10729d314ff2c17a77996c05413c2013880387e50f0ecristy    count;
10739d314ff2c17a77996c05413c2013880387e50f0ecristy
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
1075b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *bi_units[] =
1076b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
10772ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi", (char *) NULL
1078b9080c9660565c4ab556254f276bfeca3d4edf02cristy    },
1079b9080c9660565c4ab556254f276bfeca3d4edf02cristy    *traditional_units[] =
10809bf9da36285c017ede08022f833c722ac503aff1cristy    {
10812ce15c9745c0b3318a7d32e7c63fee9ab4913c6bcristy      "", "K", "M", "G", "T", "P", "E", "Z", "Y", (char *) NULL
10829bf9da36285c017ede08022f833c722ac503aff1cristy    };
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1084b9080c9660565c4ab556254f276bfeca3d4edf02cristy  bytes=1000.0;
1085b9080c9660565c4ab556254f276bfeca3d4edf02cristy  units=traditional_units;
1086b9080c9660565c4ab556254f276bfeca3d4edf02cristy  if (bi != MagickFalse)
1087b9080c9660565c4ab556254f276bfeca3d4edf02cristy    {
1088b9080c9660565c4ab556254f276bfeca3d4edf02cristy      bytes=1024.0;
1089b9080c9660565c4ab556254f276bfeca3d4edf02cristy      units=bi_units;
1090b9080c9660565c4ab556254f276bfeca3d4edf02cristy    }
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(_MSC_VER) && (_MSC_VER == 1200)
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(double) ((MagickOffsetType) size);
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(double) size;
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1096b9080c9660565c4ab556254f276bfeca3d4edf02cristy  for (i=0; (length >= bytes) && (units[i+1] != (const char *) NULL); i++)
1097b9080c9660565c4ab556254f276bfeca3d4edf02cristy    length/=bytes;
10989bf9da36285c017ede08022f833c722ac503aff1cristy  for (j=2; j < 12; j++)
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1100b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    count=FormatLocaleString(format,MaxTextExtent,"%.*g%sB",(int) (i+j),length,
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      units[i]);
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (strchr(format,'+') == (char *) NULL)
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  F o r m a t M a g i c k T i m e                                            %
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FormatMagickTime() returns the specified time in the Internet date/time
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  format and the length of the timestamp.
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FormatMagickTime method is:
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1124bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      ssize_t FormatMagickTime(const time_t time,const size_t length,
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        char *timestamp)
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o time:  the time since the Epoch (00:00:00 UTC, January 1, 1970),
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     measured in seconds.
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o length: the maximum length of the string.
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   o timestamp:  Return the Internet date/time here.
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1137bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyMagickExport ssize_t FormatMagickTime(const time_t time,const size_t length,
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char *timestamp)
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1140bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  struct tm
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time,
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time;
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timezone;
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(timestamp != (char *) NULL);
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&local_time,0,sizeof(local_time));
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&gm_time,0,sizeof(gm_time));
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_LOCALTIME_R)
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) localtime_r(&time,&local_time);
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1157bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=localtime(&time);
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&local_time,my_time,sizeof(local_time));
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_GMTIME_R)
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) gmtime_r(&time,&gm_time);
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1169bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    struct tm
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *my_time;
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    my_time=gmtime(&time);
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (my_time != (struct tm *) NULL)
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) memcpy(&gm_time,my_time,sizeof(gm_time));
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  timezone=(time_t) ((local_time.tm_min-gm_time.tm_min)/60+
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_hour-gm_time.tm_hour+24*((local_time.tm_year-
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gm_time.tm_year) != 0 ? (local_time.tm_year-gm_time.tm_year) :
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (local_time.tm_yday-gm_time.tm_yday)));
1181b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  count=FormatLocaleString(timestamp,length,
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,
1184f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy    local_time.tm_min,local_time.tm_sec,(long) timezone);
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(count);
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t E n v i r o n m e n t V a l u e                                     %
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetEnvironmentValue() returns the environment string that matches the
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified name.
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetEnvironmentValue method is:
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *GetEnvironmentValue(const char *name)
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the environment name.
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
121199bbf2c9e414ade263949978671025728413c1c9cristyMagickExport char *GetEnvironmentValue(const char *name)
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *environment;
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  environment=getenv(name);
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (environment == (const char *) NULL)
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(ConstantString(environment));
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o D a t u m                                       %
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoDatum() returns the datum associated with the string.
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoDatum method is:
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport unsigned char *GetStringInfoDatum(const StringInfo *string_info)
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->datum);
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o L e n g t h                                     %
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoLength() returns the string length.
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoLength method is:
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      size_t GetStringInfoLength(const StringInfo *string_info)
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport size_t GetStringInfoLength(const StringInfo *string_info)
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->length);
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t S t r i n g I n f o P a t h                                         %
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetStringInfoPath() returns the path associated with the string.
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetStringInfoPath method is:
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetStringInfoPath(const StringInfo *string_info)
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetStringInfoPath(const StringInfo *string_info)
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info->path);
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e C o m p a r e                                                 %
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleCompare() performs a case-insensitive comparison of two strings
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  byte-by-byte, according to the ordering of the current locale encoding.
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleCompare returns an integer greater than, equal to, or less than 0,
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  if the string pointed to by p is greater than, equal to, or less than the
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string pointed to by q respectively.  The sign of a non-zero return value
13257a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%  is determined by the sign of the difference between the values of the first
13267a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%  pair of bytes that differ in the strings being compared.
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleCompare method is:
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1330de58b416b4e5170fd208f357abd6f06c8b6672e8cristy%      int LocaleCompare(const char *p,const char *q)
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o p: A pointer to a character string.
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o q: A pointer to a character string to compare to p.
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1339de58b416b4e5170fd208f357abd6f06c8b6672e8cristyMagickExport int LocaleCompare(const char *p,const char *q)
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((p == (char *) NULL) && (q == (char *) NULL))
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(-1);
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q == (char *) NULL)
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(1);
13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_STRCASECMP)
134827397b2a1c8338aae3601fcb4b4b2030107819abcristy  return(strcasecmp(p,q));
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1351de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    register int
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c,
1353a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      d;
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1355a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy    for ( ; ; )
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1357de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      c=(int) *((unsigned char *) p);
1358de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      d=(int) *((unsigned char *) q);
1359de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      if ((c == 0) || (AsciiMap[c] != AsciiMap[d]))
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
1361a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      p++;
1362a72c2d141539fbcdfb4fe293a3c95f4202ce0371cristy      q++;
13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1364de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    return(AsciiMap[c]-(int) AsciiMap[d]);
13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e L o w e r                                                     %
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleLower() transforms all of the characters in the supplied
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  null-terminated string, changing all uppercase letters to lowercase.
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleLower method is:
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void LocaleLower(char *string)
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: A pointer to the string to convert to lower-case Locale.
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void LocaleLower(char *string)
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (char *) NULL);
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=string; *q != '\0'; q++)
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(char) tolower((int) *q);
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e N C o m p a r e                                               %
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleNCompare() performs a case-insensitive comparison of two
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  strings byte-by-byte, according to the ordering of the current locale
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  encoding. LocaleNCompare returns an integer greater than, equal to, or
14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  less than 0, if the string pointed to by p is greater than, equal to, or
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  less than the string pointed to by q respectively.  The sign of a non-zero
14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  return value is determined by the sign of the difference between the
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  values of the first pair of bytes that differ in the strings being
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  compared.  The LocaleNCompare method makes the same comparison as
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleCompare but looks at a maximum of n bytes.  Bytes following a
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  null byte are not compared.
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleNCompare method is:
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1426de58b416b4e5170fd208f357abd6f06c8b6672e8cristy%      int LocaleNCompare(const char *p,const char *q,const size_t n)
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o p: A pointer to a character string.
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o q: A pointer to a character string to compare to p.
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14347a40ba8d8dae1086103297305d7cd8825ea59fa9cristy%    o length: the number of characters to compare in strings p and q.
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1437de58b416b4e5170fd208f357abd6f06c8b6672e8cristyMagickExport int LocaleNCompare(const char *p,const char *q,const size_t length)
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
143978c2169582d169faeb7fc02a06b5188b6dbd970ecristy  if ((p == (char *) NULL) && (q == (char *) NULL))
144078c2169582d169faeb7fc02a06b5188b6dbd970ecristy    return(0);
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(-1);
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q == (char *) NULL)
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(1);
14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_STRNCASECMP)
144627397b2a1c8338aae3601fcb4b4b2030107819abcristy  return(strncasecmp(p,q,length));
14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1449de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    register int
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c,
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      d;
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1453b6af4a59b2597fbbedca1c2d388a48a917fa7e72cristy    register size_t
1454c4cded1326b13304ea1084f15c44653a8fa2744dcristy      i;
1455b6af4a59b2597fbbedca1c2d388a48a917fa7e72cristy
1456c4cded1326b13304ea1084f15c44653a8fa2744dcristy    for (i=length; i != 0; i--)
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1458de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      c=(int) *((unsigned char *) p);
1459de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      d=(int) *((unsigned char *) q);
14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (AsciiMap[c] != AsciiMap[d])
1461de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        return(AsciiMap[c]-(int) AsciiMap[d]);
1462de58b416b4e5170fd208f357abd6f06c8b6672e8cristy      if (c == 0)
1463de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        return(0);
14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1467de58b416b4e5170fd208f357abd6f06c8b6672e8cristy    return(0);
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o c a l e U p p e r                                                     %
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LocaleUpper() transforms all of the characters in the supplied
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  null-terminated string, changing all lowercase letters to uppercase.
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LocaleUpper method is:
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void LocaleUpper(char *string)
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: A pointer to the string to convert to upper-case Locale.
14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void LocaleUpper(char *string)
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (char *) NULL);
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=string; *q != '\0'; q++)
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q=(char) toupper((int) *q);
15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   P r i n t S t r i n g I n f o                                             %
15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PrintStringInfo() prints the string.
15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PrintStringInfo method is:
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void PrintStringInfo(FILE *file,const char *id,
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *string_info)
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file: the file, typically stdout.
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o id: the string id.
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void PrintStringInfo(FILE *file,const char *id,
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *string_info)
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register size_t
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(id != (const char *) NULL);
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id);
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i++)
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (i == string_info->length)
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputs((char *) string_info->datum,file);
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc('\n',file);
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to a HEX list.
15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) string_info->datum;
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < string_info->length; i+=0x14)
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1566b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"0x%08lx: ",(unsigned long) (0x14*i));
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1569b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"%02lx",(unsigned long) (*(p+j)) & 0xff);
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for ( ; j <= 0x14; j++)
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fputc(' ',file);
15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((j % 0x04) == 0)
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(' ',file);
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc(' ',file);
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=1; j <= MagickMin(string_info->length-i,0x14); j++)
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isprint((int) ((unsigned char) *p)) != 0)
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc(*p,file);
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fputc('-',file);
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fputc('\n',file);
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e s e t S t r i n g I n f o                                             %
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ResetStringInfo() reset the string to all null bytes.
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ResetStringInfo method is:
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void ResetStringInfo(StringInfo *string_info)
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void ResetStringInfo(StringInfo *string_info)
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o                                                 %
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfo() copies the source string to the destination string.
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfo method is:
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfo(StringInfo *string_info,const StringInfo *source)
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfo(StringInfo *string_info,
16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *source)
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source != (StringInfo *) NULL);
16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(source->signature == MagickSignature);
16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length == 0)
16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(string_info->datum,0,string_info->length);
165854aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
165954aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    source->length));
16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoDatum() copies bytes from the source string for the length of
16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the destination string.
16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoDatum method is:
16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoDatum(StringInfo *string_info,
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const unsigned char *source)
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o source: the source string.
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoDatum(StringInfo *string_info,
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char *source)
16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->length != 0)
169554aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(string_info->datum,source,string_info->length);
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o L e n g t h                                     %
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoLength() set the string length to the specified value.
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoLength method is:
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoLength(StringInfo *string_info,const size_t length)
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the string length.
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoLength(StringInfo *string_info,
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length)
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string_info->length=length;
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) AcquireQuantumMemory(length+
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MaxTextExtent,sizeof(*string_info->datum));
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->datum=(unsigned char *) ResizeQuantumMemory(string_info->datum,
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length+MaxTextExtent,sizeof(*string_info->datum));
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string_info->datum == (unsigned char *) NULL)
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t S t r i n g I n f o D a t u m                                       %
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetStringInfoPath() sets the path associated with the string.
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetStringInfoPath method is:
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void SetStringInfoPath(StringInfo *string_info,const char *path)
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o path: the path.
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetStringInfoPath(StringInfo *string_info,const char *path)
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(path != (const char *) NULL);
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(string_info->path,path,MaxTextExtent);
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S p l i t S t r i n g I n f o                                             %
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SplitStringInfo() splits a string into two and returns it.
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SplitStringInfo method is:
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *SplitStringInfo(StringInfo *string_info,const size_t offset)
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string info.
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t offset)
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *split_info;
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info != (StringInfo *) NULL);
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string_info->signature == MagickSignature);
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (offset > string_info->length)
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((StringInfo *) NULL);
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  split_info=AcquireStringInfo(offset);
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfo(split_info,string_info);
18091bd862cf6e1ac2d4d43eac8fb35eeb96a24f1cbacristy  (void) memmove(string_info->datum,string_info->datum+offset,
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string_info->length-offset+MaxTextExtent);
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoLength(string_info,string_info->length-offset);
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(split_info);
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g I n f o T o S t r i n g                                       %
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringInfoToString() converts a string info string to a C string.
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringInfoToString method is:
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringInfoToString(const StringInfo *string_info)
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string.
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringInfoToString(const StringInfo *string_info)
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) NULL;
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
184737e0b38220ae42c2f0aba086d2252b7cbebcd434cristy  if (~length >= (MaxTextExtent-1))
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
1849208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  if (string == (char *) NULL)
1850208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    return((char *) NULL);
185154aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy  (void) memcpy(string,(char *) string_info->datum,length*sizeof(*string));
1852208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy  string[length]='\0';
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string);
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o A r g v                                                    %
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToArgv() converts a text string into command line arguments.
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToArgv method is:
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToArgv(const char *text,int *argc)
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argv:  Method StringToArgv returns the string list unless an error
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      occurs, otherwise NULL.
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argc:  This integer pointer returns the number of arguments in the
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      list.
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToArgv(const char *text,int *argc)
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **argv;
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1893bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *argc=0;
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine the number of arguments.
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; )
19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
1906a20c904a6f3e3a11939d5260485be72d5c849c63cristy    if (*p == '\0')
190774895d33fcb55c51dd9205984fadb102e20bae16cristy      break;
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (*argc)++;
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '"')
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '"') && (*p != '\0'); p++) ;
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\'')
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p++; (*p != '\'') && (*p != '\0'); p++) ;
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (*argc)++;
19171b26e1f30a41ec15901231d6baba7345e2d3cd50cristy  argv=(char **) AcquireQuantumMemory((size_t) (*argc+1UL),sizeof(*argv));
19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (argv == (char **) NULL)
19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV");
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to an ASCII list.
19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[0]=AcquireString("magick");
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=text;
1925bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=1; i < (ssize_t) *argc; i++)
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while (isspace((int) ((unsigned char) *p)) != 0)
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=p;
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*q == '"')
19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q++; (*q != '"') && (*q != '\0'); q++) ;
19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*q == '\'')
19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
193806b15f4383540e74d93dbe58488e193619b09df7cristy          p++;
19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (q++; (*q != '\'') && (*q != '\0'); q++) ;
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((isspace((int) ((unsigned char) *q)) == 0) && (*q != '\0'))
19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    argv[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(**argv));
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (argv[i] == (char *) NULL)
19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i--; i >= 0; i--)
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          argv[i]=DestroyString(argv[i]);
19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        argv=(char **) RelinquishMagickMemory(argv);
19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,
19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToConvertStringToARGV");
19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
195454aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy    (void) memcpy(argv[i],p,(size_t) (q-p));
1955208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy    argv[i][q-p]='\0';
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=q;
19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '\0'))
19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  argv[i]=(char *) NULL;
19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(argv);
19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g I n f o T o H e x S t r i n g                                 %
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringInfoToHexString() converts a string info string to a C string.
19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringInfoToHexString method is:
19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringInfoToHexString(const StringInfo *string_info)
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string_info: the string.
19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringInfoToHexString(const StringInfo *string_info)
19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string;
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const unsigned char
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1994bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    hex_digits[16];
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=string_info->length;
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (~length < MaxTextExtent)
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  string=(char *) AcquireQuantumMemory(length+MaxTextExtent,2*sizeof(*string));
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (string == (char *) NULL)
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[0]='0';
20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[1]='1';
20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[2]='2';
20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[3]='3';
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[4]='4';
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[5]='5';
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[6]='6';
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[7]='7';
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[8]='8';
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[9]='9';
20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[10]='a';
20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[11]='b';
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[12]='c';
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[13]='d';
20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[14]='e';
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  hex_digits[15]='f';
20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=string_info->datum;
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) string;
2030bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) string_info->length; i++)
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=hex_digits[(*p >> 4) & 0x0f];
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=hex_digits[*p & 0x0f];
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string);
20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g T o k e n                                                     %
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToken() extracts a token a from the string.
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToken method is:
20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *StringToken(const char *delimiters,char **string)
20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o delimiters: one or more delimiters.
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string: return the first token in the string.  If none is found, return
20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      NULL.
20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *StringToken(const char *delimiters,char **string)
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *r;
20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c,
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    d;
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(*string);
20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (char *) NULL)
20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) NULL);
20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=p; ; )
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c=(*p++);
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    r=delimiters;
20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    do
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      d=(*r++);
20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (c == d)
20913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
20923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (c == '\0')
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(char *) NULL;
20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p[-1]='\0';
20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *string=p;
20973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(q);
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    } while (d != '\0');
21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  S t r i n g T o L i s t                                                    %
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StringToList() converts a text string into a list by segmenting the text
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string at each carriage return discovered.  The list is converted to HEX
21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  characters if any control characters are discovered within the text string.
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToList method is:
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char **StringToList(const char *text)
21213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text:  Specifies the string to segment into a list.
21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **StringToList(const char *text)
21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **textlist;
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2135bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2138bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    lines;
21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=text; *p != '\0'; p++)
21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((int) ((unsigned char) *p) < 32) &&
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (isspace((int) ((unsigned char) *p)) == 0))
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*p == '\0')
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register const char
21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to an ASCII list.
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      lines=1;
21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (p=text; *p != '\0'; p++)
21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*p == '\n')
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          lines++;
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2164bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q=p; *q != '\0'; q++)
21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((*q == '\r') || (*q == '\n'))
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+MaxTextExtent,
21702e25ee6694d278f85b4b3b9169fe0017aac8ab8ecristy          sizeof(**textlist));
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
217354aad5e0c2d9aa1deb353db842fc6ca6194f197ecristy        (void) memcpy(textlist[i],p,(size_t) (q-p));
2174208cacfadcc4d4773ae390e41289fe8a8a9dabcecristy        textlist[i][q-p]='\0';
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*q == '\r')
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q++;
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=q+1;
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hex_string[MaxTextExtent];
21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2188bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register ssize_t
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j;
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert string to a HEX list.
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2194bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      lines=(size_t) (strlen(text)/0x14)+1;
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) AcquireQuantumMemory((size_t) lines+1UL,
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*textlist));
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (textlist == (char **) NULL)
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=text;
2200bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) lines; i++)
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
22032e25ee6694d278f85b4b3b9169fe0017aac8ab8ecristy          sizeof(**textlist));
22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (textlist[i] == (char *) NULL)
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToConvertText");
2206b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleString(textlist[i],MaxTextExtent,"0x%08lx: ",
2207f1d91246f9ab47d524abc076c6ead91e5cc27d03cristy          (long) (0x14*i));
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=textlist[i]+strlen(textlist[i]);
2209bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2211b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleString(hex_string,MaxTextExtent,"%02x",*(p+j));
22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(q,hex_string,MaxTextExtent);
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q+=2;
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for ( ; j <= 0x14; j++)
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=' ';
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((j % 0x04) == 0)
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=' ';
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=' ';
2225bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=1; j <= (ssize_t) MagickMin(strlen(p),0x14); j++)
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (isprint((int) ((unsigned char) *p)) != 0)
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(*p);
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++='-';
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q='\0';
22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  textlist[i]=(char *) NULL;
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(textlist);
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i n g T o S t r i n g I n f o                                       %
22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2251bca58f3e54324602dbfe91102715646f23a2ad99cristy%  StringToStringInfo() converts a string to a StringInfo type.
22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StringToStringInfo method is:
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      StringInfo *StringToStringInfo(const char *string)
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o string:  The string.
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport StringInfo *StringToStringInfo(const char *string)
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *string_info;
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(string != (const char *) NULL);
2269bca58f3e54324602dbfe91102715646f23a2ad99cristy  string_info=AcquireStringInfo(strlen(string));
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetStringInfoDatum(string_info,(const unsigned char *) string);
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(string_info);
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S t r i p S t r i n g                                                     %
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  StripString() strips any whitespace or quotes from the beginning and end of
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a string of characters.
22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the StripString method is:
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void StripString(char *message)
22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o message: Specifies an array of characters.
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void StripString(char *message)
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(message != (char *) NULL);
23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*message == '\0')
23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=strlen(message);
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=message;
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (isspace((int) ((unsigned char) *p)) != 0)
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((*p == '\'') || (*p == '"'))
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=message+length-1;
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q--;
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (q > p)
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*q == '\'') || (*q == '"'))
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q--;
2321a63c1ba89fd24334d128308e74acbcaee52f4ba3cristy  (void) memmove(message,p,(size_t) (q-p+1));
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message[q-p+1]='\0';
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=message; *p != '\0'; p++)
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p == '\n')
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *p=' ';
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S u b s t i t u t e S t r i n g                                           %
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2339f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  SubstituteString() performs string substitution on a string, replacing the
2340f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%  string with the substituted version. Buffer must be allocated from the heap.
2341bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  If the string is matched and status, MagickTrue is returned otherwise
2342bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%  MagickFalse.
23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SubstituteString method is:
23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2346f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%      MagickBooleanType SubstituteString(char **string,const char *search,
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *replace)
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2351f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy%    o string: the string to perform replacements on;  replaced with new
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      allocation if a replacement is made.
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2354bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o search: search for this string.
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2356bc3392ad730a0886c1fabc9ae546b4de30a98526cristy%    o replace: replace any matches with this string.
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2359f1b72c1946e0ea84ad884f358cbcc595ab162b10cristyMagickExport MagickBooleanType SubstituteString(char **string,
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *search,const char *replace)
23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2362bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  MagickBooleanType
2363bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    status;
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2365bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  register char
2366bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    *p;
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
2369bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    extent,
2370bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    replace_extent,
2371bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    search_extent;
2372bc3392ad730a0886c1fabc9ae546b4de30a98526cristy
2373f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  ssize_t
2374f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    offset;
2375f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy
2376bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  status=MagickFalse;
2377bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  search_extent=0,
2378bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  replace_extent=0;
2379f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy  for (p=strchr(*string,*search); p != (char *) NULL; p=strchr(p+1,*search))
23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2381f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (search_extent == 0)
2382f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy      search_extent=strlen(search);
2383f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    if (strncmp(p,search,search_extent) != 0)
2384bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      continue;
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2386bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      We found a match.
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2388f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    status=MagickTrue;
2389bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent == 0)
2390bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      replace_extent=strlen(replace);
2391bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (replace_extent > search_extent)
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2393bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        /*
2394bc3392ad730a0886c1fabc9ae546b4de30a98526cristy          Make room for the replacement string.
2395bc3392ad730a0886c1fabc9ae546b4de30a98526cristy        */
2396de58b416b4e5170fd208f357abd6f06c8b6672e8cristy        offset=(ssize_t) (p-(*string));
2397e08c3b83ee93ae67d66b8a8163b2165bc389b7d7cristy        extent=strlen(*string)+replace_extent-search_extent+1;
2398f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        *string=(char *) ResizeQuantumMemory(*string,extent+MaxTextExtent,
2399f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy          sizeof(*p));
2400f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        if (*string == (char *) NULL)
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
2402f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy        p=(*string)+offset;
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
2405bc3392ad730a0886c1fabc9ae546b4de30a98526cristy      Replace string.
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
2407bc3392ad730a0886c1fabc9ae546b4de30a98526cristy    if (search_extent != replace_extent)
24080a9b3721bfaf93092820843450387092e7c30b0bcristy      (void) CopyMagickMemory(p+replace_extent,p+search_extent,
24090a9b3721bfaf93092820843450387092e7c30b0bcristy        strlen(p+search_extent)+1);
24100a9b3721bfaf93092820843450387092e7c30b0bcristy    (void) CopyMagickMemory(p,replace,replace_extent);
2411f1b72c1946e0ea84ad884f358cbcc595ab162b10cristy    p+=replace_extent-1;
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2413bc3392ad730a0886c1fabc9ae546b4de30a98526cristy  return(status);
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2415