magic.c revision 04b11db5504ecdf205114ae7e9e68774a1ff0b9b
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%                                                                             %
20fe676ee3a9cf43404bdc9ba8b27f597b5e4e28f7cristy%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/client.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/configure.h"
469639ba36e05b3e2fe85c8d9097b9ad8aa2c0e5eecristy#include "MagickCore/configure-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/hashmap.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magic.h"
515ff4eaf57b3cd47d0371f204f865cbba614674a0cristy#include "MagickCore/magic-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/token.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
58d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xml-tree.h"
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MagicFilename  "magic.xml"
6554a531d335ea060a99bead94dcdf45f18496fa83cristy#define MagickString(magic)  (const unsigned char *) (magic), sizeof(magic)-1
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6854a531d335ea060a99bead94dcdf45f18496fa83cristy  Typedef declarations.
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
701ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristytypedef struct _MagicMapInfo
711ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy{
721ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  const char
731ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    *name;
741ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
75e3e77a19c40caafb77339e5a126c532bf2984c01cristy  const MagickOffsetType
76e3e77a19c40caafb77339e5a126c532bf2984c01cristy    offset;
77e3e77a19c40caafb77339e5a126c532bf2984c01cristy
78bcdce3d1a5a9b3b62b403a651a15313b8ddb8654cristy  const unsigned char
791ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    *magic;
801ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
81e3e77a19c40caafb77339e5a126c532bf2984c01cristy  const size_t
821ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    length;
831ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy} MagicMapInfo;
8454a531d335ea060a99bead94dcdf45f18496fa83cristy
8554a531d335ea060a99bead94dcdf45f18496fa83cristy/*
8654a531d335ea060a99bead94dcdf45f18496fa83cristy  Static declarations.
8754a531d335ea060a99bead94dcdf45f18496fa83cristy*/
881ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristystatic const MagicMapInfo
891ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  MagicMap[] =
901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  {
91e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "8BIMWTEXT", 0, MagickString("8\000B\000I\000M\000#") },
92e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "8BIMTEXT", 0, MagickString("8BIM#") },
93e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "8BIM", 0, MagickString("8BIM") },
94e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("BA") },
95e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("BM") },
96e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("CI") },
97e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("CP") },
98e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("IC") },
9980af6b6919ffa01b9124bdcd4012db59c52ecf15cristy    { "PICT", 0, MagickString("PICT") },
100e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "BMP", 0, MagickString("PI") },
101e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CALS", 21, MagickString("version: MIL-STD-1840") },
102e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CALS", 0, MagickString("srcdocid:") },
103e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CALS", 9, MagickString("srcdocid:") },
104e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CALS", 8, MagickString("rorient:") },
105e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CGM", 0, MagickString("BEGMF") },
106e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CIN", 0, MagickString("\200\052\137\327") },
107e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "CRW", 0, MagickString("II\x1a\x00\x00\x00HEAPCCDR") },
108e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DCM", 128, MagickString("DICM") },
109e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DCX", 0, MagickString("\261\150\336\72") },
110e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DIB", 0, MagickString("\050\000") },
111e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DDS", 0, MagickString("DDS ") },
112e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DJVU", 0, MagickString("AT&TFORM") },
113e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DOT", 0, MagickString("digraph") },
114e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DPX", 0, MagickString("SDPX") },
115e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "DPX", 0, MagickString("XPDS") },
116e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "EMF", 40, MagickString("\040\105\115\106\000\000\001\000") },
117e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "EPT", 0, MagickString("\305\320\323\306") },
118e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "EXR", 0, MagickString("\166\057\061\001") },
119e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "FAX", 0, MagickString("DFAX") },
120e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "FIG", 0, MagickString("#FIG") },
121e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "FITS", 0, MagickString("IT0") },
122e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "FITS", 0, MagickString("SIMPLE") },
123e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "FPX", 0, MagickString("\320\317\021\340") },
124e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "GIF", 0, MagickString("GIF8") },
125e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "GPLT", 0, MagickString("#!/usr/local/bin/gnuplot") },
126e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "HDF", 1, MagickString("HDF") },
12703533f2c0a4746924d8aae185e28e5a364b9a2ddcristy    { "HDR", 0, MagickString("#?RADIANCE") },
12884c3d05cd3bced7357f65191d88bb019758d9f90cristy    { "HDR", 0, MagickString("#?RGBE") },
129e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "HPGL", 0, MagickString("IN;") },
130e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "HTML", 1, MagickString("HTML") },
131e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "HTML", 1, MagickString("html") },
132e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "ILBM", 8, MagickString("ILBM") },
133e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "IPTCWTEXT", 0, MagickString("\062\000#\000\060\000=\000\042\000&\000#\000\060\000;\000&\000#\000\062\000;\000\042\000") },
134e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "IPTCTEXT", 0, MagickString("2#0=\042�\042") },
135e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "IPTC", 0, MagickString("\034\002") },
136e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "JNG", 0, MagickString("\213JNG\r\n\032\n") },
137e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "JPEG", 0, MagickString("\377\330\377") },
138b5a97913c9cc3285f2ba5928835d35ee92972af7cristy    { "J2K", 0, MagickString("\xff\x4f\xff\x51") },
139b5a97913c9cc3285f2ba5928835d35ee92972af7cristy    { "JPC", 0, MagickString("\x0d\x0a\x87\x0a") },
140b5a97913c9cc3285f2ba5928835d35ee92972af7cristy    { "JP2", 4, MagickString("\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a") },
141a7cb431570e143cb30e7ae29fd524882a1f40e63cristy    { "MAT", 0, MagickString("MATLAB 5.0 MAT-file,") },
142e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MIFF", 0, MagickString("Id=ImageMagick") },
143e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MIFF", 0, MagickString("id=ImageMagick") },
144e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MNG", 0, MagickString("\212MNG\r\n\032\n") },
145e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MPC", 0, MagickString("id=MagickCache") },
146e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MPEG", 0, MagickString("\000\000\001\263") },
147e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MRW", 0, MagickString("\x00MRM") },
148e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MVG", 0, MagickString("push graphic-context") },
149e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "ORF", 0, MagickString("IIRO\x08\x00\x00\x00") },
150e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCD", 2048, MagickString("PCD_") },
151e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCL", 0, MagickString("\033E\033") },
152e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCX", 0, MagickString("\012\002") },
153e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCX", 0, MagickString("\012\005") },
154e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PDB", 60, MagickString("vIMGView") },
155e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PDF", 0, MagickString("%PDF-") },
1567adb4dba035b9c438a6fbe93867120b700f73acccristy    { "PES", 0, MagickString("#PES") },
157e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PFA", 0, MagickString("%!PS-AdobeFont-1.0") },
158e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PFB", 6, MagickString("%!PS-AdobeFont-1.0") },
159e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PGX", 0, MagickString("\050\107\020\115\046") },
160e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PICT", 522, MagickString("\000\021\002\377\014\000") },
161e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PNG", 0, MagickString("\211PNG\r\n\032\n") },
162345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PBM", 0, MagickString("P1") },
163345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PGM", 0, MagickString("P2") },
164345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PPM", 0, MagickString("P3") },
165345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PBM", 0, MagickString("P4") },
166345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PGM", 0, MagickString("P5") },
167345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PPM", 0, MagickString("P6") },
168345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PAM", 0, MagickString("P7") },
169345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PFM", 0, MagickString("PF") },
170345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PFM", 0, MagickString("Pf") },
171e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("%!") },
172e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("\004%!") },
173e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("\305\320\323\306") },
174b42330138c186026c567ffb0cce21aa06137b730cristy    { "PSB", 0, MagickString("8BPB") },
175e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PSD", 0, MagickString("8BPS") },
176e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PWP", 0, MagickString("SFW95") },
177e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "RAF", 0, MagickString("FUJIFILMCCD-RAW ") },
178e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "RLE", 0, MagickString("\122\314") },
179e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SCT", 0, MagickString("CT") },
180e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SFW", 0, MagickString("SFW94") },
181e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SGI", 0, MagickString("\001\332") },
182e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SUN", 0, MagickString("\131\246\152\225") },
183e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SVG", 1, MagickString("?XML") },
184e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SVG", 1, MagickString("?xml") },
185e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF", 0, MagickString("\115\115\000\052") },
186e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF", 0, MagickString("\111\111\052\000") },
187e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF64", 0, MagickString("\115\115\000\053\000\010\000\000") },
188e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF64", 0, MagickString("\111\111\053\000\010\000\000\000") },
1897c13f59e93fb5091f297cc72c678d671a45ece11cristy    { "TTF", 0, MagickString("\000\001\000\000\000") },
190e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TXT", 0, MagickString("# ImageMagick pixel enumeration:") },
191e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VICAR", 0, MagickString("LBLSIZE") },
192e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VICAR", 0, MagickString("NJPL1I") },
193e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VIFF", 0, MagickString("\253\001") },
19456dd2cd0c16c8fe059d7fff3f24ea384174c7bcecristy    { "WEBP", 8, MagickString("WEBP") },
195e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WMF", 0, MagickString("\327\315\306\232") },
196e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WMF", 0, MagickString("\001\000\011\000") },
197e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WPG", 0, MagickString("\377WPC") },
198e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XBM", 0, MagickString("#define") },
199e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XCF", 0, MagickString("gimp xcf") },
200e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XEF", 0, MagickString("FOVb") },
201e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XPM", 1, MagickString("* XPM *") },
202e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XWD", 4, MagickString("\007\000\000") },
20354a531d335ea060a99bead94dcdf45f18496fa83cristy    { "XWD", 5, MagickString("\000\000\007") }
2041ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy };
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LinkedListInfo
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *magic_list = (LinkedListInfo *) NULL;
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *magic_semaphore = (SemaphoreInfo *) NULL;
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic volatile MagickBooleanType
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  instantiate_magic = MagickFalse;
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  InitializeMagicList(ExceptionInfo *),
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LoadMagicLists(const char *,ExceptionInfo *);
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   G e t M a g i c I n f o                                                   %
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfo() searches the magic list for the specified name and if found
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns attributes for that magic.
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicInfo method is:
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo *GetMagicInfo(const unsigned char *magic,
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length,ExceptionInfo *exception)
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic: A binary string generally representing the first few characters
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of the image file or blob.
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the binary signature.
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo *GetMagicInfo(const unsigned char *magic,
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length,ExceptionInfo *exception)
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) ||
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (instantiate_magic == MagickFalse))
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (InitializeMagicList(exception) == MagickFalse)
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((const MagicInfo *) NULL);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) ||
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (IsLinkedListEmpty(magic_list) != MagickFalse))
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic == (const unsigned char *) NULL)
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) GetValueFromLinkedList(magic_list,0));
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length == 0)
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Search for magic tag.
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
272f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (p != (const MagicInfo *) NULL)
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    assert(p->offset >= 0);
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((size_t) (p->offset+p->length) <= length) &&
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (memcmp(magic+p->offset,p->magic,p->length) == 0))
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (const MagicInfo *) NULL)
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) InsertValueInLinkedList(magic_list,0,
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RemoveElementByValueFromLinkedList(magic_list,p));
286f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(p);
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c I n f o L i s t                                           %
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfoList() returns any image aliases that match the specified
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The magic of the GetMagicInfoList function is:
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo **GetMagicInfoList(const char *pattern,
307bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *number_aliases,ExceptionInfo *exception)
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
313fc0d11253eb3463ad662f939e6decda188870bbfcristy%    o number_aliases:  This integer returns the number of aliases in the list.
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicInfoCompare(const void *x,const void *y)
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo **) x,
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const MagicInfo **) y;
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare((*p)->path,(*q)->path) == 0)
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(LocaleCompare((*p)->name,(*q)->name));
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare((*p)->path,(*q)->path));
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo **GetMagicInfoList(const char *pattern,
341bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
349bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate magic list.
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
357bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
3591ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(const MagicInfo **) AcquireQuantumMemory((size_t)
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetNumberOfElementsInLinkedList(magic_list)+1UL,sizeof(*aliases));
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (const MagicInfo **) NULL)
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate magic list.
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
369f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=p;
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
379f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare);
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(MagicInfo *) NULL;
382bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c L i s t                                                   %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicList() returns any image format aliases that match the specified
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicList function is:
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
402bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      char **GetMagicList(const char *pattern,size_t *number_aliases,
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_aliases:  This integer returns the number of image format aliases
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      in the list.
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicCompare(const void *x,const void *y)
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const char *) x;
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const char *) y;
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare(p,q));
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **GetMagicList(const char *pattern,
436bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
444bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate configure list.
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
452bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
4541ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(char **) AcquireQuantumMemory((size_t)
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetNumberOfElementsInLinkedList(magic_list)+1UL,sizeof(*aliases));
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (char **) NULL)
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
461f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=ConstantString(p->name);
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
471f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare);
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(char *) NULL;
474bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c N a m e                                                   %
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicName() returns the name associated with the magic.
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicName method is:
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetMagicName(const MagicInfo *magic_info)
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic_info:  The magic info.
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetMagicName(const MagicInfo *magic_info)
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info != (MagicInfo *) NULL);
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info->signature == MagickSignature);
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_info->name);
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   I n i t i a l i z e M a g i c L i s t                                     %
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  InitializeMagicList() initializes the magic list.
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the InitializeMagicList method is:
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType InitializeMagicList(ExceptionInfo *exception)
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType InitializeMagicList(ExceptionInfo *exception)
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) &&
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (instantiate_magic == MagickFalse))
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5354e1dff661dca8fc9ca6f524eaacb32c0eb5a9d78cristy      if (magic_semaphore == (SemaphoreInfo *) NULL)
53604b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy        ActivateSemaphoreInfo(&magic_semaphore);
537f84a193d5f435588cd78d521fff3f1f852e227f8cristy      LockSemaphoreInfo(magic_semaphore);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((magic_list == (LinkedListInfo *) NULL) &&
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (instantiate_magic == MagickFalse))
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LoadMagicLists(MagicFilename,exception);
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          instantiate_magic=MagickTrue;
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
544f84a193d5f435588cd78d521fff3f1f852e227f8cristy      UnlockSemaphoreInfo(magic_semaphore);
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
54741c3c77d6f4e3131bf2be0b35277c086b69ce492cristy}
54841c3c77d6f4e3131bf2be0b35277c086b69ce492cristy
54941c3c77d6f4e3131bf2be0b35277c086b69ce492cristy/*
55041c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55141c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
55241c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
55341c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L i s t M a g i c I n f o                                                  %
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ListMagicInfo() lists the magic info to a file.
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ListMagicInfo method is:
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ListMagicInfo(FILE *file,ExceptionInfo *exception)
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file:  An pointer to a FILE.
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListMagicInfo(FILE *file,
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **magic_info;
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
582bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
585bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_aliases;
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5889d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
5899d314ff2c17a77996c05413c2013880387e50f0ecristy    j;
5909d314ff2c17a77996c05413c2013880387e50f0ecristy
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == (const FILE *) NULL)
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=stdout;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=GetMagicInfoList("*",&number_aliases,exception);
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_info == (const MagicInfo **) NULL)
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  path=(const char *) NULL;
598bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_aliases; i++)
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->stealth != MagickFalse)
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((path == (const char *) NULL) ||
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (LocaleCompare(path,magic_info[i]->path) != 0))
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info[i]->path != (char *) NULL)
606b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file,"\nPath: %s\n\n",magic_info[i]->path);
607b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleFile(file,"Name      Offset Target\n");
6081e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(file,
6091e604812fad85bb96f757a2393015ae3d061c39acristy          "-------------------------------------------------"
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "------------------------------\n");
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path=magic_info[i]->path;
613b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%s",magic_info[i]->name);
614bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++)
615b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file," ");
616b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%6ld ",(long) magic_info[i]->offset);
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->target != (char *) NULL)
6181ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      {
619bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
6201ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          j;
6211ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
6221ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy        for (j=0; magic_info[i]->target[j] != '\0'; j++)
6231ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          if (isprint((int) ((unsigned char) magic_info[i]->target[j])) != 0)
624b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"%c",magic_info[i]->target[j]);
6251ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          else
626b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"\\%03o",(unsigned int)
62750931924c7fa18a0bedf56c584c4449dbc7e23b6cristy              ((unsigned char) magic_info[i]->target[j]));
6281ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      }
629b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"\n");
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fflush(file);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(const MagicInfo **) RelinquishMagickMemory((void *) magic_info);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   L o a d M a g i c L i s t                                                 %
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LoadMagicList() loads the magic configuration file which provides a mapping
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  between magic attributes and a magic name.
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LoadMagicList method is:
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType LoadMagicList(const char *xml,const char *filename,
653bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        const size_t depth,ExceptionInfo *exception)
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6571ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o xml: The magic list in XML format.
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6591ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o filename: The magic list filename.
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o depth: depth of <include /> statements.
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType LoadMagicList(const char *xml,const char *filename,
667bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t depth,ExceptionInfo *exception)
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    keyword[MaxTextExtent],
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *token;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagicInfo
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magic_info;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load the magic map file.
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "Loading magic configure file \"%s\" ...",filename);
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (xml == (char *) NULL)
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_list == (LinkedListInfo *) NULL)
690e3e77a19c40caafb77339e5a126c532bf2984c01cristy    {
691e3e77a19c40caafb77339e5a126c532bf2984c01cristy      magic_list=NewLinkedList(0);
692e3e77a19c40caafb77339e5a126c532bf2984c01cristy      if (magic_list == (LinkedListInfo *) NULL)
693e3e77a19c40caafb77339e5a126c532bf2984c01cristy        {
694e3e77a19c40caafb77339e5a126c532bf2984c01cristy          ThrowFileException(exception,ResourceLimitError,
695e3e77a19c40caafb77339e5a126c532bf2984c01cristy            "MemoryAllocationFailed",filename);
696e3e77a19c40caafb77339e5a126c532bf2984c01cristy          return(MagickFalse);
697e3e77a19c40caafb77339e5a126c532bf2984c01cristy        }
698e3e77a19c40caafb77339e5a126c532bf2984c01cristy    }
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(MagicInfo *) NULL;
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=AcquireString(xml);
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=(char *) xml; *q != '\0'; )
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Interpret XML.
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token == '\0')
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CopyMagickString(keyword,token,MaxTextExtent);
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Doctype element.
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!--",4) == 0)
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Comment element.
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<include") == 0)
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Include element.
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(keyword,token,MaxTextExtent);
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*token != '=')
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(keyword,"file") == 0)
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (depth > 200)
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ThrowMagickException(exception,GetMagickModule(),
745efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy                  ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  char
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    path[MaxTextExtent],
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *xml;
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  GetPathComponent(filename,HeadPath,path);
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*path != '\0')
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,DirectorySeparator,
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      MaxTextExtent);
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*token == *DirectorySeparator)
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) CopyMagickString(path,token,MaxTextExtent);
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,token,MaxTextExtent);
7603a5987c75c361dde2b38579f05ca961927d842fecristy                  xml=FileToString(path,~0UL,exception);
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (xml != (char *) NULL)
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      status=LoadMagicList(xml,path,depth+1,exception);
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      xml=(char *) RelinquishMagickMemory(xml);
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<magic") == 0)
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magic element.
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
77673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy        magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info == (MagicInfo *) NULL)
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->path=ConstantString(filename);
781e3e77a19c40caafb77339e5a126c532bf2984c01cristy        magic_info->exempt=MagickFalse;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->signature=MagickSignature;
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info == (MagicInfo *) NULL)
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"/>") == 0)
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=AppendValueToLinkedList(magic_list,magic_info);
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ThrowMagickException(exception,GetMagickModule(),
792efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy            ResourceLimitError,"MemoryAllocationFailed","`%s'",
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info=(MagicInfo *) NULL;
795d45122f9ea3f4b2f73f275c9c53f8174b3ced4fdcristy        continue;
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,(const char **) NULL,token);
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token != '=')
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*keyword)
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'N':
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"name") == 0)
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name=ConstantString(token);
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'O':
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'o':
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"offset") == 0)
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
819f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy            magic_info->offset=(MagickOffsetType) StringToLong(token);
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'S':
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 's':
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"stealth") == 0)
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8296f2013165d72f7d8ef5f66bb9453126d88113809anthony            magic_info->stealth=IsStringTrue(token);
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'T':
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 't':
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"target") == 0)
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            char
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register unsigned char
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q;
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            size_t
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length;
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=strlen(token);
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->target=ConstantString(token);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->magic=(unsigned char *) ConstantString(token);
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=magic_info->magic;
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=magic_info->target; *p != '\0'; )
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (*p == '\\')
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (isdigit((int) ((unsigned char) *p)) != 0)
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      char
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *end;
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=(unsigned char) strtol(p,&end,8);
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      p+=(end-p);
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      magic_info->length++;
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  switch (*p)
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'b': *q='\b'; break;
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'f': *q='\f'; break;
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'n': *q='\n'; break;
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'r': *q='\r'; break;
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 't': *q='\t'; break;
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'v': *q='\v'; break;
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'a': *q='a'; break;
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case '?': *q='\?'; break;
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    default: *q=(unsigned char) (*p); break;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  magic_info->length++;
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  continue;
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleNCompare(p,"&amp;",5) == 0)
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(p+1,p+5,length-magic_info->length);
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) (*p++);
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magic_info->length++;
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=(char *) RelinquishMagickMemory(token);
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L o a d M a g i c L i s t s                                                %
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LoadMagicLists() loads one or more magic configuration file which provides a
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  mapping between magic attributes and a magic name.
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LoadMagicLists method is:
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType LoadMagicLists(const char *filename,
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the font file name.
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType LoadMagicLists(const char *filename,
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path[MaxTextExtent];
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *option;
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LinkedListInfo
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *options;
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickStatusType
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
943bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
94454a531d335ea060a99bead94dcdf45f18496fa83cristy    i;
9451ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
9461ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  /*
947398fd02612ac738cc5c950c0e5df20a6db3db001cristy    Load external magic map.
9481ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  */
9491ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  if (magic_list == (LinkedListInfo *) NULL)
950e3e77a19c40caafb77339e5a126c532bf2984c01cristy    {
951e3e77a19c40caafb77339e5a126c532bf2984c01cristy      magic_list=NewLinkedList(0);
952e3e77a19c40caafb77339e5a126c532bf2984c01cristy      if (magic_list == (LinkedListInfo *) NULL)
953e3e77a19c40caafb77339e5a126c532bf2984c01cristy        {
954e3e77a19c40caafb77339e5a126c532bf2984c01cristy          ThrowFileException(exception,ResourceLimitError,
955e3e77a19c40caafb77339e5a126c532bf2984c01cristy            "MemoryAllocationFailed",filename);
956e3e77a19c40caafb77339e5a126c532bf2984c01cristy          return(MagickFalse);
957e3e77a19c40caafb77339e5a126c532bf2984c01cristy        }
958e3e77a19c40caafb77339e5a126c532bf2984c01cristy    }
959398fd02612ac738cc5c950c0e5df20a6db3db001cristy  status=MagickTrue;
960398fd02612ac738cc5c950c0e5df20a6db3db001cristy  *path='\0';
961398fd02612ac738cc5c950c0e5df20a6db3db001cristy  options=GetConfigureOptions(filename,exception);
962398fd02612ac738cc5c950c0e5df20a6db3db001cristy  option=(const StringInfo *) GetNextValueInLinkedList(options);
963398fd02612ac738cc5c950c0e5df20a6db3db001cristy  while (option != (const StringInfo *) NULL)
964398fd02612ac738cc5c950c0e5df20a6db3db001cristy  {
965398fd02612ac738cc5c950c0e5df20a6db3db001cristy    (void) CopyMagickString(path,GetStringInfoPath(option),MaxTextExtent);
966aae13f6e1a9764f28b4f2e8d03ad4ac7f616f2a3cristy    status&=LoadMagicList((const char *) GetStringInfoDatum(option),
967398fd02612ac738cc5c950c0e5df20a6db3db001cristy      GetStringInfoPath(option),0,exception);
968398fd02612ac738cc5c950c0e5df20a6db3db001cristy    option=(const StringInfo *) GetNextValueInLinkedList(options);
969398fd02612ac738cc5c950c0e5df20a6db3db001cristy  }
970398fd02612ac738cc5c950c0e5df20a6db3db001cristy  options=DestroyConfigureOptions(options);
971398fd02612ac738cc5c950c0e5df20a6db3db001cristy  /*
972398fd02612ac738cc5c950c0e5df20a6db3db001cristy    Load built-in magic map.
973398fd02612ac738cc5c950c0e5df20a6db3db001cristy  */
974bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) (sizeof(MagicMap)/sizeof(*MagicMap)); i++)
9751ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  {
9761ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    MagicInfo
9771ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      *magic_info;
9781ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
97954a531d335ea060a99bead94dcdf45f18496fa83cristy    register const MagicMapInfo
98054a531d335ea060a99bead94dcdf45f18496fa83cristy      *p;
98154a531d335ea060a99bead94dcdf45f18496fa83cristy
98254a531d335ea060a99bead94dcdf45f18496fa83cristy    p=MagicMap+i;
98373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy    magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
9841ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    if (magic_info == (MagicInfo *) NULL)
985e3e77a19c40caafb77339e5a126c532bf2984c01cristy      {
986e3e77a19c40caafb77339e5a126c532bf2984c01cristy        (void) ThrowMagickException(exception,GetMagickModule(),
987d45122f9ea3f4b2f73f275c9c53f8174b3ced4fdcristy          ResourceLimitError,"MemoryAllocationFailed","`%s'",p->name);
988e3e77a19c40caafb77339e5a126c532bf2984c01cristy        continue;
989e3e77a19c40caafb77339e5a126c532bf2984c01cristy      }
9901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
99138b8ed92fb9be72aee9b1bb4f378a251259f0c87cristy    magic_info->path=(char *) "[built-in]";
9921ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->name=(char *) p->name;
9931ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->offset=p->offset;
9941ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->target=(char *) p->magic;
995e3e77a19c40caafb77339e5a126c532bf2984c01cristy    magic_info->magic=(unsigned char *) p->magic;
9961ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->length=p->length;
9971ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->exempt=MagickTrue;
9981ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->signature=MagickSignature;
999aae13f6e1a9764f28b4f2e8d03ad4ac7f616f2a3cristy    status&=AppendValueToLinkedList(magic_list,magic_info);
10001ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    if (status == MagickFalse)
10011ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      (void) ThrowMagickException(exception,GetMagickModule(),
1002efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name);
10031ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  }
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status != 0 ? MagickTrue : MagickFalse);
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1006f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1007f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1008f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1009f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1010f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1011f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1012f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t G e n e s i s                                 %
1013f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1014f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1015f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1016f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1017f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1018f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentGenesis() instantiates the magic component.
1019f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1020f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentGenesis method is:
1021f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1022f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagickBooleanType MagicComponentGenesis(void)
1023f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1024f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
10255ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType MagicComponentGenesis(void)
1026f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
10273d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy  magic_semaphore=AcquireSemaphoreInfo();
1028f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return(MagickTrue);
1029f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1030f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1031f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1032f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1033f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1034f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1035f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1036f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t T e r m i n u s                               %
1037f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1038f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1039f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1040f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1041f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1042f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentTerminus() destroys the magic component.
1043f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1044f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentTerminus method is:
1045f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1046f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagicComponentTerminus(void)
1047f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1048f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
1049f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1050f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyMagicElement(void *magic_info)
1051f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1052f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  register MagicInfo
1053f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    *p;
1054f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1055f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) magic_info;
1056f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (p->exempt == MagickFalse)
1057f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    {
1058f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->path != (char *) NULL)
1059f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->path=DestroyString(p->path);
1060f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->name != (char *) NULL)
1061f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->name=DestroyString(p->name);
1062f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->target != (char *) NULL)
1063f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->target=DestroyString(p->target);
1064f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->magic != (unsigned char *) NULL)
1065f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
1066f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    }
1067f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) RelinquishMagickMemory(p);
1068f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return((void *) NULL);
1069f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1070f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
10715ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void MagicComponentTerminus(void)
1072f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
107318b17443128598500357da7bff2f01683cf32890cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
107404b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy    ActivateSemaphoreInfo(&magic_semaphore);
1075f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
1076f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (magic_list != (LinkedListInfo *) NULL)
1077f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    magic_list=DestroyLinkedList(magic_list,DestroyMagicElement);
1078f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  instantiate_magic=MagickFalse;
1079f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
10803d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy  RelinquishSemaphoreInfo(&magic_semaphore);
1081f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1082