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