42#include "magick/studio.h"
43#include "magick/blob.h"
44#include "magick/client.h"
45#include "magick/configure.h"
46#include "magick/exception.h"
47#include "magick/exception-private.h"
48#include "magick/hashmap.h"
49#include "magick/magic.h"
50#include "magick/memory_.h"
51#include "magick/semaphore.h"
52#include "magick/string_.h"
53#include "magick/string-private.h"
54#include "magick/token.h"
55#include "magick/utility.h"
56#include "magick/xml-tree.h"
57#include "magick/xml-tree-private.h"
62#define MagicFilename "magic.xml"
63#define MagicPattern(magic) (const unsigned char *) (magic), sizeof(magic)-1
73 const MagickOffsetType
89 {
"8BIMWTEXT", 0, MagicPattern(
"8\000B\000I\000M\000#") },
90 {
"8BIMTEXT", 0, MagicPattern(
"8BIM#") },
91 {
"8BIM", 0, MagicPattern(
"8BIM") },
92 {
"AVIF", 4, MagicPattern(
"ftypavif") },
93 {
"AVIF", 4, MagicPattern(
"ftypavis") },
94 {
"BMP", 0, MagicPattern(
"BA") },
95 {
"BMP", 0, MagicPattern(
"BM") },
96 {
"BMP", 0, MagicPattern(
"CI") },
97 {
"BMP", 0, MagicPattern(
"CP") },
98 {
"BMP", 0, MagicPattern(
"IC") },
99 {
"PICT", 0, MagicPattern(
"PICT") },
100 {
"BMP", 0, MagicPattern(
"PI") },
101 {
"CALS", 21, MagicPattern(
"version: MIL-STD-1840") },
102 {
"CALS", 0, MagicPattern(
"srcdocid:") },
103 {
"CALS", 9, MagicPattern(
"srcdocid:") },
104 {
"CALS", 8, MagicPattern(
"rorient:") },
105 {
"CGM", 0, MagicPattern(
"BEGMF") },
106 {
"CIN", 0, MagicPattern(
"\200\052\137\327") },
107 {
"CR2", 0, MagicPattern(
"II\x2a\x00\x10\x00\x00\x00CR\x02") },
108 {
"CR2", 0, MagicPattern(
"MM\x00\x2a\x00\x10\x00\x00RC\x02") },
109 {
"CRW", 0, MagicPattern(
"II\x1a\x00\x00\x00HEAPCCDR") },
110 {
"DCM", 128, MagicPattern(
"DICM") },
111 {
"DCX", 0, MagicPattern(
"\261\150\336\72") },
112 {
"DIB", 0, MagicPattern(
"\050\000") },
113 {
"DDS", 0, MagicPattern(
"DDS ") },
114 {
"DJVU", 0, MagicPattern(
"AT&TFORM") },
115 {
"DOT", 0, MagicPattern(
"digraph") },
116 {
"DPX", 0, MagicPattern(
"SDPX") },
117 {
"DPX", 0, MagicPattern(
"XPDS") },
118 {
"EMF", 40, MagicPattern(
"\040\105\115\106\000\000\001\000") },
119 {
"EPT", 0, MagicPattern(
"\305\320\323\306") },
120 {
"EXR", 0, MagicPattern(
"\166\057\061\001") },
121 {
"FAX", 0, MagicPattern(
"DFAX") },
122 {
"FIG", 0, MagicPattern(
"#FIG") },
123 {
"FITS", 0, MagicPattern(
"IT0") },
124 {
"FITS", 0, MagicPattern(
"SIMPLE") },
125 {
"FLIF", 0, MagicPattern(
"FLIF") },
126 {
"GIF", 0, MagicPattern(
"GIF8") },
127 {
"GPLT", 0, MagicPattern(
"#!/usr/local/bin/gnuplot") },
128 {
"HDF", 1, MagicPattern(
"HDF") },
129 {
"HDR", 0, MagicPattern(
"#?RADIANCE") },
130 {
"HDR", 0, MagicPattern(
"#?RGBE") },
131 {
"HEIC", 4, MagicPattern(
"ftypheic") },
132 {
"HEIC", 4, MagicPattern(
"ftypheix") },
133 {
"HEIC", 4, MagicPattern(
"ftyphevc") },
134 {
"HEIC", 4, MagicPattern(
"ftypheim") },
135 {
"HEIC", 4, MagicPattern(
"ftypheis") },
136 {
"HEIC", 4, MagicPattern(
"ftyphevm") },
137 {
"HEIC", 4, MagicPattern(
"ftyphevs") },
138 {
"HEIC", 4, MagicPattern(
"ftypmif1") },
139 {
"HEIC", 4, MagicPattern(
"ftypmsf1") },
140 {
"HPGL", 0, MagicPattern(
"IN;") },
141 {
"HTML", 1, MagicPattern(
"HTML") },
142 {
"HTML", 1, MagicPattern(
"html") },
143 {
"ILBM", 8, MagicPattern(
"ILBM") },
144 {
"IPTCWTEXT", 0, MagicPattern(
"\062\000#\000\060\000=\000\042\000&\000#\000\060\000;\000&\000#\000\062\000;\000\042\000") },
145 {
"IPTCTEXT", 0, MagicPattern(
"2#0=\042�\042") },
146 {
"IPTC", 0, MagicPattern(
"\034\002") },
147 {
"JNG", 0, MagicPattern(
"\213JNG\r\n\032\n") },
148 {
"JPEG", 0, MagicPattern(
"\377\330\377") },
149 {
"J2K", 0, MagicPattern(
"\xff\x4f\xff\x51") },
150 {
"JPC", 0, MagicPattern(
"\x0d\x0a\x87\x0a") },
151 {
"JP2", 0, MagicPattern(
"\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a") },
152 {
"JXL", 0, MagicPattern(
"\xff\x0a") },
153 {
"JXL", 0, MagicPattern(
"\x00\x00\x00\x0c\x4a\x58\x4c\x20\x0d\x0a\x87\x0a") },
154 {
"MAT", 0, MagicPattern(
"MATLAB 5.0 MAT-file,") },
155 {
"MIFF", 0, MagicPattern(
"Id=ImageMagick") },
156 {
"MIFF", 0, MagicPattern(
"id=ImageMagick") },
157 {
"MNG", 0, MagicPattern(
"\212MNG\r\n\032\n") },
158 {
"MPC", 0, MagicPattern(
"id=MagickCache") },
159 {
"MPEG", 0, MagicPattern(
"\000\000\001\263") },
160 {
"MRW", 0, MagicPattern(
"\x00MRM") },
161 {
"ORF", 0, MagicPattern(
"IIRO\x08\x00\x00\x00") },
162 {
"PCD", 2048, MagicPattern(
"PCD_") },
163 {
"PCL", 0, MagicPattern(
"\033E\033") },
164 {
"PCX", 0, MagicPattern(
"\012\002") },
165 {
"PCX", 0, MagicPattern(
"\012\005") },
166 {
"PDB", 60, MagicPattern(
"vIMGView") },
167 {
"PDF", 0, MagicPattern(
"%PDF-") },
168 {
"PES", 0, MagicPattern(
"#PES") },
169 {
"PFA", 0, MagicPattern(
"%!PS-AdobeFont-1.0") },
170 {
"PFB", 6, MagicPattern(
"%!PS-AdobeFont-1.0") },
171 {
"PGX", 0, MagicPattern(
"PG ML") },
172 {
"PGX", 0, MagicPattern(
"PG LM") },
173 {
"PICT", 522, MagicPattern(
"\000\021\002\377\014\000") },
174 {
"PNG", 0, MagicPattern(
"\211PNG\r\n\032\n") },
175 {
"PBM", 0, MagicPattern(
"P1") },
176 {
"PGM", 0, MagicPattern(
"P2") },
177 {
"PPM", 0, MagicPattern(
"P3") },
178 {
"PBM", 0, MagicPattern(
"P4") },
179 {
"PGM", 0, MagicPattern(
"P5") },
180 {
"PPM", 0, MagicPattern(
"P6") },
181 {
"PAM", 0, MagicPattern(
"P7") },
182 {
"PFM", 0, MagicPattern(
"PF") },
183 {
"PFM", 0, MagicPattern(
"Pf") },
184 {
"PS", 0, MagicPattern(
"%!") },
185 {
"PS", 0, MagicPattern(
"\004%!") },
186 {
"PS", 0, MagicPattern(
"\305\320\323\306") },
187 {
"PSB", 0, MagicPattern(
"8BPB") },
188 {
"PSD", 0, MagicPattern(
"8BPS") },
189 {
"PWP", 0, MagicPattern(
"SFW95") },
190 {
"RAF", 0, MagicPattern(
"FUJIFILMCCD-RAW ") },
191 {
"RAW", 0, MagicPattern(
"IIU\x00\x08\x00\x00\x00") },
192 {
"RW2", 0, MagicPattern(
"IIU\x00\x18\x00\x00\x00") },
193 {
"RLE", 0, MagicPattern(
"\122\314") },
194 {
"SCT", 0, MagicPattern(
"CT") },
195 {
"SFW", 0, MagicPattern(
"SFW94") },
196 {
"SGI", 0, MagicPattern(
"\001\332") },
197 {
"SUN", 0, MagicPattern(
"\131\246\152\225") },
198 {
"SVG", 1, MagicPattern(
"?XML") },
199 {
"SVG", 1, MagicPattern(
"?xml") },
200 {
"SVG", 1, MagicPattern(
"SVG") },
201 {
"SVG", 1, MagicPattern(
"svg") },
202 {
"TIFF", 0, MagicPattern(
"\115\115\000\052") },
203 {
"TIFF", 0, MagicPattern(
"\111\111\052\000") },
204 {
"TIFF64", 0, MagicPattern(
"\115\115\000\053\000\010\000\000") },
205 {
"TIFF64", 0, MagicPattern(
"\111\111\053\000\010\000\000\000") },
206 {
"TTF", 0, MagicPattern(
"\000\001\000\000\000") },
207 {
"TXT", 0, MagicPattern(
"# ImageMagick pixel enumeration:") },
208 {
"VICAR", 0, MagicPattern(
"LBLSIZE") },
209 {
"VICAR", 0, MagicPattern(
"NJPL1I") },
210 {
"VIFF", 0, MagicPattern(
"\253\001") },
211 {
"WEBP", 8, MagicPattern(
"WEBP") },
212 {
"WMF", 0, MagicPattern(
"\327\315\306\232") },
213 {
"WMF", 0, MagicPattern(
"\001\000\011\000") },
214 {
"WPG", 0, MagicPattern(
"\377WPC") },
215 {
"XBM", 0, MagicPattern(
"#define") },
216 {
"XCF", 0, MagicPattern(
"gimp xcf") },
217 {
"XEF", 0, MagicPattern(
"FOVb") },
218 {
"XPM", 1, MagicPattern(
"* XPM *") }
230static MagickBooleanType
233#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
234static MagickBooleanType
235 LoadMagicCache(
LinkedListInfo *,
const char *,
const char *,
const size_t,
265static int CompareMagickInfoSize(
const void *a,
const void *b)
273 if (ma->offset != mb->offset)
274 return((
int) (ma->offset-mb->offset));
275 return((
int) (mb->length-(ssize_t) ma->length));
290 cache=NewLinkedList(0);
292 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
297#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
309 options=GetConfigureOptions(filename,exception);
310 option=(
const StringInfo *) GetNextValueInLinkedList(options);
313 (void) CopyMagickString(path,GetStringInfoPath(option),MaxTextExtent);
314 status&=LoadMagicCache(cache,(
const char *)
315 GetStringInfoDatum(option),GetStringInfoPath(option),0,exception);
316 option=(
const StringInfo *) GetNextValueInLinkedList(options);
318 options=DestroyConfigureOptions(options);
324 for (i=0; i < (ssize_t) (
sizeof(MagicMap)/
sizeof(*MagicMap)); i++)
333 magic_info=(
MagicInfo *) AcquireMagickMemory(
sizeof(*magic_info));
336 (void) ThrowMagickException(exception,GetMagickModule(),
337 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",p->name);
340 (void) memset(magic_info,0,
sizeof(*magic_info));
341 magic_info->path=(
char *)
"[built-in]";
342 magic_info->name=(
char *) p->name;
343 magic_info->offset=p->offset;
344 magic_info->target=(
char *) p->magic;
345 magic_info->magic=(
unsigned char *) p->magic;
346 magic_info->length=p->length;
347 magic_info->exempt=MagickTrue;
348 magic_info->signature=MagickCoreSignature;
349 status&=InsertValueInSortedLinkedList(cache,CompareMagickInfoSize,
351 if (status == MagickFalse)
352 (void) ThrowMagickException(exception,GetMagickModule(),
353 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",magic_info->name);
387MagickExport
const MagicInfo *GetMagicInfo(
const unsigned char *magic,
394 if (IsMagicCacheInstantiated(exception) == MagickFalse)
399 LockSemaphoreInfo(magic_semaphore);
400 ResetLinkedListIterator(magic_cache);
401 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
402 if (magic == (
const unsigned char *) NULL)
404 UnlockSemaphoreInfo(magic_semaphore);
415 assert(p->offset >= 0);
417 remaining=(MagickOffsetType) length-p->offset;
418 if (LocaleCompare(p->name,
"SVG") == 0)
419 while ((remaining > 0) && (isspace(*q) != 0))
424 if ((remaining >= (MagickOffsetType) p->length) &&
425 (memcmp(q,p->magic,p->length) == 0))
427 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
430 (void) InsertValueInLinkedList(magic_cache,0,
431 RemoveElementByValueFromLinkedList(magic_cache,p));
432 UnlockSemaphoreInfo(magic_semaphore);
465#if defined(__cplusplus) || defined(c_plusplus)
469static int MagicInfoCompare(
const void *x,
const void *y)
477 if (LocaleCompare((*p)->path,(*q)->path) == 0)
478 return(LocaleCompare((*p)->name,(*q)->name));
479 return(LocaleCompare((*p)->path,(*q)->path));
482#if defined(__cplusplus) || defined(c_plusplus)
486MagickExport
const MagicInfo **GetMagicInfoList(
const char *pattern,
501 assert(pattern != (
char *) NULL);
502 assert(number_aliases != (
size_t *) NULL);
503 if (IsEventLogging() != MagickFalse)
504 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
506 p=GetMagicInfo((
const unsigned char *) NULL,0,exception);
509 aliases=(
const MagicInfo **) AcquireQuantumMemory((
size_t)
510 GetNumberOfElementsInLinkedList(magic_cache)+1UL,
sizeof(*aliases));
511 if (aliases == (
const MagicInfo **) NULL)
516 LockSemaphoreInfo(magic_semaphore);
517 ResetLinkedListIterator(magic_cache);
518 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
519 for (i=0; p != (
const MagicInfo *) NULL; )
521 if ((p->stealth == MagickFalse) &&
522 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
524 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
526 UnlockSemaphoreInfo(magic_semaphore);
527 qsort((
void *) aliases,(
size_t) i,
sizeof(*aliases),MagicInfoCompare);
529 *number_aliases=(size_t) i;
563#if defined(__cplusplus) || defined(c_plusplus)
567static int MagicCompare(
const void *x,
const void *y)
575 return(LocaleCompare(p,q));
578#if defined(__cplusplus) || defined(c_plusplus)
582MagickExport
char **GetMagicList(
const char *pattern,
size_t *number_aliases,
597 assert(pattern != (
char *) NULL);
598 assert(number_aliases != (
size_t *) NULL);
599 if (IsEventLogging() != MagickFalse)
600 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
602 p=GetMagicInfo((
const unsigned char *) NULL,0,exception);
604 return((
char **) NULL);
605 aliases=(
char **) AcquireQuantumMemory((
size_t)
606 GetNumberOfElementsInLinkedList(magic_cache)+1UL,
sizeof(*aliases));
607 if (aliases == (
char **) NULL)
608 return((
char **) NULL);
609 LockSemaphoreInfo(magic_semaphore);
610 ResetLinkedListIterator(magic_cache);
611 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
612 for (i=0; p != (
const MagicInfo *) NULL; )
614 if ((p->stealth == MagickFalse) &&
615 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
616 aliases[i++]=ConstantString(p->name);
617 p=(
const MagicInfo *) GetNextValueInLinkedList(magic_cache);
619 UnlockSemaphoreInfo(magic_semaphore);
620 qsort((
void *) aliases,(
size_t) i,
sizeof(*aliases),MagicCompare);
621 aliases[i]=(
char *) NULL;
622 *number_aliases=(size_t) i;
648MagickExport
const char *GetMagicName(
const MagicInfo *magic_info)
650 assert(magic_info != (
MagicInfo *) NULL);
651 assert(magic_info->signature == MagickCoreSignature);
652 if (IsEventLogging() != MagickFalse)
653 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
654 return(magic_info->name);
680static MagickBooleanType IsMagicCacheInstantiated(
ExceptionInfo *exception)
685 ActivateSemaphoreInfo(&magic_semaphore);
686 LockSemaphoreInfo(magic_semaphore);
688 magic_cache=AcquireMagicCache(MagicFilename,exception);
689 UnlockSemaphoreInfo(magic_semaphore);
691 return(magic_cache != (
LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
718MagickExport MagickBooleanType ListMagicInfo(FILE *file,
736 if (file == (
const FILE *) NULL)
738 magic_info=GetMagicInfoList(
"*",&number_aliases,exception);
739 if (magic_info == (
const MagicInfo **) NULL)
742 path=(
const char *) NULL;
743 for (i=0; i < (ssize_t) number_aliases; i++)
745 if (magic_info[i]->stealth != MagickFalse)
747 if ((path == (
const char *) NULL) ||
748 (LocaleCompare(path,magic_info[i]->path) != 0))
750 if (magic_info[i]->path != (
char *) NULL)
751 (void) FormatLocaleFile(file,
"\nPath: %s\n\n",magic_info[i]->path);
752 (void) FormatLocaleFile(file,
"Name Offset Target\n");
753 (void) FormatLocaleFile(file,
754 "-------------------------------------------------"
755 "------------------------------\n");
757 path=magic_info[i]->path;
758 (void) FormatLocaleFile(file,
"%s",magic_info[i]->name);
759 for (j=(ssize_t) strlen(magic_info[i]->name); j <= 9; j++)
760 (
void) FormatLocaleFile(file,
" ");
761 (void) FormatLocaleFile(file,
"%6ld ",(
long) magic_info[i]->offset);
762 if (magic_info[i]->target != (
char *) NULL)
767 for (j=0; magic_info[i]->target[j] !=
'\0'; j++)
768 if (isprint((
int) ((
unsigned char) magic_info[i]->target[j])) != 0)
769 (void) FormatLocaleFile(file,
"%c",magic_info[i]->target[j]);
771 (
void) FormatLocaleFile(file,
"\\%03o",(
unsigned int)
772 ((
unsigned char) magic_info[i]->target[j]));
774 (void) FormatLocaleFile(file,
"\n");
777 magic_info=(
const MagicInfo **) RelinquishMagickMemory((
void *) magic_info);
781#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
812static MagickBooleanType LoadMagicCache(
LinkedListInfo *cache,
const char *xml,
813 const char *filename,
const size_t depth,
ExceptionInfo *exception)
816 keyword[MaxTextExtent],
834 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
835 "Loading magic configure file \"%s\" ...",filename);
836 if (xml == (
char *) NULL)
840 token=AcquireString(xml);
841 extent=strlen(token)+MaxTextExtent;
842 for (q=(
char *) xml; *q !=
'\0'; )
847 (void) GetNextToken(q,&q,extent,token);
850 (void) CopyMagickString(keyword,token,MaxTextExtent);
851 if (LocaleNCompare(keyword,
"<!DOCTYPE",9) == 0)
856 while ((LocaleNCompare(q,
"]>",2) != 0) && (*q !=
'\0'))
857 (void) GetNextToken(q,&q,extent,token);
860 if (LocaleNCompare(keyword,
"<!--",4) == 0)
865 while ((LocaleNCompare(q,
"->",2) != 0) && (*q !=
'\0'))
866 (void) GetNextToken(q,&q,extent,token);
869 if (LocaleCompare(keyword,
"<include") == 0)
874 while (((*token !=
'/') && (*(token+1) !=
'>')) && (*q !=
'\0'))
876 (void) CopyMagickString(keyword,token,MaxTextExtent);
877 (void) GetNextToken(q,&q,extent,token);
880 (void) GetNextToken(q,&q,extent,token);
881 if (LocaleCompare(keyword,
"file") == 0)
883 if (depth > MagickMaxRecursionDepth)
884 (void) ThrowMagickException(exception,GetMagickModule(),
885 ConfigureError,
"IncludeElementNestedTooDeeply",
"`%s'",token);
892 GetPathComponent(filename,HeadPath,path);
894 (void) ConcatenateMagickString(path,DirectorySeparator,
896 if (*token == *DirectorySeparator)
897 (void) CopyMagickString(path,token,MaxTextExtent);
899 (
void) ConcatenateMagickString(path,token,MaxTextExtent);
900 xml=FileToXML(path,~0UL);
901 if (xml != (
char *) NULL)
903 status&=LoadMagicCache(cache,xml,path,depth+1,
905 xml=(
char *) RelinquishMagickMemory(xml);
912 if (LocaleCompare(keyword,
"<magic") == 0)
917 magic_info=(
MagicInfo *) AcquireMagickMemory(
sizeof(*magic_info));
919 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
920 (void) memset(magic_info,0,
sizeof(*magic_info));
921 magic_info->path=ConstantString(filename);
922 magic_info->exempt=MagickFalse;
923 magic_info->signature=MagickCoreSignature;
928 if ((LocaleCompare(keyword,
"/>") == 0) ||
929 (LocaleCompare(keyword,
"</policy>") == 0))
931 status=AppendValueToLinkedList(cache,magic_info);
932 if (status == MagickFalse)
933 (void) ThrowMagickException(exception,GetMagickModule(),
934 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
939 (void) GetNextToken(q,(
const char **) NULL,extent,token);
942 (void) GetNextToken(q,&q,extent,token);
943 (void) GetNextToken(q,&q,extent,token);
949 if (LocaleCompare((
char *) keyword,
"name") == 0)
951 magic_info->name=ConstantString(token);
959 if (LocaleCompare((
char *) keyword,
"offset") == 0)
961 magic_info->offset=(MagickOffsetType) StringToLong(token);
969 if (LocaleCompare((
char *) keyword,
"stealth") == 0)
971 magic_info->stealth=IsMagickTrue(token);
979 if (LocaleCompare((
char *) keyword,
"target") == 0)
990 length=strlen(token);
991 magic_info->target=ConstantString(token);
992 magic_info->magic=(
unsigned char *) ConstantString(token);
994 for (p=magic_info->target; *p !=
'\0'; )
999 if (isdigit((
int) ((
unsigned char) *p)) != 0)
1004 *q++=(
unsigned char) strtol(p,&end,8);
1005 p+=(ptrdiff_t) (end-p);
1006 magic_info->length++;
1011 case 'b': *q=
'\b';
break;
1012 case 'f': *q=
'\f';
break;
1013 case 'n': *q=
'\n';
break;
1014 case 'r': *q=
'\r';
break;
1015 case 't': *q=
'\t';
break;
1016 case 'v': *q=
'\v';
break;
1017 case 'a': *q=
'a';
break;
1018 case '?': *q=
'\?';
break;
1019 default: *q=(
unsigned char) (*p);
break;
1023 magic_info->length++;
1027 if (LocaleNCompare(p,
"&",5) == 0)
1028 (void) CopyMagickString(p+1,p+5,length-magic_info->length);
1029 *q++=(
unsigned char) (*p++);
1030 magic_info->length++;
1040 token=(
char *) RelinquishMagickMemory(token);
1041 return(status != 0 ? MagickTrue : MagickFalse);
1063MagickExport MagickBooleanType MagicComponentGenesis(
void)
1066 magic_semaphore=AllocateSemaphoreInfo();
1089static void *DestroyMagicElement(
void *magic_info)
1095 if (p->exempt == MagickFalse)
1097 if (p->path != (
char *) NULL)
1098 p->path=DestroyString(p->path);
1099 if (p->name != (
char *) NULL)
1100 p->name=DestroyString(p->name);
1101 if (p->target != (
char *) NULL)
1102 p->target=DestroyString(p->target);
1103 if (p->magic != (
unsigned char *) NULL)
1104 p->magic=(
unsigned char *) RelinquishMagickMemory(p->magic);
1106 p=(
MagicInfo *) RelinquishMagickMemory(p);
1107 return((
void *) NULL);
1110MagickExport
void MagicComponentTerminus(
void)
1113 ActivateSemaphoreInfo(&magic_semaphore);
1114 LockSemaphoreInfo(magic_semaphore);
1116 magic_cache=DestroyLinkedList(magic_cache,DestroyMagicElement);
1117 UnlockSemaphoreInfo(magic_semaphore);
1118 DestroySemaphoreInfo(&magic_semaphore);