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