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