magic.c revision 7ce65e7125a4e1df1a274ce373c537a9df9c16cd
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5b18607552dde4e1f317f73f6e0f1b4043a76728acristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                    M   M   AAA    GGGG  IIIII   CCCC                        %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                    MM MM  A   A  G        I    C                            %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                    M M M  AAAAA  G GGG    I    C                            %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                    M   M  A   A  G   G    I    C                            %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                    M   M  A   A   GGGG  IIIII   CCCC                        %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                      MagickCore Image Magic Methods                         %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Bob Friesenhahn                                %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 2000                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 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/client.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/configure.h"
469639ba36e05b3e2fe85c8d9097b9ad8aa2c0e5eecristy#include "MagickCore/configure-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/hashmap.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magic.h"
515ff4eaf57b3cd47d0371f204f865cbba614674a0cristy#include "MagickCore/magic-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/token.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
58d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xml-tree.h"
603291f51a77fdd817efb58d652c78c407cbfdf7d1cristy#include "MagickCore/xml-tree-private.h"
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MagicFilename  "magic.xml"
664f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy#define MagicPattern(magic)  (const unsigned char *) (magic), sizeof(magic)-1
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6954a531d335ea060a99bead94dcdf45f18496fa83cristy  Typedef declarations.
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
711ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristytypedef struct _MagicMapInfo
721ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy{
731ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  const char
741ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    *name;
751ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
76e3e77a19c40caafb77339e5a126c532bf2984c01cristy  const MagickOffsetType
77e3e77a19c40caafb77339e5a126c532bf2984c01cristy    offset;
78e3e77a19c40caafb77339e5a126c532bf2984c01cristy
79bcdce3d1a5a9b3b62b403a651a15313b8ddb8654cristy  const unsigned char
801ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    *magic;
811ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
82e3e77a19c40caafb77339e5a126c532bf2984c01cristy  const size_t
831ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    length;
841ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy} MagicMapInfo;
8554a531d335ea060a99bead94dcdf45f18496fa83cristy
8654a531d335ea060a99bead94dcdf45f18496fa83cristy/*
8754a531d335ea060a99bead94dcdf45f18496fa83cristy  Static declarations.
8854a531d335ea060a99bead94dcdf45f18496fa83cristy*/
891ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristystatic const MagicMapInfo
901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  MagicMap[] =
911ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  {
924f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "8BIMWTEXT", 0, MagicPattern("8\000B\000I\000M\000#") },
934f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "8BIMTEXT", 0, MagicPattern("8BIM#") },
944f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "8BIM", 0, MagicPattern("8BIM") },
954f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("BA") },
964f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("BM") },
974f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("CI") },
984f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("CP") },
994f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("IC") },
1004f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PICT", 0, MagicPattern("PICT") },
1014f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "BMP", 0, MagicPattern("PI") },
1024f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CALS", 21, MagicPattern("version: MIL-STD-1840") },
1034f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CALS", 0, MagicPattern("srcdocid:") },
1044f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CALS", 9, MagicPattern("srcdocid:") },
1054f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CALS", 8, MagicPattern("rorient:") },
1064f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CGM", 0, MagicPattern("BEGMF") },
1074f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CIN", 0, MagicPattern("\200\052\137\327") },
1084f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "CRW", 0, MagicPattern("II\x1a\x00\x00\x00HEAPCCDR") },
1094f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DCM", 128, MagicPattern("DICM") },
1104f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DCX", 0, MagicPattern("\261\150\336\72") },
1114f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DIB", 0, MagicPattern("\050\000") },
1124f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DDS", 0, MagicPattern("DDS ") },
1134f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DJVU", 0, MagicPattern("AT&TFORM") },
1144f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DOT", 0, MagicPattern("digraph") },
1154f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DPX", 0, MagicPattern("SDPX") },
1164f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "DPX", 0, MagicPattern("XPDS") },
1174f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "EMF", 40, MagicPattern("\040\105\115\106\000\000\001\000") },
1184f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "EPT", 0, MagicPattern("\305\320\323\306") },
1194f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "EXR", 0, MagicPattern("\166\057\061\001") },
1204f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "FAX", 0, MagicPattern("DFAX") },
1214f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "FIG", 0, MagicPattern("#FIG") },
1224f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "FITS", 0, MagicPattern("IT0") },
1234f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "FITS", 0, MagicPattern("SIMPLE") },
1244f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "GIF", 0, MagicPattern("GIF8") },
1254f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "GPLT", 0, MagicPattern("#!/usr/local/bin/gnuplot") },
1264f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDF", 1, MagicPattern("HDF") },
1274f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDR", 0, MagicPattern("#?RADIANCE") },
1284f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDR", 0, MagicPattern("#?RGBE") },
1294f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HPGL", 0, MagicPattern("IN;") },
1304f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HTML", 1, MagicPattern("HTML") },
1314f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HTML", 1, MagicPattern("html") },
1324f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "ILBM", 8, MagicPattern("ILBM") },
1334f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTCWTEXT", 0, MagicPattern("\062\000#\000\060\000=\000\042\000&\000#\000\060\000;\000&\000#\000\062\000;\000\042\000") },
1344f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTCTEXT", 0, MagicPattern("2#0=\042�\042") },
1354f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTC", 0, MagicPattern("\034\002") },
1364f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JNG", 0, MagicPattern("\213JNG\r\n\032\n") },
1374f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JPEG", 0, MagicPattern("\377\330\377") },
1384f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "J2K", 0, MagicPattern("\xff\x4f\xff\x51") },
1394f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JPC", 0, MagicPattern("\x0d\x0a\x87\x0a") },
140dbdf015f56500da4e142a35141dcf9e77137eccfdirk    { "JP2", 0, MagicPattern("\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a") },
1414f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MAT", 0, MagicPattern("MATLAB 5.0 MAT-file,") },
1424f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MIFF", 0, MagicPattern("Id=ImageMagick") },
1434f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MIFF", 0, MagicPattern("id=ImageMagick") },
1444f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MNG", 0, MagicPattern("\212MNG\r\n\032\n") },
1454f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MPC", 0, MagicPattern("id=MagickCache") },
1464f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MPEG", 0, MagicPattern("\000\000\001\263") },
1474f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MRW", 0, MagicPattern("\x00MRM") },
1484f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MVG", 0, MagicPattern("push graphic-context") },
1494f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "ORF", 0, MagicPattern("IIRO\x08\x00\x00\x00") },
1504f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PCD", 2048, MagicPattern("PCD_") },
1514f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PCL", 0, MagicPattern("\033E\033") },
1524f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PCX", 0, MagicPattern("\012\002") },
1534f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PCX", 0, MagicPattern("\012\005") },
1544f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PDB", 60, MagicPattern("vIMGView") },
1554f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PDF", 0, MagicPattern("%PDF-") },
1564f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PES", 0, MagicPattern("#PES") },
1574f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PFA", 0, MagicPattern("%!PS-AdobeFont-1.0") },
1584f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PFB", 6, MagicPattern("%!PS-AdobeFont-1.0") },
1594f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PGX", 0, MagicPattern("\050\107\020\115\046") },
1604f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PICT", 522, MagicPattern("\000\021\002\377\014\000") },
1614f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PNG", 0, MagicPattern("\211PNG\r\n\032\n") },
1624f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PBM", 0, MagicPattern("P1") },
1634f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PGM", 0, MagicPattern("P2") },
1644f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PPM", 0, MagicPattern("P3") },
1654f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PBM", 0, MagicPattern("P4") },
1664f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PGM", 0, MagicPattern("P5") },
1674f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PPM", 0, MagicPattern("P6") },
1684f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PAM", 0, MagicPattern("P7") },
1694f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PFM", 0, MagicPattern("PF") },
1704f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PFM", 0, MagicPattern("Pf") },
1714f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PS", 0, MagicPattern("%!") },
1724f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PS", 0, MagicPattern("\004%!") },
1734f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PS", 0, MagicPattern("\305\320\323\306") },
1744f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PSB", 0, MagicPattern("8BPB") },
1754f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PSD", 0, MagicPattern("8BPS") },
1764f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "PWP", 0, MagicPattern("SFW95") },
1774f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "RAF", 0, MagicPattern("FUJIFILMCCD-RAW ") },
1784f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "RLE", 0, MagicPattern("\122\314") },
1794f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SCT", 0, MagicPattern("CT") },
1804f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SFW", 0, MagicPattern("SFW94") },
1814f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SGI", 0, MagicPattern("\001\332") },
1824f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SUN", 0, MagicPattern("\131\246\152\225") },
1834f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SVG", 1, MagicPattern("?XML") },
1844f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "SVG", 1, MagicPattern("?xml") },
1854f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TIFF", 0, MagicPattern("\115\115\000\052") },
1864f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TIFF", 0, MagicPattern("\111\111\052\000") },
1874f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TIFF64", 0, MagicPattern("\115\115\000\053\000\010\000\000") },
1884f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TIFF64", 0, MagicPattern("\111\111\053\000\010\000\000\000") },
1894f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TTF", 0, MagicPattern("\000\001\000\000\000") },
1904f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "TXT", 0, MagicPattern("# ImageMagick pixel enumeration:") },
1914f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "VICAR", 0, MagicPattern("LBLSIZE") },
1924f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "VICAR", 0, MagicPattern("NJPL1I") },
1934f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "VIFF", 0, MagicPattern("\253\001") },
1944f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "WEBP", 8, MagicPattern("WEBP") },
1954f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "WMF", 0, MagicPattern("\327\315\306\232") },
1964f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "WMF", 0, MagicPattern("\001\000\011\000") },
1974f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "WPG", 0, MagicPattern("\377WPC") },
1984f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XBM", 0, MagicPattern("#define") },
1994f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XCF", 0, MagicPattern("gimp xcf") },
2004f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XEF", 0, MagicPattern("FOVb") },
2014f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XPM", 1, MagicPattern("* XPM *") },
2024f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XWD", 4, MagicPattern("\007\000\000") },
2034f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "XWD", 5, MagicPattern("\000\000\007") }
2041ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy };
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LinkedListInfo
20786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  *magic_cache = (LinkedListInfo *) NULL;
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *magic_semaphore = (SemaphoreInfo *) NULL;
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
21686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  IsMagicCacheInstantiated(ExceptionInfo *),
217cd2cd1803dda951bcfff101c44032ae17e52655fcristy  LoadMagicCache(LinkedListInfo *,const char *,const char *,const size_t,
218cd2cd1803dda951bcfff101c44032ae17e52655fcristy    ExceptionInfo *);
21986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
22086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy/*
22186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  A c q u i r e M a g i c L i s t s                                          %
22686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
22986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
23186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  AcquireMagicCache() caches one or more magic configurations which provides a
23286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  mapping between magic attributes and a magic name.
23386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
23486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  The format of the AcquireMagicCache method is:
23586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
23686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%      LinkedListInfo *AcquireMagicCache(const char *filename,
23786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%        ExceptionInfo *exception)
23886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
23986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  A description of each parameter follows:
24086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%    o filename: the font file name.
24286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%    o exception: return any errors or warnings in this structure.
24486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy*/
2468f6816192b5724ef97553a83c73843009e0d70a6dirkstatic int CompareMagickInfoSize(const void *a,const void *b)
2478f6816192b5724ef97553a83c73843009e0d70a6dirk{
2488f6816192b5724ef97553a83c73843009e0d70a6dirk  MagicInfo
2498f6816192b5724ef97553a83c73843009e0d70a6dirk    *ma,
2508f6816192b5724ef97553a83c73843009e0d70a6dirk    *mb;
2518f6816192b5724ef97553a83c73843009e0d70a6dirk
252f2cec1fc8a3a99cf598c29b9e07c1fbfe4ec0fbfcristy  ma=(MagicInfo *) a;
253f2cec1fc8a3a99cf598c29b9e07c1fbfe4ec0fbfcristy  mb=(MagicInfo *) b;
2543d107317003ecc3229d3555e905453330e340410dirk
2553d107317003ecc3229d3555e905453330e340410dirk  if (ma->offset != mb->offset)
2563d107317003ecc3229d3555e905453330e340410dirk    return((int) (ma->offset-mb->offset));
2573d107317003ecc3229d3555e905453330e340410dirk
2583d107317003ecc3229d3555e905453330e340410dirk  return((int) (mb->length-ma->length));
2598f6816192b5724ef97553a83c73843009e0d70a6dirk}
2608f6816192b5724ef97553a83c73843009e0d70a6dirk
26186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic LinkedListInfo *AcquireMagicCache(const char *filename,
26286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ExceptionInfo *exception)
26386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy{
26486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  char
265151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    path[MagickPathExtent];
26686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
26786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  const StringInfo
26886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    *option;
26986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
27086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  LinkedListInfo
27186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    *magic_cache,
27286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    *options;
27386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
27486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  MagickStatusType
27586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    status;
27686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
27786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  register ssize_t
27886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    i;
27986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
28086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
28186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load external magic map.
28286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
28386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  magic_cache=NewLinkedList(0);
28486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (magic_cache == (LinkedListInfo *) NULL)
28586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
28686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  status=MagickTrue;
28786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  *path='\0';
28886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  options=GetConfigureOptions(filename,exception);
28986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  option=(const StringInfo *) GetNextValueInLinkedList(options);
29086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  while (option != (const StringInfo *) NULL)
29186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
292151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(path,GetStringInfoPath(option),MagickPathExtent);
293cd2cd1803dda951bcfff101c44032ae17e52655fcristy    status&=LoadMagicCache(magic_cache,(const char *)
294cd2cd1803dda951bcfff101c44032ae17e52655fcristy      GetStringInfoDatum(option),GetStringInfoPath(option),0,exception);
29586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    option=(const StringInfo *) GetNextValueInLinkedList(options);
29686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
29786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  options=DestroyConfigureOptions(options);
29886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
29986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load built-in magic map.
30086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
30186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  for (i=0; i < (ssize_t) (sizeof(MagicMap)/sizeof(*MagicMap)); i++)
30286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
30386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    MagicInfo
30486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *magic_info;
30586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
30686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    register const MagicMapInfo
30786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *p;
30886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
30986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=MagicMap+i;
31086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
31186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (magic_info == (MagicInfo *) NULL)
31286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      {
31386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        (void) ThrowMagickException(exception,GetMagickModule(),
31486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy          ResourceLimitError,"MemoryAllocationFailed","`%s'",p->name);
31586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        continue;
31686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      }
31786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
31886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->path=(char *) "[built-in]";
31986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->name=(char *) p->name;
32086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->offset=p->offset;
32186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->target=(char *) p->magic;
32286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->magic=(unsigned char *) p->magic;
32386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->length=p->length;
32486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->exempt=MagickTrue;
325e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy    magic_info->signature=MagickCoreSignature;
3268f6816192b5724ef97553a83c73843009e0d70a6dirk    status&=InsertValueInSortedLinkedList(magic_cache,CompareMagickInfoSize,
3278f6816192b5724ef97553a83c73843009e0d70a6dirk      NULL,magic_info);
32886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (status == MagickFalse)
32986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      (void) ThrowMagickException(exception,GetMagickModule(),
33086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name);
33186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
33286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  return(magic_cache);
33386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy}
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3408f6816192b5724ef97553a83c73843009e0d70a6dirk%   G e t M a g i c I n f o                                                   %
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfo() searches the magic list for the specified name and if found
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns attributes for that magic.
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicInfo method is:
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo *GetMagicInfo(const unsigned char *magic,
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length,ExceptionInfo *exception)
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic: A binary string generally representing the first few characters
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of the image file or blob.
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the binary signature.
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo *GetMagicInfo(const unsigned char *magic,
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length,ExceptionInfo *exception)
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
37186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (IsMagicCacheInstantiated(exception) == MagickFalse)
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Search for magic tag.
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
376f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
37786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
37886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
37949d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy  if (magic == (const unsigned char *) NULL)
38049d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    {
38149d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      UnlockSemaphoreInfo(magic_semaphore);
38249d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      return(p);
38349d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    }
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (p != (const MagicInfo *) NULL)
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    assert(p->offset >= 0);
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((size_t) (p->offset+p->length) <= length) &&
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (memcmp(magic+p->offset,p->magic,p->length) == 0))
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
39086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (const MagicInfo *) NULL)
39386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) InsertValueInLinkedList(magic_cache,0,
39486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      RemoveElementByValueFromLinkedList(magic_cache,p));
395f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(p);
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3988f6816192b5724ef97553a83c73843009e0d70a6dirk
3998f6816192b5724ef97553a83c73843009e0d70a6dirk/*
4008f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4018f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4028f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4038f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4044f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%   G e t M a g i c P a t t e r n E x t e n t                                 %
4058f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4068f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4078f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4088f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4098f6816192b5724ef97553a83c73843009e0d70a6dirk%
4104f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  GetMagicPatternExtent() returns the the extent of the buffer that is
4114f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  required to check all the MagickInfos. It returns zero if the list is empty.
4128f6816192b5724ef97553a83c73843009e0d70a6dirk%
4134f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  The format of the GetMagicPatternExtent method is:
4148f6816192b5724ef97553a83c73843009e0d70a6dirk%
4154f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%      size_t GetMagicPatternExtent(ExceptionInfo *exception)
4168f6816192b5724ef97553a83c73843009e0d70a6dirk%
4178f6816192b5724ef97553a83c73843009e0d70a6dirk%  A description of each parameter follows:
4188f6816192b5724ef97553a83c73843009e0d70a6dirk%
4198f6816192b5724ef97553a83c73843009e0d70a6dirk%    o exception: return any errors or warnings in this structure.
4208f6816192b5724ef97553a83c73843009e0d70a6dirk%
4218f6816192b5724ef97553a83c73843009e0d70a6dirk*/
4224f06b88c0fc466d4b21f3b0402da54c27ec3678bcristyMagickExport size_t GetMagicPatternExtent(ExceptionInfo *exception)
4238f6816192b5724ef97553a83c73843009e0d70a6dirk{
4248f6816192b5724ef97553a83c73843009e0d70a6dirk  register const MagicInfo
4258f6816192b5724ef97553a83c73843009e0d70a6dirk    *p;
4268f6816192b5724ef97553a83c73843009e0d70a6dirk
4270feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  size_t
4280feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    magickSize,
4290feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    max;
4300feae42113cd2ea6dbf799bb13f1525b27004ca4dirk
4318f6816192b5724ef97553a83c73843009e0d70a6dirk  static size_t
4320feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    size=0;
4338f6816192b5724ef97553a83c73843009e0d70a6dirk
4348f6816192b5724ef97553a83c73843009e0d70a6dirk  assert(exception != (ExceptionInfo *) NULL);
4354f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy  if ((size != 0) || (IsMagicCacheInstantiated(exception) == MagickFalse))
4368f6816192b5724ef97553a83c73843009e0d70a6dirk    return(size);
4378f6816192b5724ef97553a83c73843009e0d70a6dirk  LockSemaphoreInfo(magic_semaphore);
4388f6816192b5724ef97553a83c73843009e0d70a6dirk  ResetLinkedListIterator(magic_cache);
4390feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  max=0;
4408f6816192b5724ef97553a83c73843009e0d70a6dirk  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
4410feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  while (p != (const MagicInfo *) NULL)
4420feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  {
4430feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    magickSize=(size_t) (p->offset+p->length);
4440feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    if (magickSize > max)
4450feae42113cd2ea6dbf799bb13f1525b27004ca4dirk      max=magickSize;
4460feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
4470feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  }
4480feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  size=max;
4498f6816192b5724ef97553a83c73843009e0d70a6dirk  UnlockSemaphoreInfo(magic_semaphore);
4508f6816192b5724ef97553a83c73843009e0d70a6dirk  return(size);
4518f6816192b5724ef97553a83c73843009e0d70a6dirk}
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c I n f o L i s t                                           %
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfoList() returns any image aliases that match the specified
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The magic of the GetMagicInfoList function is:
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo **GetMagicInfoList(const char *pattern,
470bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *number_aliases,ExceptionInfo *exception)
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
476fc0d11253eb3463ad662f939e6decda188870bbfcristy%    o number_aliases:  This integer returns the number of aliases in the list.
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicInfoCompare(const void *x,const void *y)
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo **) x,
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const MagicInfo **) y;
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare((*p)->path,(*q)->path) == 0)
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(LocaleCompare((*p)->name,(*q)->name));
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare((*p)->path,(*q)->path));
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo **GetMagicInfoList(const char *pattern,
504bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
512bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate magic list.
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
520bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
5221ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(const MagicInfo **) AcquireQuantumMemory((size_t)
52686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases));
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (const MagicInfo **) NULL)
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate magic list.
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
532f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
53386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
53486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=p;
54086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
542f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare);
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(MagicInfo *) NULL;
545bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c L i s t                                                   %
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicList() returns any image format aliases that match the specified
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicList function is:
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
565bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      char **GetMagicList(const char *pattern,size_t *number_aliases,
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_aliases:  This integer returns the number of image format aliases
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      in the list.
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicCompare(const void *x,const void *y)
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const char *) x;
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const char *) y;
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare(p,q));
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
598a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristyMagickExport char **GetMagicList(const char *pattern,size_t *number_aliases,
599a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristy  ExceptionInfo *exception)
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
607bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate configure list.
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
615bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
6171ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(char **) AcquireQuantumMemory((size_t)
62186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases));
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (char **) NULL)
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
624f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
62586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
62686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=ConstantString(p->name);
63286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
634f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare);
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(char *) NULL;
637bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c N a m e                                                   %
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicName() returns the name associated with the magic.
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicName method is:
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetMagicName(const MagicInfo *magic_info)
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic_info:  The magic info.
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetMagicName(const MagicInfo *magic_info)
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info != (MagicInfo *) NULL);
667e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(magic_info->signature == MagickCoreSignature);
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_info->name);
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy+   I s M a g i c C a c h e I n s t a n t i a t e d                           %
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
68286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  IsMagicCacheInstantiated() determines if the magic list is instantiated.
683904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy%  If not, it instantiates the list and returns it.
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
685904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy%  The format of the IsMagicInstantiated method is:
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
68786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%      MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception)
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
69486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception)
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
69686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (magic_cache == (LinkedListInfo *) NULL)
69786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    {
69886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (magic_semaphore == (SemaphoreInfo *) NULL)
69986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ActivateSemaphoreInfo(&magic_semaphore);
70086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      LockSemaphoreInfo(magic_semaphore);
70186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (magic_cache == (LinkedListInfo *) NULL)
70286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        magic_cache=AcquireMagicCache(MagicFilename,exception);
70386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      UnlockSemaphoreInfo(magic_semaphore);
70486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    }
70586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  return(magic_cache != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
70641c3c77d6f4e3131bf2be0b35277c086b69ce492cristy}
70741c3c77d6f4e3131bf2be0b35277c086b69ce492cristy
70841c3c77d6f4e3131bf2be0b35277c086b69ce492cristy/*
70941c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71041c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
71141c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
71241c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L i s t M a g i c I n f o                                                  %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ListMagicInfo() lists the magic info to a file.
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ListMagicInfo method is:
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ListMagicInfo(FILE *file,ExceptionInfo *exception)
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file:  An pointer to a FILE.
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListMagicInfo(FILE *file,
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path;
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **magic_info;
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
741bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
744bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_aliases;
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7479d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
7489d314ff2c17a77996c05413c2013880387e50f0ecristy    j;
7499d314ff2c17a77996c05413c2013880387e50f0ecristy
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == (const FILE *) NULL)
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=stdout;
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=GetMagicInfoList("*",&number_aliases,exception);
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_info == (const MagicInfo **) NULL)
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  path=(const char *) NULL;
757bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_aliases; i++)
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->stealth != MagickFalse)
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((path == (const char *) NULL) ||
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (LocaleCompare(path,magic_info[i]->path) != 0))
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info[i]->path != (char *) NULL)
765b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file,"\nPath: %s\n\n",magic_info[i]->path);
766b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleFile(file,"Name      Offset Target\n");
7671e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(file,
7681e604812fad85bb96f757a2393015ae3d061c39acristy          "-------------------------------------------------"
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "------------------------------\n");
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path=magic_info[i]->path;
772b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%s",magic_info[i]->name);
773bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++)
774b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file," ");
775b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%6ld ",(long) magic_info[i]->offset);
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->target != (char *) NULL)
7771ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      {
778bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
7791ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          j;
7801ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
7811ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy        for (j=0; magic_info[i]->target[j] != '\0'; j++)
7821ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          if (isprint((int) ((unsigned char) magic_info[i]->target[j])) != 0)
783b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"%c",magic_info[i]->target[j]);
7841ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          else
785b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"\\%03o",(unsigned int)
78650931924c7fa18a0bedf56c584c4449dbc7e23b6cristy              ((unsigned char) magic_info[i]->target[j]));
7871ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      }
788b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"\n");
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fflush(file);
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(const MagicInfo **) RelinquishMagickMemory((void *) magic_info);
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   L o a d M a g i c L i s t                                                 %
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  LoadMagicCache() loads the magic configurations which provides a mapping
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  between magic attributes and a magic name.
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  The format of the LoadMagicCache method is:
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
811cd2cd1803dda951bcfff101c44032ae17e52655fcristy%      MagickBooleanType LoadMagicCache(LinkedListInfo *magic_cache,
812cd2cd1803dda951bcfff101c44032ae17e52655fcristy%        const char *xml,const char *filename,const size_t depth,
813cd2cd1803dda951bcfff101c44032ae17e52655fcristy%        ExceptionInfo *exception)
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8171ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o xml: The magic list in XML format.
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8191ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o filename: The magic list filename.
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o depth: depth of <include /> statements.
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
826cd2cd1803dda951bcfff101c44032ae17e52655fcristystatic MagickBooleanType LoadMagicCache(LinkedListInfo *magic_cache,
827cd2cd1803dda951bcfff101c44032ae17e52655fcristy  const char *xml,const char *filename,const size_t depth,
828cd2cd1803dda951bcfff101c44032ae17e52655fcristy  ExceptionInfo *exception)
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
831151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    keyword[MagickPathExtent],
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *token;
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagicInfo
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magic_info;
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
840759ba919e9fe454989454f481f4055fd38b32307cristy  MagickStatusType
841759ba919e9fe454989454f481f4055fd38b32307cristy    status;
842759ba919e9fe454989454f481f4055fd38b32307cristy
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load the magic map file.
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "Loading magic configure file \"%s\" ...",filename);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (xml == (char *) NULL)
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(MagicInfo *) NULL;
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=AcquireString(xml);
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=(char *) xml; *q != '\0'; )
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Interpret XML.
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token == '\0')
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
861151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(keyword,token,MagickPathExtent);
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Doctype element.
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!--",4) == 0)
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Comment element.
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<include") == 0)
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Include element.
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
887151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(keyword,token,MagickPathExtent);
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*token != '=')
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(keyword,"file") == 0)
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (depth > 200)
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ThrowMagickException(exception,GetMagickModule(),
896efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy                  ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  char
900151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    path[MagickPathExtent],
901b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                    *file_xml;
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  GetPathComponent(filename,HeadPath,path);
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*path != '\0')
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,DirectorySeparator,
906151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                      MagickPathExtent);
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*token == *DirectorySeparator)
908151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) CopyMagickString(path,token,MagickPathExtent);
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
910151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) ConcatenateMagickString(path,token,MagickPathExtent);
911b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                  file_xml=FileToXML(path,~0UL);
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (xml != (char *) NULL)
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
914b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                      status&=LoadMagicCache(magic_cache,file_xml,path,depth+1,
915cd2cd1803dda951bcfff101c44032ae17e52655fcristy                        exception);
916b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                      file_xml=DestroyString(file_xml);
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<magic") == 0)
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magic element.
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
92873bd4a51b419e914565bdf204bf1540dc4c8ee26cristy        magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info == (MagicInfo *) NULL)
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->path=ConstantString(filename);
933e3e77a19c40caafb77339e5a126c532bf2984c01cristy        magic_info->exempt=MagickFalse;
934e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy        magic_info->signature=MagickCoreSignature;
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info == (MagicInfo *) NULL)
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"/>") == 0)
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9418f6816192b5724ef97553a83c73843009e0d70a6dirk        status=InsertValueInSortedLinkedList(magic_cache,CompareMagickInfoSize,
9428f6816192b5724ef97553a83c73843009e0d70a6dirk          NULL,magic_info);
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ThrowMagickException(exception,GetMagickModule(),
945efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy            ResourceLimitError,"MemoryAllocationFailed","`%s'",
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name);
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info=(MagicInfo *) NULL;
948d45122f9ea3f4b2f73f275c9c53f8174b3ced4fdcristy        continue;
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,(const char **) NULL,token);
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token != '=')
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*keyword)
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'N':
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"name") == 0)
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name=ConstantString(token);
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'O':
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'o':
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"offset") == 0)
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
972f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy            magic_info->offset=(MagickOffsetType) StringToLong(token);
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'S':
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 's':
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"stealth") == 0)
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9826f2013165d72f7d8ef5f66bb9453126d88113809anthony            magic_info->stealth=IsStringTrue(token);
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'T':
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 't':
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"target") == 0)
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            char
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register unsigned char
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q;
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            size_t
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length;
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=strlen(token);
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->target=ConstantString(token);
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->magic=(unsigned char *) ConstantString(token);
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=magic_info->magic;
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=magic_info->target; *p != '\0'; )
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (*p == '\\')
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (isdigit((int) ((unsigned char) *p)) != 0)
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      char
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *end;
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=(unsigned char) strtol(p,&end,8);
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      p+=(end-p);
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      magic_info->length++;
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  switch (*p)
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'b': *q='\b'; break;
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'f': *q='\f'; break;
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'n': *q='\n'; break;
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'r': *q='\r'; break;
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 't': *q='\t'; break;
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'v': *q='\v'; break;
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'a': *q='a'; break;
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case '?': *q='\?'; break;
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    default: *q=(unsigned char) (*p); break;
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  magic_info->length++;
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  continue;
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleNCompare(p,"&amp;",5) == 0)
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(p+1,p+5,length-magic_info->length);
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) (*p++);
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magic_info->length++;
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=(char *) RelinquishMagickMemory(token);
1052759ba919e9fe454989454f481f4055fd38b32307cristy  return(status != 0 ? MagickTrue : MagickFalse);
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1060f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t G e n e s i s                                 %
1061f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1062f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1063f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1064f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1065f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1066f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentGenesis() instantiates the magic component.
1067f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1068f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentGenesis method is:
1069f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1070f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagickBooleanType MagicComponentGenesis(void)
1071f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1072f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
10735ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType MagicComponentGenesis(void)
1074f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
10757c9770650f31145e0fe8811d10b2e0ecd47697c8cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
10767c9770650f31145e0fe8811d10b2e0ecd47697c8cristy    magic_semaphore=AcquireSemaphoreInfo();
1077f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return(MagickTrue);
1078f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1079f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1080f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1081f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1082f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1083f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1084f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1085f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t T e r m i n u s                               %
1086f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1087f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1088f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1089f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1090f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1091f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentTerminus() destroys the magic component.
1092f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1093f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentTerminus method is:
1094f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1095f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagicComponentTerminus(void)
1096f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1097f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
1098f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1099f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyMagicElement(void *magic_info)
1100f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1101f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  register MagicInfo
1102f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    *p;
1103f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1104f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) magic_info;
1105f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (p->exempt == MagickFalse)
1106f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    {
1107f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->path != (char *) NULL)
1108f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->path=DestroyString(p->path);
1109f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->name != (char *) NULL)
1110f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->name=DestroyString(p->name);
1111f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->target != (char *) NULL)
1112f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->target=DestroyString(p->target);
1113f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->magic != (unsigned char *) NULL)
1114f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
1115f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    }
1116f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) RelinquishMagickMemory(p);
1117f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return((void *) NULL);
1118f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1119f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
11205ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void MagicComponentTerminus(void)
1121f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
112218b17443128598500357da7bff2f01683cf32890cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
112304b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy    ActivateSemaphoreInfo(&magic_semaphore);
1124f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
112586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (magic_cache != (LinkedListInfo *) NULL)
112686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_cache=DestroyLinkedList(magic_cache,DestroyMagicElement);
1127f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
11283d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy  RelinquishSemaphoreInfo(&magic_semaphore);
1129f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1130