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