13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5b18607552dde4e1f317f73f6e0f1b4043a76728acristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M AAA GGGG IIIII CCCC % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MM MM A A G I C % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M M AAAAA G GGG I C % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M A A G G I C % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M A A GGGG IIIII CCCC % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickCore Image Magic Methods % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Bob Friesenhahn % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% July 2000 % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% dedicated to making software imaging solutions freely available. % 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% You may not use this file except in compliance with the License. You may % 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% obtain a copy of the License at % 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% http://www.imagemagick.org/script/license.php % 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Unless required by applicable law or agreed to in writing, software % 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% distributed under the License is distributed on an "AS IS" BASIS, % 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% See the License for the specific language governing permissions and % 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% limitations under the License. % 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h" 434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h" 444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/client.h" 454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/configure.h" 469639ba36e05b3e2fe85c8d9097b9ad8aa2c0e5eecristy#include "MagickCore/configure-private.h" 474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h" 484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h" 49abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.h" 504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magic.h" 515ff4eaf57b3cd47d0371f204f865cbba614674a0cristy#include "MagickCore/magic-private.h" 524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h" 534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h" 544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h" 554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h" 564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/token.h" 574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h" 58d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h" 594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xml-tree.h" 603291f51a77fdd817efb58d652c78c407cbfdf7d1cristy#include "MagickCore/xml-tree-private.h" 613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Define declarations. 643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MagicFilename "magic.xml" 664f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy#define MagicPattern(magic) (const unsigned char *) (magic), sizeof(magic)-1 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6954a531d335ea060a99bead94dcdf45f18496fa83cristy Typedef declarations. 703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 711ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristytypedef struct _MagicMapInfo 721ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy{ 731ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy const char 741ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy *name; 751ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy 76e3e77a19c40caafb77339e5a126c532bf2984c01cristy const MagickOffsetType 77e3e77a19c40caafb77339e5a126c532bf2984c01cristy offset; 78e3e77a19c40caafb77339e5a126c532bf2984c01cristy 79bcdce3d1a5a9b3b62b403a651a15313b8ddb8654cristy const unsigned char 801ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy *magic; 811ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy 82e3e77a19c40caafb77339e5a126c532bf2984c01cristy const size_t 831ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy length; 841ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy} MagicMapInfo; 8554a531d335ea060a99bead94dcdf45f18496fa83cristy 8654a531d335ea060a99bead94dcdf45f18496fa83cristy/* 8754a531d335ea060a99bead94dcdf45f18496fa83cristy Static declarations. 8854a531d335ea060a99bead94dcdf45f18496fa83cristy*/ 891ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristystatic const MagicMapInfo 901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy MagicMap[] = 911ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy { 924f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "8BIMWTEXT", 0, MagicPattern("8\000B\000I\000M\000#") }, 934f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "8BIMTEXT", 0, MagicPattern("8BIM#") }, 944f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "8BIM", 0, MagicPattern("8BIM") }, 954f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("BA") }, 964f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("BM") }, 974f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("CI") }, 984f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("CP") }, 994f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("IC") }, 1004f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PICT", 0, MagicPattern("PICT") }, 1014f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "BMP", 0, MagicPattern("PI") }, 1024f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CALS", 21, MagicPattern("version: MIL-STD-1840") }, 1034f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CALS", 0, MagicPattern("srcdocid:") }, 1044f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CALS", 9, MagicPattern("srcdocid:") }, 1054f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CALS", 8, MagicPattern("rorient:") }, 1064f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CGM", 0, MagicPattern("BEGMF") }, 1074f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CIN", 0, MagicPattern("\200\052\137\327") }, 1084f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "CRW", 0, MagicPattern("II\x1a\x00\x00\x00HEAPCCDR") }, 1094f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DCM", 128, MagicPattern("DICM") }, 1104f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DCX", 0, MagicPattern("\261\150\336\72") }, 1114f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DIB", 0, MagicPattern("\050\000") }, 1124f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DDS", 0, MagicPattern("DDS ") }, 1134f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DJVU", 0, MagicPattern("AT&TFORM") }, 1144f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DOT", 0, MagicPattern("digraph") }, 1154f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DPX", 0, MagicPattern("SDPX") }, 1164f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "DPX", 0, MagicPattern("XPDS") }, 1174f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "EMF", 40, MagicPattern("\040\105\115\106\000\000\001\000") }, 1184f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "EPT", 0, MagicPattern("\305\320\323\306") }, 1194f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "EXR", 0, MagicPattern("\166\057\061\001") }, 1204f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "FAX", 0, MagicPattern("DFAX") }, 1214f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "FIG", 0, MagicPattern("#FIG") }, 1224f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "FITS", 0, MagicPattern("IT0") }, 1234f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "FITS", 0, MagicPattern("SIMPLE") }, 1248c9d68ca4241b6faafa7a35658a125c3500a5edfJon Sneyers { "FLIF", 0, MagicPattern("FLIF") }, 1254f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "GIF", 0, MagicPattern("GIF8") }, 1264f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "GPLT", 0, MagicPattern("#!/usr/local/bin/gnuplot") }, 1274f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HDF", 1, MagicPattern("HDF") }, 1284f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HDR", 0, MagicPattern("#?RADIANCE") }, 1294f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HDR", 0, MagicPattern("#?RGBE") }, 1304f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HPGL", 0, MagicPattern("IN;") }, 1314f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HTML", 1, MagicPattern("HTML") }, 1324f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "HTML", 1, MagicPattern("html") }, 1334f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "ILBM", 8, MagicPattern("ILBM") }, 1344f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "IPTCWTEXT", 0, MagicPattern("\062\000#\000\060\000=\000\042\000&\000#\000\060\000;\000&\000#\000\062\000;\000\042\000") }, 1354f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "IPTCTEXT", 0, MagicPattern("2#0=\042�\042") }, 1364f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "IPTC", 0, MagicPattern("\034\002") }, 1374f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "JNG", 0, MagicPattern("\213JNG\r\n\032\n") }, 1384f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "JPEG", 0, MagicPattern("\377\330\377") }, 1394f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "J2K", 0, MagicPattern("\xff\x4f\xff\x51") }, 1404f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "JPC", 0, MagicPattern("\x0d\x0a\x87\x0a") }, 141dbdf015f56500da4e142a35141dcf9e77137eccfdirk { "JP2", 0, MagicPattern("\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a") }, 1424f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MAT", 0, MagicPattern("MATLAB 5.0 MAT-file,") }, 1434f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MIFF", 0, MagicPattern("Id=ImageMagick") }, 1444f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MIFF", 0, MagicPattern("id=ImageMagick") }, 1454f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MNG", 0, MagicPattern("\212MNG\r\n\032\n") }, 1464f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MPC", 0, MagicPattern("id=MagickCache") }, 1474f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MPEG", 0, MagicPattern("\000\000\001\263") }, 1484f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "MRW", 0, MagicPattern("\x00MRM") }, 1494f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "ORF", 0, MagicPattern("IIRO\x08\x00\x00\x00") }, 1504f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PCD", 2048, MagicPattern("PCD_") }, 1514f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PCL", 0, MagicPattern("\033E\033") }, 1524f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PCX", 0, MagicPattern("\012\002") }, 1534f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PCX", 0, MagicPattern("\012\005") }, 1544f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PDB", 60, MagicPattern("vIMGView") }, 1554f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PDF", 0, MagicPattern("%PDF-") }, 1564f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PES", 0, MagicPattern("#PES") }, 1574f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PFA", 0, MagicPattern("%!PS-AdobeFont-1.0") }, 1584f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PFB", 6, MagicPattern("%!PS-AdobeFont-1.0") }, 1594f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PGX", 0, MagicPattern("\050\107\020\115\046") }, 1604f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PICT", 522, MagicPattern("\000\021\002\377\014\000") }, 1614f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PNG", 0, MagicPattern("\211PNG\r\n\032\n") }, 1624f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PBM", 0, MagicPattern("P1") }, 1634f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PGM", 0, MagicPattern("P2") }, 1644f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PPM", 0, MagicPattern("P3") }, 1654f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PBM", 0, MagicPattern("P4") }, 1664f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PGM", 0, MagicPattern("P5") }, 1674f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PPM", 0, MagicPattern("P6") }, 1684f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PAM", 0, MagicPattern("P7") }, 1694f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PFM", 0, MagicPattern("PF") }, 1704f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PFM", 0, MagicPattern("Pf") }, 1714f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PS", 0, MagicPattern("%!") }, 1724f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PS", 0, MagicPattern("\004%!") }, 1734f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PS", 0, MagicPattern("\305\320\323\306") }, 1744f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PSB", 0, MagicPattern("8BPB") }, 1754f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PSD", 0, MagicPattern("8BPS") }, 1764f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "PWP", 0, MagicPattern("SFW95") }, 1774f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "RAF", 0, MagicPattern("FUJIFILMCCD-RAW ") }, 1784f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "RLE", 0, MagicPattern("\122\314") }, 1794f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SCT", 0, MagicPattern("CT") }, 1804f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SFW", 0, MagicPattern("SFW94") }, 1814f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SGI", 0, MagicPattern("\001\332") }, 1824f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SUN", 0, MagicPattern("\131\246\152\225") }, 1834f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SVG", 1, MagicPattern("?XML") }, 1844f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "SVG", 1, MagicPattern("?xml") }, 1854f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TIFF", 0, MagicPattern("\115\115\000\052") }, 1864f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TIFF", 0, MagicPattern("\111\111\052\000") }, 1874f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TIFF64", 0, MagicPattern("\115\115\000\053\000\010\000\000") }, 1884f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TIFF64", 0, MagicPattern("\111\111\053\000\010\000\000\000") }, 1894f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TTF", 0, MagicPattern("\000\001\000\000\000") }, 1904f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "TXT", 0, MagicPattern("# ImageMagick pixel enumeration:") }, 1914f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "VICAR", 0, MagicPattern("LBLSIZE") }, 1924f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "VICAR", 0, MagicPattern("NJPL1I") }, 1934f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "VIFF", 0, MagicPattern("\253\001") }, 1944f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "WEBP", 8, MagicPattern("WEBP") }, 1954f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "WMF", 0, MagicPattern("\327\315\306\232") }, 1964f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "WMF", 0, MagicPattern("\001\000\011\000") }, 1974f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "WPG", 0, MagicPattern("\377WPC") }, 1984f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XBM", 0, MagicPattern("#define") }, 1994f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XCF", 0, MagicPattern("gimp xcf") }, 2004f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XEF", 0, MagicPattern("FOVb") }, 2014f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XPM", 1, MagicPattern("* XPM *") }, 2024f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XWD", 4, MagicPattern("\007\000\000") }, 2034f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy { "XWD", 5, MagicPattern("\000\000\007") } 2041ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy }; 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LinkedListInfo 20786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy *magic_cache = (LinkedListInfo *) NULL; 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo 2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *magic_semaphore = (SemaphoreInfo *) NULL; 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 21686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy IsMagicCacheInstantiated(ExceptionInfo *), 217cd2cd1803dda951bcfff101c44032ae17e52655fcristy LoadMagicCache(LinkedListInfo *,const char *,const char *,const size_t, 218cd2cd1803dda951bcfff101c44032ae17e52655fcristy ExceptionInfo *); 21986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 22086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy/* 22186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% A c q u i r e M a g i c L i s t s % 22686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% % 22986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 23186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% AcquireMagicCache() caches one or more magic configurations which provides a 23286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% mapping between magic attributes and a magic name. 23386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 23486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% The format of the AcquireMagicCache method is: 23586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 23686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% LinkedListInfo *AcquireMagicCache(const char *filename, 23786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% ExceptionInfo *exception) 23886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 23986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% A description of each parameter follows: 24086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 24186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% o filename: the font file name. 24286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 24386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% o exception: return any errors or warnings in this structure. 24486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% 24586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy*/ 2468f6816192b5724ef97553a83c73843009e0d70a6dirkstatic int CompareMagickInfoSize(const void *a,const void *b) 2478f6816192b5724ef97553a83c73843009e0d70a6dirk{ 2488f6816192b5724ef97553a83c73843009e0d70a6dirk MagicInfo 2498f6816192b5724ef97553a83c73843009e0d70a6dirk *ma, 2508f6816192b5724ef97553a83c73843009e0d70a6dirk *mb; 2518f6816192b5724ef97553a83c73843009e0d70a6dirk 252f2cec1fc8a3a99cf598c29b9e07c1fbfe4ec0fbfcristy ma=(MagicInfo *) a; 253f2cec1fc8a3a99cf598c29b9e07c1fbfe4ec0fbfcristy mb=(MagicInfo *) b; 2543d107317003ecc3229d3555e905453330e340410dirk 2553d107317003ecc3229d3555e905453330e340410dirk if (ma->offset != mb->offset) 2563d107317003ecc3229d3555e905453330e340410dirk return((int) (ma->offset-mb->offset)); 2573d107317003ecc3229d3555e905453330e340410dirk 2583d107317003ecc3229d3555e905453330e340410dirk return((int) (mb->length-ma->length)); 2598f6816192b5724ef97553a83c73843009e0d70a6dirk} 2608f6816192b5724ef97553a83c73843009e0d70a6dirk 26186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic LinkedListInfo *AcquireMagicCache(const char *filename, 26286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ExceptionInfo *exception) 26386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy{ 26486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy LinkedListInfo 265b18d864b3f06e9272582b7736230d934d715d542dirk *cache; 26686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 26786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy MagickStatusType 26886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy status; 26986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 27086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy register ssize_t 27186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy i; 27286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 27386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy /* 27486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy Load external magic map. 27586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy */ 276b18d864b3f06e9272582b7736230d934d715d542dirk cache=NewLinkedList(0); 277b18d864b3f06e9272582b7736230d934d715d542dirk if (cache == (LinkedListInfo *) NULL) 27886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 27986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy status=MagickTrue; 280b18d864b3f06e9272582b7736230d934d715d542dirk#if !defined(MAGICKCORE_ZERO_CONFIGURATION_SUPPORT) 28186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy { 282b18d864b3f06e9272582b7736230d934d715d542dirk char 283b18d864b3f06e9272582b7736230d934d715d542dirk path[MagickPathExtent]; 284b18d864b3f06e9272582b7736230d934d715d542dirk 285b18d864b3f06e9272582b7736230d934d715d542dirk const StringInfo 286b18d864b3f06e9272582b7736230d934d715d542dirk *option; 287b18d864b3f06e9272582b7736230d934d715d542dirk 288b18d864b3f06e9272582b7736230d934d715d542dirk LinkedListInfo 289b18d864b3f06e9272582b7736230d934d715d542dirk *options; 290b18d864b3f06e9272582b7736230d934d715d542dirk 291b18d864b3f06e9272582b7736230d934d715d542dirk *path='\0'; 292b18d864b3f06e9272582b7736230d934d715d542dirk options=GetConfigureOptions(filename,exception); 29386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy option=(const StringInfo *) GetNextValueInLinkedList(options); 294b18d864b3f06e9272582b7736230d934d715d542dirk while (option != (const StringInfo *) NULL) 295b18d864b3f06e9272582b7736230d934d715d542dirk { 296b18d864b3f06e9272582b7736230d934d715d542dirk (void) CopyMagickString(path,GetStringInfoPath(option),MagickPathExtent); 297b18d864b3f06e9272582b7736230d934d715d542dirk status&=LoadMagicCache(cache,(const char *) 298b18d864b3f06e9272582b7736230d934d715d542dirk GetStringInfoDatum(option),GetStringInfoPath(option),0,exception); 299b18d864b3f06e9272582b7736230d934d715d542dirk option=(const StringInfo *) GetNextValueInLinkedList(options); 300b18d864b3f06e9272582b7736230d934d715d542dirk } 301b18d864b3f06e9272582b7736230d934d715d542dirk options=DestroyConfigureOptions(options); 30286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy } 303b18d864b3f06e9272582b7736230d934d715d542dirk#endif 30486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy /* 30586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy Load built-in magic map. 30686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy */ 30786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy for (i=0; i < (ssize_t) (sizeof(MagicMap)/sizeof(*MagicMap)); i++) 30886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy { 30986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy MagicInfo 31086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy *magic_info; 31186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 31286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy register const MagicMapInfo 31386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy *p; 31486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy 31586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=MagicMap+i; 31686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info)); 31786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (magic_info == (MagicInfo *) NULL) 31886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy { 31986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy (void) ThrowMagickException(exception,GetMagickModule(), 32086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ResourceLimitError,"MemoryAllocationFailed","`%s'",p->name); 32186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy continue; 32286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy } 32386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info)); 32486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->path=(char *) "[built-in]"; 32586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->name=(char *) p->name; 32686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->offset=p->offset; 32786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->target=(char *) p->magic; 32886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->magic=(unsigned char *) p->magic; 32986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->length=p->length; 33086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_info->exempt=MagickTrue; 331e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy magic_info->signature=MagickCoreSignature; 332b18d864b3f06e9272582b7736230d934d715d542dirk status&=InsertValueInSortedLinkedList(cache,CompareMagickInfoSize, 3338f6816192b5724ef97553a83c73843009e0d70a6dirk NULL,magic_info); 33486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (status == MagickFalse) 33586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy (void) ThrowMagickException(exception,GetMagickModule(), 33686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ResourceLimitError,"MemoryAllocationFailed","`%s'",magic_info->name); 33786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy } 338b18d864b3f06e9272582b7736230d934d715d542dirk return(cache); 33986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy} 3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3468f6816192b5724ef97553a83c73843009e0d70a6dirk% G e t M a g i c I n f o % 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% GetMagicInfo() searches the magic list for the specified name and if found 3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% returns attributes for that magic. 3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the GetMagicInfo method is: 3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const MagicInfo *GetMagicInfo(const unsigned char *magic, 3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const size_t length,ExceptionInfo *exception) 3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magic: A binary string generally representing the first few characters 3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of the image file or blob. 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: the length of the binary signature. 3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo *GetMagicInfo(const unsigned char *magic, 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const size_t length,ExceptionInfo *exception) 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const MagicInfo 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 37786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (IsMagicCacheInstantiated(exception) == MagickFalse) 3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((const MagicInfo *) NULL); 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Search for magic tag. 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 382f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(magic_semaphore); 38386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ResetLinkedListIterator(magic_cache); 38486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 38549d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy if (magic == (const unsigned char *) NULL) 38649d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy { 38749d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy UnlockSemaphoreInfo(magic_semaphore); 38849d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy return(p); 38949d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy } 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (p != (const MagicInfo *) NULL) 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(p->offset >= 0); 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (((size_t) (p->offset+p->length) <= length) && 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (memcmp(magic+p->offset,p->magic,p->length) == 0)) 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 39686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p != (const MagicInfo *) NULL) 39986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy (void) InsertValueInLinkedList(magic_cache,0, 40086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy RemoveElementByValueFromLinkedList(magic_cache,p)); 401f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(magic_semaphore); 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(p); 4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4048f6816192b5724ef97553a83c73843009e0d70a6dirk 4058f6816192b5724ef97553a83c73843009e0d70a6dirk/* 4068f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4078f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4088f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4098f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4104f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy% G e t M a g i c P a t t e r n E x t e n t % 4118f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4128f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4138f6816192b5724ef97553a83c73843009e0d70a6dirk% % 4148f6816192b5724ef97553a83c73843009e0d70a6dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4158f6816192b5724ef97553a83c73843009e0d70a6dirk% 4164f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy% GetMagicPatternExtent() returns the the extent of the buffer that is 4174f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy% required to check all the MagickInfos. It returns zero if the list is empty. 4188f6816192b5724ef97553a83c73843009e0d70a6dirk% 4194f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy% The format of the GetMagicPatternExtent method is: 4208f6816192b5724ef97553a83c73843009e0d70a6dirk% 4214f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy% size_t GetMagicPatternExtent(ExceptionInfo *exception) 4228f6816192b5724ef97553a83c73843009e0d70a6dirk% 4238f6816192b5724ef97553a83c73843009e0d70a6dirk% A description of each parameter follows: 4248f6816192b5724ef97553a83c73843009e0d70a6dirk% 4258f6816192b5724ef97553a83c73843009e0d70a6dirk% o exception: return any errors or warnings in this structure. 4268f6816192b5724ef97553a83c73843009e0d70a6dirk% 4278f6816192b5724ef97553a83c73843009e0d70a6dirk*/ 4284f06b88c0fc466d4b21f3b0402da54c27ec3678bcristyMagickExport size_t GetMagicPatternExtent(ExceptionInfo *exception) 4298f6816192b5724ef97553a83c73843009e0d70a6dirk{ 4308f6816192b5724ef97553a83c73843009e0d70a6dirk register const MagicInfo 4318f6816192b5724ef97553a83c73843009e0d70a6dirk *p; 4328f6816192b5724ef97553a83c73843009e0d70a6dirk 4330feae42113cd2ea6dbf799bb13f1525b27004ca4dirk size_t 4340feae42113cd2ea6dbf799bb13f1525b27004ca4dirk magickSize, 4350feae42113cd2ea6dbf799bb13f1525b27004ca4dirk max; 4360feae42113cd2ea6dbf799bb13f1525b27004ca4dirk 4378f6816192b5724ef97553a83c73843009e0d70a6dirk static size_t 4380feae42113cd2ea6dbf799bb13f1525b27004ca4dirk size=0; 4398f6816192b5724ef97553a83c73843009e0d70a6dirk 4408f6816192b5724ef97553a83c73843009e0d70a6dirk assert(exception != (ExceptionInfo *) NULL); 4414f06b88c0fc466d4b21f3b0402da54c27ec3678bcristy if ((size != 0) || (IsMagicCacheInstantiated(exception) == MagickFalse)) 4428f6816192b5724ef97553a83c73843009e0d70a6dirk return(size); 4438f6816192b5724ef97553a83c73843009e0d70a6dirk LockSemaphoreInfo(magic_semaphore); 4448f6816192b5724ef97553a83c73843009e0d70a6dirk ResetLinkedListIterator(magic_cache); 4450feae42113cd2ea6dbf799bb13f1525b27004ca4dirk max=0; 4468f6816192b5724ef97553a83c73843009e0d70a6dirk p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 4470feae42113cd2ea6dbf799bb13f1525b27004ca4dirk while (p != (const MagicInfo *) NULL) 4480feae42113cd2ea6dbf799bb13f1525b27004ca4dirk { 4490feae42113cd2ea6dbf799bb13f1525b27004ca4dirk magickSize=(size_t) (p->offset+p->length); 4500feae42113cd2ea6dbf799bb13f1525b27004ca4dirk if (magickSize > max) 4510feae42113cd2ea6dbf799bb13f1525b27004ca4dirk max=magickSize; 4520feae42113cd2ea6dbf799bb13f1525b27004ca4dirk p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 4530feae42113cd2ea6dbf799bb13f1525b27004ca4dirk } 4540feae42113cd2ea6dbf799bb13f1525b27004ca4dirk size=max; 4558f6816192b5724ef97553a83c73843009e0d70a6dirk UnlockSemaphoreInfo(magic_semaphore); 4568f6816192b5724ef97553a83c73843009e0d70a6dirk return(size); 4578f6816192b5724ef97553a83c73843009e0d70a6dirk} 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% G e t M a g i c I n f o L i s t % 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% GetMagicInfoList() returns any image aliases that match the specified 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pattern. 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The magic of the GetMagicInfoList function is: 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const MagicInfo **GetMagicInfoList(const char *pattern, 476bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *number_aliases,ExceptionInfo *exception) 4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pattern: Specifies a pointer to a text string containing a pattern. 4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 482fc0d11253eb3463ad662f939e6decda188870bbfcristy% o number_aliases: This integer returns the number of aliases in the list. 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicInfoCompare(const void *x,const void *y) 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const MagicInfo 4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **p, 4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **q; 4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=(const MagicInfo **) x, 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=(const MagicInfo **) y; 5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare((*p)->path,(*q)->path) == 0) 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(LocaleCompare((*p)->name,(*q)->name)); 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(LocaleCompare((*p)->path,(*q)->path)); 5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const MagicInfo **GetMagicInfoList(const char *pattern, 510bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t *number_aliases,ExceptionInfo *exception) 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const MagicInfo 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **aliases; 5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const MagicInfo 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 518bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate magic list. 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(pattern != (char *) NULL); 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); 526bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(number_aliases != (size_t *) NULL); 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *number_aliases=0; 5281ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy p=GetMagicInfo((const unsigned char *) NULL,0,exception); 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const MagicInfo *) NULL) 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((const MagicInfo **) NULL); 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases=(const MagicInfo **) AcquireQuantumMemory((size_t) 53286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases)); 5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (aliases == (const MagicInfo **) NULL) 5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((const MagicInfo **) NULL); 5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generate magic list. 5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 538f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(magic_semaphore); 53986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ResetLinkedListIterator(magic_cache); 54086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; p != (const MagicInfo *) NULL; ) 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((p->stealth == MagickFalse) && 5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) 5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases[i++]=p; 54686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 548f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(magic_semaphore); 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicInfoCompare); 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases[i]=(MagicInfo *) NULL; 551bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy *number_aliases=(size_t) i; 5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(aliases); 5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% G e t M a g i c L i s t % 5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% GetMagicList() returns any image format aliases that match the specified 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pattern. 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the GetMagicList function is: 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 571bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% char **GetMagicList(const char *pattern,size_t *number_aliases, 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pattern: Specifies a pointer to a text string containing a pattern. 5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o number_aliases: This integer returns the number of image format aliases 5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% in the list. 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int MagicCompare(const void *x,const void *y) 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const char 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p, 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=(const char *) x; 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=(const char *) y; 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(LocaleCompare(p,q)); 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 604a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristyMagickExport char **GetMagicList(const char *pattern,size_t *number_aliases, 605a70ba6a0ec1de7c37f01dcdf306ec236399aec02cristy ExceptionInfo *exception) 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **aliases; 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const MagicInfo 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 613bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate configure list. 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(pattern != (char *) NULL); 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); 621bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(number_aliases != (size_t *) NULL); 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *number_aliases=0; 6231ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy p=GetMagicInfo((const unsigned char *) NULL,0,exception); 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const MagicInfo *) NULL) 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((char **) NULL); 6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases=(char **) AcquireQuantumMemory((size_t) 62786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy GetNumberOfElementsInLinkedList(magic_cache)+1UL,sizeof(*aliases)); 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (aliases == (char **) NULL) 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((char **) NULL); 630f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(magic_semaphore); 63186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ResetLinkedListIterator(magic_cache); 63286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; p != (const MagicInfo *) NULL; ) 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((p->stealth == MagickFalse) && 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases[i++]=ConstantString(p->name); 63886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy p=(const MagicInfo *) GetNextValueInLinkedList(magic_cache); 6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 640f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(magic_semaphore); 6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy qsort((void *) aliases,(size_t) i,sizeof(*aliases),MagicCompare); 6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aliases[i]=(char *) NULL; 643bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy *number_aliases=(size_t) i; 6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(aliases); 6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% G e t M a g i c N a m e % 6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% GetMagicName() returns the name associated with the magic. 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the GetMagicName method is: 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *GetMagicName(const MagicInfo *magic_info) 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magic_info: The magic info. 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetMagicName(const MagicInfo *magic_info) 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(magic_info != (MagicInfo *) NULL); 673e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(magic_info->signature == MagickCoreSignature); 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(magic_info->name); 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 68286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy+ I s M a g i c C a c h e I n s t a n t i a t e d % 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 68886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% IsMagicCacheInstantiated() determines if the magic list is instantiated. 689904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy% If not, it instantiates the list and returns it. 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 691904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy% The format of the IsMagicInstantiated method is: 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 69386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception) 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 70086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic MagickBooleanType IsMagicCacheInstantiated(ExceptionInfo *exception) 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 70286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (magic_cache == (LinkedListInfo *) NULL) 70386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy { 70486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (magic_semaphore == (SemaphoreInfo *) NULL) 70586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy ActivateSemaphoreInfo(&magic_semaphore); 70686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy LockSemaphoreInfo(magic_semaphore); 70786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (magic_cache == (LinkedListInfo *) NULL) 70886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_cache=AcquireMagicCache(MagicFilename,exception); 70986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy UnlockSemaphoreInfo(magic_semaphore); 71086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy } 71186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy return(magic_cache != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse); 71241c3c77d6f4e3131bf2be0b35277c086b69ce492cristy} 71341c3c77d6f4e3131bf2be0b35277c086b69ce492cristy 71441c3c77d6f4e3131bf2be0b35277c086b69ce492cristy/* 71541c3c77d6f4e3131bf2be0b35277c086b69ce492cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 71641c3c77d6f4e3131bf2be0b35277c086b69ce492cristy% % 71741c3c77d6f4e3131bf2be0b35277c086b69ce492cristy% % 71841c3c77d6f4e3131bf2be0b35277c086b69ce492cristy% % 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% L i s t M a g i c I n f o % 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ListMagicInfo() lists the magic info to a file. 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ListMagicInfo method is: 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType ListMagicInfo(FILE *file,ExceptionInfo *exception) 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o file: An pointer to a FILE. 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListMagicInfo(FILE *file, 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo *exception) 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *path; 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const MagicInfo 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **magic_info; 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 747bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 750bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_aliases; 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7539d314ff2c17a77996c05413c2013880387e50f0ecristy ssize_t 7549d314ff2c17a77996c05413c2013880387e50f0ecristy j; 7559d314ff2c17a77996c05413c2013880387e50f0ecristy 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (file == (const FILE *) NULL) 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy file=stdout; 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info=GetMagicInfoList("*",&number_aliases,exception); 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info == (const MagicInfo **) NULL) 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j=0; 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy path=(const char *) NULL; 763bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_aliases; i++) 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info[i]->stealth != MagickFalse) 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((path == (const char *) NULL) || 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (LocaleCompare(path,magic_info[i]->path) != 0)) 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info[i]->path != (char *) NULL) 771b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"\nPath: %s\n\n",magic_info[i]->path); 772b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"Name Offset Target\n"); 7731e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(file, 7741e604812fad85bb96f757a2393015ae3d061c39acristy "-------------------------------------------------" 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "------------------------------\n"); 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy path=magic_info[i]->path; 778b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"%s",magic_info[i]->name); 779bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++) 780b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file," "); 781b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"%6ld ",(long) magic_info[i]->offset); 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info[i]->target != (char *) NULL) 7831ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy { 784bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 7851ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy j; 7861ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy 7871ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy for (j=0; magic_info[i]->target[j] != '\0'; j++) 7881ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy if (isprint((int) ((unsigned char) magic_info[i]->target[j])) != 0) 789b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"%c",magic_info[i]->target[j]); 7901ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy else 791b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"\\%03o",(unsigned int) 79250931924c7fa18a0bedf56c584c4449dbc7e23b6cristy ((unsigned char) magic_info[i]->target[j])); 7931ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy } 794b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(file,"\n"); 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) fflush(file); 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info=(const MagicInfo **) RelinquishMagickMemory((void *) magic_info); 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 806fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk+ L o a d M a g i c C a c h e % 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% LoadMagicCache() loads the magic configurations which provides a mapping 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% between magic attributes and a magic name. 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy% The format of the LoadMagicCache method is: 8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 817b18d864b3f06e9272582b7736230d934d715d542dirk% MagickBooleanType LoadMagicCache(LinkedListInfo *cache,const char *xml, 818b18d864b3f06e9272582b7736230d934d715d542dirk% const char *filename,const size_t depth,ExceptionInfo *exception) 8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8221ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy% o xml: The magic list in XML format. 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8241ca3eb31f430b4e3ee62ef287c1f23c929a7d024cristy% o filename: The magic list filename. 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o depth: depth of <include /> statements. 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 831b18d864b3f06e9272582b7736230d934d715d542dirkstatic MagickBooleanType LoadMagicCache(LinkedListInfo *cache,const char *xml, 832b18d864b3f06e9272582b7736230d934d715d542dirk const char *filename,const size_t depth,ExceptionInfo *exception) 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 835151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy keyword[MagickPathExtent], 8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *token; 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagicInfo 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *magic_info; 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 844759ba919e9fe454989454f481f4055fd38b32307cristy MagickStatusType 845759ba919e9fe454989454f481f4055fd38b32307cristy status; 846759ba919e9fe454989454f481f4055fd38b32307cristy 847fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk size_t 848fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk extent; 849fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk 8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Load the magic map file. 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), 8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Loading magic configure file \"%s\" ...",filename); 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (xml == (char *) NULL) 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickTrue; 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info=(MagicInfo *) NULL; 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy token=AcquireString(xml); 860fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk extent=strlen(token)+MagickPathExtent; 8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (q=(char *) xml; *q != '\0'; ) 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Interpret XML. 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8668bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*token == '\0') 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 869151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(keyword,token,MagickPathExtent); 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0) 8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Doctype element. 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0')) 8768bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare(keyword,"<!--",4) == 0) 8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Comment element. 8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0')) 8858bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"<include") == 0) 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include element. 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0')) 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 895151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(keyword,token,MagickPathExtent); 8968bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*token != '=') 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 8998bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"file") == 0) 9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth > 200) 9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(), 904efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token); 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 908151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy path[MagickPathExtent], 909b81f0abf7970b3c3e43ba0c95266a1c252806425dirk *file_xml; 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetPathComponent(filename,HeadPath,path); 9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*path != '\0') 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(path,DirectorySeparator, 914151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent); 9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*token == *DirectorySeparator) 916151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(path,token,MagickPathExtent); 9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 918151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(path,token,MagickPathExtent); 919b81f0abf7970b3c3e43ba0c95266a1c252806425dirk file_xml=FileToXML(path,~0UL); 9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (xml != (char *) NULL) 9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 922b18d864b3f06e9272582b7736230d934d715d542dirk status&=LoadMagicCache(cache,file_xml,path,depth+1, 923cd2cd1803dda951bcfff101c44032ae17e52655fcristy exception); 924b81f0abf7970b3c3e43ba0c95266a1c252806425dirk file_xml=DestroyString(file_xml); 9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"<magic") == 0) 9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Magic element. 9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy magic_info=(MagicInfo *) AcquireMagickMemory(sizeof(*magic_info)); 9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info == (MagicInfo *) NULL) 9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(magic_info,0,sizeof(*magic_info)); 9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->path=ConstantString(filename); 941e3e77a19c40caafb77339e5a126c532bf2984c01cristy magic_info->exempt=MagickFalse; 942e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy magic_info->signature=MagickCoreSignature; 9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magic_info == (MagicInfo *) NULL) 9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"/>") == 0) 9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 949b18d864b3f06e9272582b7736230d934d715d542dirk status=InsertValueInSortedLinkedList(cache,CompareMagickInfoSize, 9508f6816192b5724ef97553a83c73843009e0d70a6dirk NULL,magic_info); 9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(), 953efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy ResourceLimitError,"MemoryAllocationFailed","`%s'", 9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->name); 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info=(MagicInfo *) NULL; 956d45122f9ea3f4b2f73f275c9c53f8174b3ced4fdcristy continue; 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9588bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,(const char **) NULL,extent,token); 9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*token != '=') 9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 9618bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 9628bedb4edca01599dfd0612cb0daa35b09c67d736Cristy GetNextToken(q,&q,extent,token); 9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (*keyword) 9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'N': 9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'n': 9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare((char *) keyword,"name") == 0) 9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->name=ConstantString(token); 9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'O': 9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'o': 9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare((char *) keyword,"offset") == 0) 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 980f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy magic_info->offset=(MagickOffsetType) StringToLong(token); 9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'S': 9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 's': 9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare((char *) keyword,"stealth") == 0) 9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9906f2013165d72f7d8ef5f66bb9453126d88113809anthony magic_info->stealth=IsStringTrue(token); 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'T': 9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 't': 9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare((char *) keyword,"target") == 0) 9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=strlen(token); 10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->target=ConstantString(token); 10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->magic=(unsigned char *) ConstantString(token); 10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=magic_info->magic; 10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=magic_info->target; *p != '\0'; ) 10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*p == '\\') 10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (isdigit((int) ((unsigned char) *p)) != 0) 10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *end; 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) strtol(p,&end,8); 10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=(end-p); 10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->length++; 10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (*p) 10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'b': *q='\b'; break; 10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'f': *q='\f'; break; 10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'n': *q='\n'; break; 10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'r': *q='\r'; break; 10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 't': *q='\t'; break; 10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'v': *q='\v'; break; 10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'a': *q='a'; break; 10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case '?': *q='\?'; break; 10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: *q=(unsigned char) (*p); break; 10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->length++; 10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare(p,"&",5) == 0) 10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(p+1,p+5,length-magic_info->length); 10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) (*p++); 10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_info->length++; 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy token=(char *) RelinquishMagickMemory(token); 1060759ba919e9fe454989454f481f4055fd38b32307cristy return(status != 0 ? MagickTrue : MagickFalse); 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1068f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+ M a g i c C o m p o n e n t G e n e s i s % 1069f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1070f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1071f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1072f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1073f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1074f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% MagicComponentGenesis() instantiates the magic component. 1075f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1076f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% The format of the MagicComponentGenesis method is: 1077f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1078f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% MagickBooleanType MagicComponentGenesis(void) 1079f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1080f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/ 10815ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType MagicComponentGenesis(void) 1082f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{ 10837c9770650f31145e0fe8811d10b2e0ecd47697c8cristy if (magic_semaphore == (SemaphoreInfo *) NULL) 10847c9770650f31145e0fe8811d10b2e0ecd47697c8cristy magic_semaphore=AcquireSemaphoreInfo(); 1085f34a145c545cb86152ad42a787f6d5fffea6b77ccristy return(MagickTrue); 1086f34a145c545cb86152ad42a787f6d5fffea6b77ccristy} 1087f34a145c545cb86152ad42a787f6d5fffea6b77ccristy 1088f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/* 1089f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1090f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1091f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1092f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1093f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+ M a g i c C o m p o n e n t T e r m i n u s % 1094f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1095f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1096f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% % 1097f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1098f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1099f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% MagicComponentTerminus() destroys the magic component. 1100f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1101f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% The format of the MagicComponentTerminus method is: 1102f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1103f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% MagicComponentTerminus(void) 1104f34a145c545cb86152ad42a787f6d5fffea6b77ccristy% 1105f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/ 1106f34a145c545cb86152ad42a787f6d5fffea6b77ccristy 1107f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyMagicElement(void *magic_info) 1108f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{ 1109f34a145c545cb86152ad42a787f6d5fffea6b77ccristy register MagicInfo 1110f34a145c545cb86152ad42a787f6d5fffea6b77ccristy *p; 1111f34a145c545cb86152ad42a787f6d5fffea6b77ccristy 1112f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p=(MagicInfo *) magic_info; 1113f34a145c545cb86152ad42a787f6d5fffea6b77ccristy if (p->exempt == MagickFalse) 1114f34a145c545cb86152ad42a787f6d5fffea6b77ccristy { 1115f34a145c545cb86152ad42a787f6d5fffea6b77ccristy if (p->path != (char *) NULL) 1116f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p->path=DestroyString(p->path); 1117f34a145c545cb86152ad42a787f6d5fffea6b77ccristy if (p->name != (char *) NULL) 1118f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p->name=DestroyString(p->name); 1119f34a145c545cb86152ad42a787f6d5fffea6b77ccristy if (p->target != (char *) NULL) 1120f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p->target=DestroyString(p->target); 1121f34a145c545cb86152ad42a787f6d5fffea6b77ccristy if (p->magic != (unsigned char *) NULL) 1122f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p->magic=(unsigned char *) RelinquishMagickMemory(p->magic); 1123f34a145c545cb86152ad42a787f6d5fffea6b77ccristy } 1124f34a145c545cb86152ad42a787f6d5fffea6b77ccristy p=(MagicInfo *) RelinquishMagickMemory(p); 1125f34a145c545cb86152ad42a787f6d5fffea6b77ccristy return((void *) NULL); 1126f34a145c545cb86152ad42a787f6d5fffea6b77ccristy} 1127f34a145c545cb86152ad42a787f6d5fffea6b77ccristy 11285ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void MagicComponentTerminus(void) 1129f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{ 113018b17443128598500357da7bff2f01683cf32890cristy if (magic_semaphore == (SemaphoreInfo *) NULL) 113104b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy ActivateSemaphoreInfo(&magic_semaphore); 1132f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(magic_semaphore); 113386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy if (magic_cache != (LinkedListInfo *) NULL) 113486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy magic_cache=DestroyLinkedList(magic_cache,DestroyMagicElement); 1135f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(magic_semaphore); 11363d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy RelinquishSemaphoreInfo(&magic_semaphore); 1137f34a145c545cb86152ad42a787f6d5fffea6b77ccristy} 1138