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"
49abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.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") },
1248c9d68ca4241b6faafa7a35658a125c3500a5edfJon Sneyers    { "FLIF", 0, MagicPattern("FLIF") },
1254f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "GIF", 0, MagicPattern("GIF8") },
1264f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "GPLT", 0, MagicPattern("#!/usr/local/bin/gnuplot") },
1274f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDF", 1, MagicPattern("HDF") },
1284f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDR", 0, MagicPattern("#?RADIANCE") },
1294f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HDR", 0, MagicPattern("#?RGBE") },
1304f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HPGL", 0, MagicPattern("IN;") },
1314f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HTML", 1, MagicPattern("HTML") },
1324f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "HTML", 1, MagicPattern("html") },
1334f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "ILBM", 8, MagicPattern("ILBM") },
1344f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTCWTEXT", 0, MagicPattern("\062\000#\000\060\000=\000\042\000&\000#\000\060\000;\000&\000#\000\062\000;\000\042\000") },
1354f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTCTEXT", 0, MagicPattern("2#0=\042�\042") },
1364f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "IPTC", 0, MagicPattern("\034\002") },
1374f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JNG", 0, MagicPattern("\213JNG\r\n\032\n") },
1384f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JPEG", 0, MagicPattern("\377\330\377") },
1394f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "J2K", 0, MagicPattern("\xff\x4f\xff\x51") },
1404f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "JPC", 0, MagicPattern("\x0d\x0a\x87\x0a") },
141dbdf015f56500da4e142a35141dcf9e77137eccfdirk    { "JP2", 0, MagicPattern("\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a") },
1424f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MAT", 0, MagicPattern("MATLAB 5.0 MAT-file,") },
1434f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MIFF", 0, MagicPattern("Id=ImageMagick") },
1444f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MIFF", 0, MagicPattern("id=ImageMagick") },
1454f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MNG", 0, MagicPattern("\212MNG\r\n\032\n") },
1464f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MPC", 0, MagicPattern("id=MagickCache") },
1474f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MPEG", 0, MagicPattern("\000\000\001\263") },
1484f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy    { "MRW", 0, MagicPattern("\x00MRM") },
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  LinkedListInfo
265b18d864b3f06e9272582b7736230d934d715d542dirk    *cache;
26686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
26786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  MagickStatusType
26886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    status;
26986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
27086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  register ssize_t
27186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    i;
27286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
27386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
27486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load external magic map.
27586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
276b18d864b3f06e9272582b7736230d934d715d542dirk  cache=NewLinkedList(0);
277b18d864b3f06e9272582b7736230d934d715d542dirk  if (cache == (LinkedListInfo *) NULL)
27886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
27986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  status=MagickTrue;
280b18d864b3f06e9272582b7736230d934d715d542dirk#if !defined(MAGICKCORE_ZERO_CONFIGURATION_SUPPORT)
28186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
282b18d864b3f06e9272582b7736230d934d715d542dirk    char
283b18d864b3f06e9272582b7736230d934d715d542dirk      path[MagickPathExtent];
284b18d864b3f06e9272582b7736230d934d715d542dirk
285b18d864b3f06e9272582b7736230d934d715d542dirk    const StringInfo
286b18d864b3f06e9272582b7736230d934d715d542dirk      *option;
287b18d864b3f06e9272582b7736230d934d715d542dirk
288b18d864b3f06e9272582b7736230d934d715d542dirk    LinkedListInfo
289b18d864b3f06e9272582b7736230d934d715d542dirk      *options;
290b18d864b3f06e9272582b7736230d934d715d542dirk
291b18d864b3f06e9272582b7736230d934d715d542dirk    *path='\0';
292b18d864b3f06e9272582b7736230d934d715d542dirk    options=GetConfigureOptions(filename,exception);
29386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    option=(const StringInfo *) GetNextValueInLinkedList(options);
294b18d864b3f06e9272582b7736230d934d715d542dirk    while (option != (const StringInfo *) NULL)
295b18d864b3f06e9272582b7736230d934d715d542dirk    {
296b18d864b3f06e9272582b7736230d934d715d542dirk      (void) CopyMagickString(path,GetStringInfoPath(option),MagickPathExtent);
297b18d864b3f06e9272582b7736230d934d715d542dirk      status&=LoadMagicCache(cache,(const char *)
298b18d864b3f06e9272582b7736230d934d715d542dirk        GetStringInfoDatum(option),GetStringInfoPath(option),0,exception);
299b18d864b3f06e9272582b7736230d934d715d542dirk      option=(const StringInfo *) GetNextValueInLinkedList(options);
300b18d864b3f06e9272582b7736230d934d715d542dirk    }
301b18d864b3f06e9272582b7736230d934d715d542dirk    options=DestroyConfigureOptions(options);
30286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
303b18d864b3f06e9272582b7736230d934d715d542dirk#endif
30486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
30586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load built-in magic map.
30686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
30786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  for (i=0; i < (ssize_t) (sizeof(MagicMap)/sizeof(*MagicMap)); i++)
30886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
30986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    MagicInfo
31086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *magic_info;
31186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
31286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    register const MagicMapInfo
31386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *p;
31486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
31586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=MagicMap+i;
31686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
31786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (magic_info == (MagicInfo *) NULL)
31886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      {
31986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        (void) ThrowMagickException(exception,GetMagickModule(),
32086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy          ResourceLimitError,"MemoryAllocationFailed","`%s'",p->name);
32186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        continue;
32286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      }
32386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
32486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->path=(char *) "[built-in]";
32586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->name=(char *) p->name;
32686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->offset=p->offset;
32786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->target=(char *) p->magic;
32886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->magic=(unsigned char *) p->magic;
32986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->length=p->length;
33086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_info->exempt=MagickTrue;
331e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy    magic_info->signature=MagickCoreSignature;
332b18d864b3f06e9272582b7736230d934d715d542dirk    status&=InsertValueInSortedLinkedList(cache,CompareMagickInfoSize,
3338f6816192b5724ef97553a83c73843009e0d70a6dirk      NULL,magic_info);
33486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (status == MagickFalse)
33586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      (void) ThrowMagickException(exception,GetMagickModule(),
33686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name);
33786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
338b18d864b3f06e9272582b7736230d934d715d542dirk  return(cache);
33986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy}
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3468f6816192b5724ef97553a83c73843009e0d70a6dirk%   G e t M a g i c I n f o                                                   %
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfo() searches the magic list for the specified name and if found
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns attributes for that magic.
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicInfo method is:
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo *GetMagicInfo(const unsigned char *magic,
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length,ExceptionInfo *exception)
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic: A binary string generally representing the first few characters
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of the image file or blob.
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the binary signature.
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo *GetMagicInfo(const unsigned char *magic,
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length,ExceptionInfo *exception)
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
37786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (IsMagicCacheInstantiated(exception) == MagickFalse)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Search for magic tag.
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
382f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
38386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
38486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
38549d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy  if (magic == (const unsigned char *) NULL)
38649d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    {
38749d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      UnlockSemaphoreInfo(magic_semaphore);
38849d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      return(p);
38949d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    }
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (p != (const MagicInfo *) NULL)
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    assert(p->offset >= 0);
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((size_t) (p->offset+p->length) <= length) &&
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (memcmp(magic+p->offset,p->magic,p->length) == 0))
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
39686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (const MagicInfo *) NULL)
39986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) InsertValueInLinkedList(magic_cache,0,
40086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      RemoveElementByValueFromLinkedList(magic_cache,p));
401f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(p);
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4048f6816192b5724ef97553a83c73843009e0d70a6dirk
4058f6816192b5724ef97553a83c73843009e0d70a6dirk/*
4068f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4078f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4088f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4098f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4104f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%   G e t M a g i c P a t t e r n E x t e n t                                 %
4118f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4128f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4138f6816192b5724ef97553a83c73843009e0d70a6dirk%                                                                             %
4148f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4158f6816192b5724ef97553a83c73843009e0d70a6dirk%
4164f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  GetMagicPatternExtent() returns the the extent of the buffer that is
4174f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  required to check all the MagickInfos. It returns zero if the list is empty.
4188f6816192b5724ef97553a83c73843009e0d70a6dirk%
4194f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%  The format of the GetMagicPatternExtent method is:
4208f6816192b5724ef97553a83c73843009e0d70a6dirk%
4214f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy%      size_t GetMagicPatternExtent(ExceptionInfo *exception)
4228f6816192b5724ef97553a83c73843009e0d70a6dirk%
4238f6816192b5724ef97553a83c73843009e0d70a6dirk%  A description of each parameter follows:
4248f6816192b5724ef97553a83c73843009e0d70a6dirk%
4258f6816192b5724ef97553a83c73843009e0d70a6dirk%    o exception: return any errors or warnings in this structure.
4268f6816192b5724ef97553a83c73843009e0d70a6dirk%
4278f6816192b5724ef97553a83c73843009e0d70a6dirk*/
4284f06b88c0fc466d4b21f3b0402da54c27ec3678bcristyMagickExport size_t GetMagicPatternExtent(ExceptionInfo *exception)
4298f6816192b5724ef97553a83c73843009e0d70a6dirk{
4308f6816192b5724ef97553a83c73843009e0d70a6dirk  register const MagicInfo
4318f6816192b5724ef97553a83c73843009e0d70a6dirk    *p;
4328f6816192b5724ef97553a83c73843009e0d70a6dirk
4330feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  size_t
4340feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    magickSize,
4350feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    max;
4360feae42113cd2ea6dbf799bb13f1525b27004ca4dirk
4378f6816192b5724ef97553a83c73843009e0d70a6dirk  static size_t
4380feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    size=0;
4398f6816192b5724ef97553a83c73843009e0d70a6dirk
4408f6816192b5724ef97553a83c73843009e0d70a6dirk  assert(exception != (ExceptionInfo *) NULL);
4414f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy  if ((size != 0) || (IsMagicCacheInstantiated(exception) == MagickFalse))
4428f6816192b5724ef97553a83c73843009e0d70a6dirk    return(size);
4438f6816192b5724ef97553a83c73843009e0d70a6dirk  LockSemaphoreInfo(magic_semaphore);
4448f6816192b5724ef97553a83c73843009e0d70a6dirk  ResetLinkedListIterator(magic_cache);
4450feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  max=0;
4468f6816192b5724ef97553a83c73843009e0d70a6dirk  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
4470feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  while (p != (const MagicInfo *) NULL)
4480feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  {
4490feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    magickSize=(size_t) (p->offset+p->length);
4500feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    if (magickSize > max)
4510feae42113cd2ea6dbf799bb13f1525b27004ca4dirk      max=magickSize;
4520feae42113cd2ea6dbf799bb13f1525b27004ca4dirk    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
4530feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  }
4540feae42113cd2ea6dbf799bb13f1525b27004ca4dirk  size=max;
4558f6816192b5724ef97553a83c73843009e0d70a6dirk  UnlockSemaphoreInfo(magic_semaphore);
4568f6816192b5724ef97553a83c73843009e0d70a6dirk  return(size);
4578f6816192b5724ef97553a83c73843009e0d70a6dirk}
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c I n f o L i s t                                           %
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfoList() returns any image aliases that match the specified
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The magic of the GetMagicInfoList function is:
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo **GetMagicInfoList(const char *pattern,
476bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *number_aliases,ExceptionInfo *exception)
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
482fc0d11253eb3463ad662f939e6decda188870bbfcristy%    o number_aliases:  This integer returns the number of aliases in the list.
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicInfoCompare(const void *x,const void *y)
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo **) x,
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const MagicInfo **) y;
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare((*p)->path,(*q)->path) == 0)
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(LocaleCompare((*p)->name,(*q)->name));
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare((*p)->path,(*q)->path));
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo **GetMagicInfoList(const char *pattern,
510bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
518bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate magic list.
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
526bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
5281ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(const MagicInfo **) AcquireQuantumMemory((size_t)
53286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases));
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (const MagicInfo **) NULL)
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate magic list.
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
538f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
53986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
54086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=p;
54686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
548f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare);
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(MagicInfo *) NULL;
551bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c L i s t                                                   %
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicList() returns any image format aliases that match the specified
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicList function is:
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
571bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      char **GetMagicList(const char *pattern,size_t *number_aliases,
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_aliases:  This integer returns the number of image format aliases
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      in the list.
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicCompare(const void *x,const void *y)
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const char *) x;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const char *) y;
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare(p,q));
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
604a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristyMagickExport char **GetMagicList(const char *pattern,size_t *number_aliases,
605a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristy  ExceptionInfo *exception)
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
613bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate configure list.
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
621bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
6231ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(char **) AcquireQuantumMemory((size_t)
62786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases));
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (char **) NULL)
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
630f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
63186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(magic_cache);
63286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=ConstantString(p->name);
63886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache);
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
640f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare);
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(char *) NULL;
643bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c N a m e                                                   %
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicName() returns the name associated with the magic.
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicName method is:
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetMagicName(const MagicInfo *magic_info)
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic_info:  The magic info.
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetMagicName(const MagicInfo *magic_info)
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info != (MagicInfo *) NULL);
673e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(magic_info->signature == MagickCoreSignature);
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_info->name);
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
68286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy+   I s M a g i c C a c h e I n s t a n t i a t e d                           %
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
68886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  IsMagicCacheInstantiated() determines if the magic list is instantiated.
689904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy%  If not, it instantiates the list and returns it.
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
691904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy%  The format of the IsMagicInstantiated method is:
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
69386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%      MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception)
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
70086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception)
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
70286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (magic_cache == (LinkedListInfo *) NULL)
70386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    {
70486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (magic_semaphore == (SemaphoreInfo *) NULL)
70586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ActivateSemaphoreInfo(&magic_semaphore);
70686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      LockSemaphoreInfo(magic_semaphore);
70786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (magic_cache == (LinkedListInfo *) NULL)
70886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        magic_cache=AcquireMagicCache(MagicFilename,exception);
70986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      UnlockSemaphoreInfo(magic_semaphore);
71086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    }
71186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  return(magic_cache != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
71241c3c77d6f4e3131bf2be0b35277c086b69ce492cristy}
71341c3c77d6f4e3131bf2be0b35277c086b69ce492cristy
71441c3c77d6f4e3131bf2be0b35277c086b69ce492cristy/*
71541c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71641c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
71741c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
71841c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L i s t M a g i c I n f o                                                  %
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ListMagicInfo() lists the magic info to a file.
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ListMagicInfo method is:
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ListMagicInfo(FILE *file,ExceptionInfo *exception)
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file:  An pointer to a FILE.
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListMagicInfo(FILE *file,
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path;
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **magic_info;
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
747bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
750bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_aliases;
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7539d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
7549d314ff2c17a77996c05413c2013880387e50f0ecristy    j;
7559d314ff2c17a77996c05413c2013880387e50f0ecristy
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == (const FILE *) NULL)
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=stdout;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=GetMagicInfoList("*",&number_aliases,exception);
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_info == (const MagicInfo **) NULL)
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  path=(const char *) NULL;
763bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_aliases; i++)
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->stealth != MagickFalse)
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((path == (const char *) NULL) ||
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (LocaleCompare(path,magic_info[i]->path) != 0))
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info[i]->path != (char *) NULL)
771b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file,"\nPath: %s\n\n",magic_info[i]->path);
772b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleFile(file,"Name      Offset Target\n");
7731e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(file,
7741e604812fad85bb96f757a2393015ae3d061c39acristy          "-------------------------------------------------"
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "------------------------------\n");
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path=magic_info[i]->path;
778b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%s",magic_info[i]->name);
779bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++)
780b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file," ");
781b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%6ld ",(long) magic_info[i]->offset);
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->target != (char *) NULL)
7831ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      {
784bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
7851ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          j;
7861ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
7871ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy        for (j=0; magic_info[i]->target[j] != '\0'; j++)
7881ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          if (isprint((int) ((unsigned char) magic_info[i]->target[j])) != 0)
789b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"%c",magic_info[i]->target[j]);
7901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          else
791b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"\\%03o",(unsigned int)
79250931924c7fa18a0bedf56c584c4449dbc7e23b6cristy              ((unsigned char) magic_info[i]->target[j]));
7931ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      }
794b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"\n");
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fflush(file);
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(const MagicInfo **) RelinquishMagickMemory((void *) magic_info);
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
806fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk+   L o a d M a g i c C a c h e                                               %
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
81286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  LoadMagicCache() loads the magic configurations which provides a mapping
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  between magic attributes and a magic name.
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
81586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  The format of the LoadMagicCache method is:
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
817b18d864b3f06e9272582b7736230d934d715d542dirk%      MagickBooleanType LoadMagicCache(LinkedListInfo *cache,const char *xml,
818b18d864b3f06e9272582b7736230d934d715d542dirk%        const char *filename,const size_t depth,ExceptionInfo *exception)
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8221ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o xml: The magic list in XML format.
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8241ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o filename: The magic list filename.
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o depth: depth of <include /> statements.
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
831b18d864b3f06e9272582b7736230d934d715d542dirkstatic MagickBooleanType LoadMagicCache(LinkedListInfo *cache,const char *xml,
832b18d864b3f06e9272582b7736230d934d715d542dirk  const char *filename,const size_t depth,ExceptionInfo *exception)
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
835151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    keyword[MagickPathExtent],
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *token;
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagicInfo
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magic_info;
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
844759ba919e9fe454989454f481f4055fd38b32307cristy  MagickStatusType
845759ba919e9fe454989454f481f4055fd38b32307cristy    status;
846759ba919e9fe454989454f481f4055fd38b32307cristy
847fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk  size_t
848fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk    extent;
849fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load the magic map file.
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "Loading magic configure file \"%s\" ...",filename);
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (xml == (char *) NULL)
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(MagicInfo *) NULL;
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=AcquireString(xml);
860fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk  extent=strlen(token)+MagickPathExtent;
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=(char *) xml; *q != '\0'; )
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Interpret XML.
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
8668bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token == '\0')
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
869151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(keyword,token,MagickPathExtent);
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Doctype element.
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
8768bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!--",4) == 0)
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Comment element.
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
8858bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<include") == 0)
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Include element.
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
895151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(keyword,token,MagickPathExtent);
8968bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*token != '=')
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
8998bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(keyword,"file") == 0)
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (depth > 200)
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ThrowMagickException(exception,GetMagickModule(),
904efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy                  ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  char
908151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    path[MagickPathExtent],
909b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                    *file_xml;
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  GetPathComponent(filename,HeadPath,path);
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*path != '\0')
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,DirectorySeparator,
914151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                      MagickPathExtent);
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*token == *DirectorySeparator)
916151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) CopyMagickString(path,token,MagickPathExtent);
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
918151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) ConcatenateMagickString(path,token,MagickPathExtent);
919b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                  file_xml=FileToXML(path,~0UL);
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (xml != (char *) NULL)
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
922b18d864b3f06e9272582b7736230d934d715d542dirk                      status&=LoadMagicCache(cache,file_xml,path,depth+1,
923cd2cd1803dda951bcfff101c44032ae17e52655fcristy                        exception);
924b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                      file_xml=DestroyString(file_xml);
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<magic") == 0)
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magic element.
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
93673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy        magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info == (MagicInfo *) NULL)
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->path=ConstantString(filename);
941e3e77a19c40caafb77339e5a126c532bf2984c01cristy        magic_info->exempt=MagickFalse;
942e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy        magic_info->signature=MagickCoreSignature;
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info == (MagicInfo *) NULL)
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"/>") == 0)
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
949b18d864b3f06e9272582b7736230d934d715d542dirk        status=InsertValueInSortedLinkedList(cache,CompareMagickInfoSize,
9508f6816192b5724ef97553a83c73843009e0d70a6dirk          NULL,magic_info);
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ThrowMagickException(exception,GetMagickModule(),
953efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy            ResourceLimitError,"MemoryAllocationFailed","`%s'",
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name);
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info=(MagicInfo *) NULL;
956d45122f9ea3f4b2f73f275c9c53f8174b3ced4fdcristy        continue;
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9588bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,(const char **) NULL,extent,token);
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token != '=')
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
9618bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
9628bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*keyword)
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'N':
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"name") == 0)
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name=ConstantString(token);
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'O':
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'o':
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"offset") == 0)
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
980f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy            magic_info->offset=(MagickOffsetType) StringToLong(token);
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'S':
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 's':
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"stealth") == 0)
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9906f2013165d72f7d8ef5f66bb9453126d88113809anthony            magic_info->stealth=IsStringTrue(token);
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'T':
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 't':
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"target") == 0)
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            char
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register unsigned char
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q;
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            size_t
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length;
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=strlen(token);
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->target=ConstantString(token);
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->magic=(unsigned char *) ConstantString(token);
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=magic_info->magic;
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=magic_info->target; *p != '\0'; )
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (*p == '\\')
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (isdigit((int) ((unsigned char) *p)) != 0)
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      char
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *end;
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=(unsigned char) strtol(p,&end,8);
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      p+=(end-p);
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      magic_info->length++;
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  switch (*p)
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'b': *q='\b'; break;
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'f': *q='\f'; break;
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'n': *q='\n'; break;
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'r': *q='\r'; break;
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 't': *q='\t'; break;
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'v': *q='\v'; break;
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'a': *q='a'; break;
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case '?': *q='\?'; break;
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    default: *q=(unsigned char) (*p); break;
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  magic_info->length++;
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  continue;
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleNCompare(p,"&amp;",5) == 0)
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(p+1,p+5,length-magic_info->length);
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) (*p++);
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magic_info->length++;
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=(char *) RelinquishMagickMemory(token);
1060759ba919e9fe454989454f481f4055fd38b32307cristy  return(status != 0 ? MagickTrue : MagickFalse);
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1068f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t G e n e s i s                                 %
1069f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1070f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1071f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1072f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1073f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1074f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentGenesis() instantiates the magic component.
1075f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1076f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentGenesis method is:
1077f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1078f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagickBooleanType MagicComponentGenesis(void)
1079f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1080f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
10815ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType MagicComponentGenesis(void)
1082f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
10837c9770650f31145e0fe8811d10b2e0ecd47697c8cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
10847c9770650f31145e0fe8811d10b2e0ecd47697c8cristy    magic_semaphore=AcquireSemaphoreInfo();
1085f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return(MagickTrue);
1086f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1087f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1088f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1089f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1090f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1091f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1092f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1093f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t T e r m i n u s                               %
1094f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1095f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1096f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1097f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1098f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1099f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentTerminus() destroys the magic component.
1100f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1101f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentTerminus method is:
1102f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1103f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagicComponentTerminus(void)
1104f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1105f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
1106f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1107f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyMagicElement(void *magic_info)
1108f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1109f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  register MagicInfo
1110f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    *p;
1111f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1112f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) magic_info;
1113f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (p->exempt == MagickFalse)
1114f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    {
1115f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->path != (char *) NULL)
1116f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->path=DestroyString(p->path);
1117f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->name != (char *) NULL)
1118f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->name=DestroyString(p->name);
1119f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->target != (char *) NULL)
1120f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->target=DestroyString(p->target);
1121f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->magic != (unsigned char *) NULL)
1122f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
1123f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    }
1124f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) RelinquishMagickMemory(p);
1125f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return((void *) NULL);
1126f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1127f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
11285ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void MagicComponentTerminus(void)
1129f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
113018b17443128598500357da7bff2f01683cf32890cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
113104b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy    ActivateSemaphoreInfo(&magic_semaphore);
1132f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
113386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (magic_cache != (LinkedListInfo *) NULL)
113486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    magic_cache=DestroyLinkedList(magic_cache,DestroyMagicElement);
1135f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
11363d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy  RelinquishSemaphoreInfo(&magic_semaphore);
1137f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1138