magic.c revision fe676ee3a9cf43404bdc9ba8b27f597b5e4e28f7
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") },
138e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "JPC", 0, MagickString("\377\117") },
139e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "JP2", 4, MagickString("\152\120\040\040\015") },
140a7cb431570e143cb30e7ae29fd524882a1f40e63cristy    { "MAT", 0, MagickString("MATLAB 5.0 MAT-file,") },
141e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MIFF", 0, MagickString("Id=ImageMagick") },
142e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MIFF", 0, MagickString("id=ImageMagick") },
143e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MNG", 0, MagickString("\212MNG\r\n\032\n") },
144e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MPC", 0, MagickString("id=MagickCache") },
145e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MPEG", 0, MagickString("\000\000\001\263") },
146e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MRW", 0, MagickString("\x00MRM") },
147e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "MVG", 0, MagickString("push graphic-context") },
148e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "ORF", 0, MagickString("IIRO\x08\x00\x00\x00") },
149e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCD", 2048, MagickString("PCD_") },
150e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCL", 0, MagickString("\033E\033") },
151e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCX", 0, MagickString("\012\002") },
152e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PCX", 0, MagickString("\012\005") },
153e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PDB", 60, MagickString("vIMGView") },
154e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PDF", 0, MagickString("%PDF-") },
1557adb4dba035b9c438a6fbe93867120b700f73acccristy    { "PES", 0, MagickString("#PES") },
156e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PFA", 0, MagickString("%!PS-AdobeFont-1.0") },
157e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PFB", 6, MagickString("%!PS-AdobeFont-1.0") },
158e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PGX", 0, MagickString("\050\107\020\115\046") },
159e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PICT", 522, MagickString("\000\021\002\377\014\000") },
160e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PNG", 0, MagickString("\211PNG\r\n\032\n") },
161345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PBM", 0, MagickString("P1") },
162345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PGM", 0, MagickString("P2") },
163345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PPM", 0, MagickString("P3") },
164345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PBM", 0, MagickString("P4") },
165345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PGM", 0, MagickString("P5") },
166345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PPM", 0, MagickString("P6") },
167345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PAM", 0, MagickString("P7") },
168345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PFM", 0, MagickString("PF") },
169345752101733ab7df3069fd48afcfb8e47de9473cristy    { "PFM", 0, MagickString("Pf") },
170e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("%!") },
171e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("\004%!") },
172e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PS", 0, MagickString("\305\320\323\306") },
173b42330138c186026c567ffb0cce21aa06137b730cristy    { "PSB", 0, MagickString("8BPB") },
174e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PSD", 0, MagickString("8BPS") },
175e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "PWP", 0, MagickString("SFW95") },
176e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "RAF", 0, MagickString("FUJIFILMCCD-RAW ") },
177e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "RLE", 0, MagickString("\122\314") },
178e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SCT", 0, MagickString("CT") },
179e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SFW", 0, MagickString("SFW94") },
180e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SGI", 0, MagickString("\001\332") },
181e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SUN", 0, MagickString("\131\246\152\225") },
182e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SVG", 1, MagickString("?XML") },
183e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "SVG", 1, MagickString("?xml") },
184e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF", 0, MagickString("\115\115\000\052") },
185e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF", 0, MagickString("\111\111\052\000") },
186e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF64", 0, MagickString("\115\115\000\053\000\010\000\000") },
187e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TIFF64", 0, MagickString("\111\111\053\000\010\000\000\000") },
1887c13f59e93fb5091f297cc72c678d671a45ece11cristy    { "TTF", 0, MagickString("\000\001\000\000\000") },
189e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "TXT", 0, MagickString("# ImageMagick pixel enumeration:") },
190e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VICAR", 0, MagickString("LBLSIZE") },
191e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VICAR", 0, MagickString("NJPL1I") },
192e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "VIFF", 0, MagickString("\253\001") },
19356dd2cd0c16c8fe059d7fff3f24ea384174c7bcecristy    { "WEBP", 8, MagickString("WEBP") },
194e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WMF", 0, MagickString("\327\315\306\232") },
195e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WMF", 0, MagickString("\001\000\011\000") },
196e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "WPG", 0, MagickString("\377WPC") },
197e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XBM", 0, MagickString("#define") },
198e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XCF", 0, MagickString("gimp xcf") },
199e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XEF", 0, MagickString("FOVb") },
200e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XPM", 1, MagickString("* XPM *") },
201e3e77a19c40caafb77339e5a126c532bf2984c01cristy    { "XWD", 4, MagickString("\007\000\000") },
20254a531d335ea060a99bead94dcdf45f18496fa83cristy    { "XWD", 5, MagickString("\000\000\007") }
2031ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy };
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LinkedListInfo
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *magic_list = (LinkedListInfo *) NULL;
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *magic_semaphore = (SemaphoreInfo *) NULL;
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic volatile MagickBooleanType
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  instantiate_magic = MagickFalse;
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  InitializeMagicList(ExceptionInfo *),
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LoadMagicLists(const char *,ExceptionInfo *);
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   G e t M a g i c I n f o                                                   %
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfo() searches the magic list for the specified name and if found
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns attributes for that magic.
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicInfo method is:
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo *GetMagicInfo(const unsigned char *magic,
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const size_t length,ExceptionInfo *exception)
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic: A binary string generally representing the first few characters
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of the image file or blob.
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: the length of the binary signature.
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo *GetMagicInfo(const unsigned char *magic,
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const size_t length,ExceptionInfo *exception)
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) ||
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (instantiate_magic == MagickFalse))
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (InitializeMagicList(exception) == MagickFalse)
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((const MagicInfo *) NULL);
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) ||
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (IsLinkedListEmpty(magic_list) != MagickFalse))
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic == (const unsigned char *) NULL)
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) GetValueFromLinkedList(magic_list,0));
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length == 0)
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo *) NULL);
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Search for magic tag.
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
271f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (p != (const MagicInfo *) NULL)
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    assert(p->offset >= 0);
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (((size_t) (p->offset+p->length) <= length) &&
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (memcmp(magic+p->offset,p->magic,p->length) == 0))
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (const MagicInfo *) NULL)
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) InsertValueInLinkedList(magic_list,0,
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RemoveElementByValueFromLinkedList(magic_list,p));
285f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(p);
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c I n f o L i s t                                           %
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicInfoList() returns any image aliases that match the specified
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The magic of the GetMagicInfoList function is:
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const MagicInfo **GetMagicInfoList(const char *pattern,
306bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *number_aliases,ExceptionInfo *exception)
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
312fc0d11253eb3463ad662f939e6decda188870bbfcristy%    o number_aliases:  This integer returns the number of aliases in the list.
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicInfoCompare(const void *x,const void *y)
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo **) x,
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const MagicInfo **) y;
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare((*p)->path,(*q)->path) == 0)
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(LocaleCompare((*p)->name,(*q)->name));
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare((*p)->path,(*q)->path));
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo **GetMagicInfoList(const char *pattern,
340bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
348bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate magic list.
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
356bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
3581ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(const MagicInfo **) AcquireQuantumMemory((size_t)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetNumberOfElementsInLinkedList(magic_list)+1UL,sizeof(*aliases));
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (const MagicInfo **) NULL)
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const MagicInfo **) NULL);
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate magic list.
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
368f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=p;
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
378f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(MagicInfo *) NULL;
381bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c L i s t                                                   %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicList() returns any image format aliases that match the specified
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pattern.
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicList function is:
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
401bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      char **GetMagicList(const char *pattern,size_t *number_aliases,
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_aliases:  This integer returns the number of image format aliases
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      in the list.
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicCompare(const void *x,const void *y)
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const char *) x;
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const char *) y;
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare(p,q));
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char **GetMagicList(const char *pattern,
435bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_aliases,ExceptionInfo *exception)
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **aliases;
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const MagicInfo
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
443bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate configure list.
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
451bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_aliases != (size_t *) NULL);
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_aliases=0;
4531ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  p=GetMagicInfo((const unsigned char *) NULL,0,exception);
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const MagicInfo *) NULL)
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases=(char **) AcquireQuantumMemory((size_t)
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetNumberOfElementsInLinkedList(magic_list)+1UL,sizeof(*aliases));
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aliases == (char **) NULL)
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
460f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResetLinkedListIterator(magic_list);
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const MagicInfo *) NULL; )
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aliases[i++]=ConstantString(p->name);
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=(const MagicInfo *) GetNextValueInLinkedList(magic_list);
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
470f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare);
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aliases[i]=(char *) NULL;
473bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_aliases=(size_t) i;
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aliases);
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t M a g i c N a m e                                                   %
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetMagicName() returns the name associated with the magic.
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetMagicName method is:
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetMagicName(const MagicInfo *magic_info)
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magic_info:  The magic info.
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetMagicName(const MagicInfo *magic_info)
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info != (MagicInfo *) NULL);
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(magic_info->signature == MagickSignature);
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_info->name);
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   I n i t i a l i z e M a g i c L i s t                                     %
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  InitializeMagicList() initializes the magic list.
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the InitializeMagicList method is:
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType InitializeMagicList(ExceptionInfo *exception)
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType InitializeMagicList(ExceptionInfo *exception)
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magic_list == (LinkedListInfo *) NULL) &&
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (instantiate_magic == MagickFalse))
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5344e1dff661dca8fc9ca6f524eaacb32c0eb5a9d78cristy      if (magic_semaphore == (SemaphoreInfo *) NULL)
5354e1dff661dca8fc9ca6f524eaacb32c0eb5a9d78cristy        AcquireSemaphoreInfo(&magic_semaphore);
536f84a193d5f435588cd78d521fff3f1f852e227f8cristy      LockSemaphoreInfo(magic_semaphore);
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((magic_list == (LinkedListInfo *) NULL) &&
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (instantiate_magic == MagickFalse))
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LoadMagicLists(MagicFilename,exception);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          instantiate_magic=MagickTrue;
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
543f84a193d5f435588cd78d521fff3f1f852e227f8cristy      UnlockSemaphoreInfo(magic_semaphore);
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(magic_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
54641c3c77d6f4e3131bf2be0b35277c086b69ce492cristy}
54741c3c77d6f4e3131bf2be0b35277c086b69ce492cristy
54841c3c77d6f4e3131bf2be0b35277c086b69ce492cristy/*
54941c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55041c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
55141c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
55241c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%                                                                             %
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L i s t M a g i c I n f o                                                  %
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ListMagicInfo() lists the magic info to a file.
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ListMagicInfo method is:
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ListMagicInfo(FILE *file,ExceptionInfo *exception)
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file:  An pointer to a FILE.
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListMagicInfo(FILE *file,
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path;
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagicInfo
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **magic_info;
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
581bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
584bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_aliases;
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5879d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
5889d314ff2c17a77996c05413c2013880387e50f0ecristy    j;
5899d314ff2c17a77996c05413c2013880387e50f0ecristy
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == (const FILE *) NULL)
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=stdout;
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=GetMagicInfoList("*",&number_aliases,exception);
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_info == (const MagicInfo **) NULL)
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  path=(const char *) NULL;
597bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_aliases; i++)
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->stealth != MagickFalse)
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((path == (const char *) NULL) ||
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (LocaleCompare(path,magic_info[i]->path) != 0))
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info[i]->path != (char *) NULL)
605b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file,"\nPath: %s\n\n",magic_info[i]->path);
606b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleFile(file,"Name      Offset Target\n");
6071e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(file,
6081e604812fad85bb96f757a2393015ae3d061c39acristy          "-------------------------------------------------"
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "------------------------------\n");
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path=magic_info[i]->path;
612b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%s",magic_info[i]->name);
613bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++)
614b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file," ");
615b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%6ld ",(long) magic_info[i]->offset);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info[i]->target != (char *) NULL)
6171ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      {
618bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
6191ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          j;
6201ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
6211ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy        for (j=0; magic_info[i]->target[j] != '\0'; j++)
6221ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          if (isprint((int) ((unsigned char) magic_info[i]->target[j])) != 0)
623b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"%c",magic_info[i]->target[j]);
6241ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy          else
625b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(file,"\\%03o",(unsigned int)
62650931924c7fa18a0bedf56c584c4449dbc7e23b6cristy              ((unsigned char) magic_info[i]->target[j]));
6271ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      }
628b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"\n");
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fflush(file);
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(const MagicInfo **) RelinquishMagickMemory((void *) magic_info);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   L o a d M a g i c L i s t                                                 %
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LoadMagicList() loads the magic configuration file which provides a mapping
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  between magic attributes and a magic name.
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LoadMagicList method is:
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType LoadMagicList(const char *xml,const char *filename,
652bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        const size_t depth,ExceptionInfo *exception)
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6561ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o xml: The magic list in XML format.
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6581ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy%    o filename: The magic list filename.
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o depth: depth of <include /> statements.
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType LoadMagicList(const char *xml,const char *filename,
666bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t depth,ExceptionInfo *exception)
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    keyword[MaxTextExtent],
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *token;
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagicInfo
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magic_info;
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load the magic map file.
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "Loading magic configure file \"%s\" ...",filename);
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (xml == (char *) NULL)
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magic_list == (LinkedListInfo *) NULL)
689e3e77a19c40caafb77339e5a126c532bf2984c01cristy    {
690e3e77a19c40caafb77339e5a126c532bf2984c01cristy      magic_list=NewLinkedList(0);
691e3e77a19c40caafb77339e5a126c532bf2984c01cristy      if (magic_list == (LinkedListInfo *) NULL)
692e3e77a19c40caafb77339e5a126c532bf2984c01cristy        {
693e3e77a19c40caafb77339e5a126c532bf2984c01cristy          ThrowFileException(exception,ResourceLimitError,
694e3e77a19c40caafb77339e5a126c532bf2984c01cristy            "MemoryAllocationFailed",filename);
695e3e77a19c40caafb77339e5a126c532bf2984c01cristy          return(MagickFalse);
696e3e77a19c40caafb77339e5a126c532bf2984c01cristy        }
697e3e77a19c40caafb77339e5a126c532bf2984c01cristy    }
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magic_info=(MagicInfo *) NULL;
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=AcquireString(xml);
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=(char *) xml; *q != '\0'; )
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Interpret XML.
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token == '\0')
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CopyMagickString(keyword,token,MaxTextExtent);
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Doctype element.
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!--",4) == 0)
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Comment element.
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<include") == 0)
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Include element.
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(keyword,token,MaxTextExtent);
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*token != '=')
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GetMagickToken(q,&q,token);
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(keyword,"file") == 0)
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (depth > 200)
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ThrowMagickException(exception,GetMagickModule(),
744efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy                  ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  char
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    path[MaxTextExtent],
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *xml;
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  GetPathComponent(filename,HeadPath,path);
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*path != '\0')
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,DirectorySeparator,
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      MaxTextExtent);
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*token == *DirectorySeparator)
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) CopyMagickString(path,token,MaxTextExtent);
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,token,MaxTextExtent);
7593a5987c75c361dde2b38579f05ca961927d842fecristy                  xml=FileToString(path,~0UL,exception);
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (xml != (char *) NULL)
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      status=LoadMagicList(xml,path,depth+1,exception);
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      xml=(char *) RelinquishMagickMemory(xml);
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<magic") == 0)
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magic element.
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
77573bd4a51b419e914565bdf204bf1540dc4c8ee26cristy        magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magic_info == (MagicInfo *) NULL)
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->path=ConstantString(filename);
780e3e77a19c40caafb77339e5a126c532bf2984c01cristy        magic_info->exempt=MagickFalse;
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info->signature=MagickSignature;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magic_info == (MagicInfo *) NULL)
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"/>") == 0)
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=AppendValueToLinkedList(magic_list,magic_info);
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ThrowMagickException(exception,GetMagickModule(),
791efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy            ResourceLimitError,"MemoryAllocationFailed","`%s'",
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name);
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magic_info=(MagicInfo *) NULL;
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,(const char **) NULL,token);
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token != '=')
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetMagickToken(q,&q,token);
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*keyword)
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'N':
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"name") == 0)
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->name=ConstantString(token);
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'O':
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'o':
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"offset") == 0)
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
817f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy            magic_info->offset=(MagickOffsetType) StringToLong(token);
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'S':
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 's':
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"stealth") == 0)
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8276f2013165d72f7d8ef5f66bb9453126d88113809anthony            magic_info->stealth=IsStringTrue(token);
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'T':
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 't':
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"target") == 0)
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            char
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register unsigned char
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q;
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            size_t
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length;
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=strlen(token);
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->target=ConstantString(token);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magic_info->magic=(unsigned char *) ConstantString(token);
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=magic_info->magic;
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=magic_info->target; *p != '\0'; )
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (*p == '\\')
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (isdigit((int) ((unsigned char) *p)) != 0)
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      char
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *end;
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=(unsigned char) strtol(p,&end,8);
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      p+=(end-p);
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      magic_info->length++;
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  switch (*p)
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'b': *q='\b'; break;
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'f': *q='\f'; break;
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'n': *q='\n'; break;
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'r': *q='\r'; break;
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 't': *q='\t'; break;
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'v': *q='\v'; break;
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case 'a': *q='a'; break;
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    case '?': *q='\?'; break;
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    default: *q=(unsigned char) (*p); break;
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  p++;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  magic_info->length++;
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  continue;
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleNCompare(p,"&amp;",5) == 0)
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(p+1,p+5,length-magic_info->length);
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) (*p++);
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magic_info->length++;
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=(char *) RelinquishMagickMemory(token);
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L o a d M a g i c L i s t s                                                %
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LoadMagicLists() loads one or more magic configuration file which provides a
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  mapping between magic attributes and a magic name.
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LoadMagicLists method is:
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType LoadMagicLists(const char *filename,
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the font file name.
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType LoadMagicLists(const char *filename,
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path[MaxTextExtent];
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *option;
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LinkedListInfo
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *options;
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickStatusType
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
94254a531d335ea060a99bead94dcdf45f18496fa83cristy    i;
9431ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
9441ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  /*
945398fd02612ac738cc5c950c0e5df20a6db3db001cristy    Load external magic map.
9461ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  */
9471ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  if (magic_list == (LinkedListInfo *) NULL)
948e3e77a19c40caafb77339e5a126c532bf2984c01cristy    {
949e3e77a19c40caafb77339e5a126c532bf2984c01cristy      magic_list=NewLinkedList(0);
950e3e77a19c40caafb77339e5a126c532bf2984c01cristy      if (magic_list == (LinkedListInfo *) NULL)
951e3e77a19c40caafb77339e5a126c532bf2984c01cristy        {
952e3e77a19c40caafb77339e5a126c532bf2984c01cristy          ThrowFileException(exception,ResourceLimitError,
953e3e77a19c40caafb77339e5a126c532bf2984c01cristy            "MemoryAllocationFailed",filename);
954e3e77a19c40caafb77339e5a126c532bf2984c01cristy          return(MagickFalse);
955e3e77a19c40caafb77339e5a126c532bf2984c01cristy        }
956e3e77a19c40caafb77339e5a126c532bf2984c01cristy    }
957398fd02612ac738cc5c950c0e5df20a6db3db001cristy  status=MagickTrue;
958398fd02612ac738cc5c950c0e5df20a6db3db001cristy  *path='\0';
959398fd02612ac738cc5c950c0e5df20a6db3db001cristy  options=GetConfigureOptions(filename,exception);
960398fd02612ac738cc5c950c0e5df20a6db3db001cristy  option=(const StringInfo *) GetNextValueInLinkedList(options);
961398fd02612ac738cc5c950c0e5df20a6db3db001cristy  while (option != (const StringInfo *) NULL)
962398fd02612ac738cc5c950c0e5df20a6db3db001cristy  {
963398fd02612ac738cc5c950c0e5df20a6db3db001cristy    (void) CopyMagickString(path,GetStringInfoPath(option),MaxTextExtent);
964aae13f6e1a9764f28b4f2e8d03ad4ac7f616f2a3cristy    status&=LoadMagicList((const char *) GetStringInfoDatum(option),
965398fd02612ac738cc5c950c0e5df20a6db3db001cristy      GetStringInfoPath(option),0,exception);
966398fd02612ac738cc5c950c0e5df20a6db3db001cristy    option=(const StringInfo *) GetNextValueInLinkedList(options);
967398fd02612ac738cc5c950c0e5df20a6db3db001cristy  }
968398fd02612ac738cc5c950c0e5df20a6db3db001cristy  options=DestroyConfigureOptions(options);
969398fd02612ac738cc5c950c0e5df20a6db3db001cristy  /*
970398fd02612ac738cc5c950c0e5df20a6db3db001cristy    Load built-in magic map.
971398fd02612ac738cc5c950c0e5df20a6db3db001cristy  */
972bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) (sizeof(MagicMap)/sizeof(*MagicMap)); i++)
9731ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  {
9741ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    MagicInfo
9751ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      *magic_info;
9761ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy
97754a531d335ea060a99bead94dcdf45f18496fa83cristy    register const MagicMapInfo
97854a531d335ea060a99bead94dcdf45f18496fa83cristy      *p;
97954a531d335ea060a99bead94dcdf45f18496fa83cristy
98054a531d335ea060a99bead94dcdf45f18496fa83cristy    p=MagicMap+i;
98173bd4a51b419e914565bdf204bf1540dc4c8ee26cristy    magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info));
9821ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    if (magic_info == (MagicInfo *) NULL)
983e3e77a19c40caafb77339e5a126c532bf2984c01cristy      {
984e3e77a19c40caafb77339e5a126c532bf2984c01cristy        (void) ThrowMagickException(exception,GetMagickModule(),
985efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name);
986e3e77a19c40caafb77339e5a126c532bf2984c01cristy        continue;
987e3e77a19c40caafb77339e5a126c532bf2984c01cristy      }
9881ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info));
98938b8ed92fb9be72aee9b1bb4f378a251259f0c87cristy    magic_info->path=(char *) "[built-in]";
9901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->name=(char *) p->name;
9911ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->offset=p->offset;
9921ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->target=(char *) p->magic;
993e3e77a19c40caafb77339e5a126c532bf2984c01cristy    magic_info->magic=(unsigned char *) p->magic;
9941ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->length=p->length;
9951ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->exempt=MagickTrue;
9961ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    magic_info->signature=MagickSignature;
997aae13f6e1a9764f28b4f2e8d03ad4ac7f616f2a3cristy    status&=AppendValueToLinkedList(magic_list,magic_info);
9981ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy    if (status == MagickFalse)
9991ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy      (void) ThrowMagickException(exception,GetMagickModule(),
1000efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name);
10011ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy  }
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status != 0 ? MagickTrue : MagickFalse);
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1004f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1005f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1006f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1007f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1008f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1009f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1010f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t G e n e s i s                                 %
1011f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1012f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1013f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1014f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1015f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1016f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentGenesis() instantiates the magic component.
1017f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1018f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentGenesis method is:
1019f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1020f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagickBooleanType MagicComponentGenesis(void)
1021f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1022f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
10235ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType MagicComponentGenesis(void)
1024f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1025165b609d7e344c03f8324506c4337beff451748ecristy  AcquireSemaphoreInfo(&magic_semaphore);
1026f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return(MagickTrue);
1027f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1028f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1029f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1030f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1031f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1032f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1033f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1034f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   M a g i c C o m p o n e n t T e r m i n u s                               %
1035f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1036f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1037f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1038f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1039f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1040f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  MagicComponentTerminus() destroys the magic component.
1041f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1042f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the MagicComponentTerminus method is:
1043f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1044f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagicComponentTerminus(void)
1045f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1046f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
1047f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1048f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyMagicElement(void *magic_info)
1049f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1050f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  register MagicInfo
1051f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    *p;
1052f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1053f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) magic_info;
1054f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (p->exempt == MagickFalse)
1055f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    {
1056f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->path != (char *) NULL)
1057f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->path=DestroyString(p->path);
1058f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->name != (char *) NULL)
1059f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->name=DestroyString(p->name);
1060f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->target != (char *) NULL)
1061f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->target=DestroyString(p->target);
1062f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      if (p->magic != (unsigned char *) NULL)
1063f34a145c545cb86152ad42a787f6d5fffea6b77ccristy        p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
1064f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    }
1065f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(MagicInfo *) RelinquishMagickMemory(p);
1066f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return((void *) NULL);
1067f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1068f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
10695ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void MagicComponentTerminus(void)
1070f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
107118b17443128598500357da7bff2f01683cf32890cristy  if (magic_semaphore == (SemaphoreInfo *) NULL)
107218b17443128598500357da7bff2f01683cf32890cristy    AcquireSemaphoreInfo(&magic_semaphore);
1073f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(magic_semaphore);
1074f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (magic_list != (LinkedListInfo *) NULL)
1075f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    magic_list=DestroyLinkedList(magic_list,DestroyMagicElement);
1076f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  instantiate_magic=MagickFalse;
1077f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(magic_semaphore);
1078f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  DestroySemaphoreInfo(&magic_semaphore);
1079f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1080