1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % %
4 % %
5 % %
6 % SSSSS TTTTT AAA TTTTT IIIII CCCC %
7 % SS T A A T I C %
8 % SSS T AAAAA T I C %
9 % SS T A A T I C %
10 % SSSSS T A A T IIIII CCCC %
11 % %
12 % %
13 % MagickCore Static Methods %
14 % %
15 % Software Design %
16 % Cristy %
17 % March 2000 %
18 % %
19 % %
20 % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
22 % %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
25 % %
26 % https://imagemagick.org/script/license.php %
27 % %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
33 % %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %
37 %
38 */
39
40 /*
41 Include declarations.
42 */
43 #include "magick/studio.h"
44 #include "magick/coder.h"
45 #include "magick/exception-private.h"
46 #include "magick/image.h"
47 #include "magick/module.h"
48 #include "magick/policy.h"
49 #include "magick/static.h"
50 #include "magick/string_.h"
51
52 /*
53 ImageMagick module stub.
54 */
RegisterUndefinedImage(void)55 ModuleExport size_t RegisterUndefinedImage(void)
56 {
57 return(MagickImageCoderSignature);
58 }
59
UnregisterUndefinedImage(void)60 ModuleExport void UnregisterUndefinedImage(void)
61 {
62 }
63
64 /*
65 ImageMagick modules.
66 */
67 static struct
68 {
69 const char
70 *module;
71
72 MagickBooleanType
73 registered;
74
75 size_t
76 (*register_module)(void);
77
78 void
79 (*unregister_module)(void);
80 } MagickModules[] =
81 {
82 #if !defined(MAGICKCORE_BUILD_MODULES)
83 { "AAI", MagickFalse, RegisterAAIImage, UnregisterAAIImage },
84 { "ART", MagickFalse, RegisterARTImage, UnregisterARTImage },
85 { "AVS", MagickFalse, RegisterAVSImage, UnregisterAVSImage },
86 { "BGR", MagickFalse, RegisterBGRImage, UnregisterBGRImage },
87 { "BMP", MagickFalse, RegisterBMPImage, UnregisterBMPImage },
88 { "BRAILLE", MagickFalse, RegisterBRAILLEImage, UnregisterBRAILLEImage },
89 { "CALS", MagickFalse, RegisterCALSImage, UnregisterCALSImage },
90 { "CAPTION", MagickFalse, RegisterCAPTIONImage, UnregisterCAPTIONImage },
91 { "CIN", MagickFalse, RegisterCINImage, UnregisterCINImage },
92 { "CIP", MagickFalse, RegisterCIPImage, UnregisterCIPImage },
93 { "CLIP", MagickFalse, RegisterCLIPImage, UnregisterCLIPImage },
94 #if defined(MAGICKCORE_WINGDI32_DELEGATE)
95 { "CLIPBOARD", MagickFalse, RegisterCLIPBOARDImage, UnregisterCLIPBOARDImage },
96 #endif
97 { "CMYK", MagickFalse, RegisterCMYKImage, UnregisterCMYKImage },
98 { "CUT", MagickFalse, RegisterCUTImage, UnregisterCUTImage },
99 { "DCM", MagickFalse, RegisterDCMImage, UnregisterDCMImage },
100 { "DDS", MagickFalse, RegisterDDSImage, UnregisterDDSImage },
101 { "DEBUG", MagickFalse, RegisterDEBUGImage, UnregisterDEBUGImage },
102 { "DIB", MagickFalse, RegisterDIBImage, UnregisterDIBImage },
103 #if defined(MAGICKCORE_DJVU_DELEGATE)
104 { "DJVU", MagickFalse, RegisterDJVUImage, UnregisterDJVUImage },
105 #endif
106 { "DNG", MagickFalse, RegisterDNGImage, UnregisterDNGImage },
107 #if defined(MAGICKCORE_DPS_DELEGATE)
108 { "DPS", MagickFalse, RegisterDPSImage, UnregisterDPSImage },
109 #endif
110 { "DPX", MagickFalse, RegisterDPXImage, UnregisterDPXImage },
111 #if defined(MAGICKCORE_WINGDI32_DELEGATE)
112 { "EMF", MagickFalse, RegisterEMFImage, UnregisterEMFImage },
113 #endif
114 #if defined(MAGICKCORE_TIFF_DELEGATE)
115 { "EPT", MagickFalse, RegisterEPTImage, UnregisterEPTImage },
116 #endif
117 #if defined(MAGICKCORE_OPENEXR_DELEGATE)
118 { "EXR", MagickFalse, RegisterEXRImage, UnregisterEXRImage },
119 #endif
120 { "FAX", MagickFalse, RegisterFAXImage, UnregisterFAXImage },
121 { "FITS", MagickFalse, RegisterFITSImage, UnregisterFITSImage },
122 #if defined(MAGICKCORE_FLIF_DELEGATE)
123 { "FLIF", MagickFalse, RegisterFLIFImage, UnregisterFLIFImage },
124 #endif
125 #if defined(MAGICKCORE_FPX_DELEGATE)
126 { "FPX", MagickFalse, RegisterFPXImage, UnregisterFPXImage },
127 #endif
128 { "GIF", MagickFalse, RegisterGIFImage, UnregisterGIFImage },
129 { "GRAY", MagickFalse, RegisterGRAYImage, UnregisterGRAYImage },
130 { "GRADIENT", MagickFalse, RegisterGRADIENTImage, UnregisterGRADIENTImage },
131 { "HALD", MagickFalse, RegisterHALDImage, UnregisterHALDImage },
132 { "HDR", MagickFalse, RegisterHDRImage, UnregisterHDRImage },
133 #if defined(MAGICKCORE_HEIC_DELEGATE)
134 { "HEIC", MagickFalse, RegisterHEICImage, UnregisterHEICImage },
135 #endif
136 { "HISTOGRAM", MagickFalse, RegisterHISTOGRAMImage, UnregisterHISTOGRAMImage },
137 { "HRZ", MagickFalse, RegisterHRZImage, UnregisterHRZImage },
138 { "HTML", MagickFalse, RegisterHTMLImage, UnregisterHTMLImage },
139 { "ICON", MagickFalse, RegisterICONImage, UnregisterICONImage },
140 { "INFO", MagickFalse, RegisterINFOImage, UnregisterINFOImage },
141 { "INLINE", MagickFalse, RegisterINLINEImage, UnregisterINLINEImage },
142 { "IPL", MagickFalse, RegisterIPLImage, UnregisterIPLImage },
143 #if defined(MAGICKCORE_JBIG_DELEGATE)
144 { "JBIG", MagickFalse, RegisterJBIGImage, UnregisterJBIGImage },
145 #endif
146 { "JNX", MagickFalse, RegisterJNXImage, UnregisterJNXImage },
147 #if defined(MAGICKCORE_JPEG_DELEGATE)
148 { "JPEG", MagickFalse, RegisterJPEGImage, UnregisterJPEGImage },
149 #endif
150 #if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
151 { "JP2", MagickFalse, RegisterJP2Image, UnregisterJP2Image },
152 #endif
153 { "JSON", MagickFalse, RegisterJSONImage, UnregisterJSONImage },
154 { "LABEL", MagickFalse, RegisterLABELImage, UnregisterLABELImage },
155 { "MAC", MagickFalse, RegisterMACImage, UnregisterMACImage },
156 { "MAGICK", MagickFalse, RegisterMAGICKImage, UnregisterMAGICKImage },
157 { "MAP", MagickFalse, RegisterMAPImage, UnregisterMAPImage },
158 { "MAT", MagickFalse, RegisterMATImage, UnregisterMATImage },
159 { "MATTE", MagickFalse, RegisterMATTEImage, UnregisterMATTEImage },
160 { "MASK", MagickFalse, RegisterMASKImage, UnregisterMASKImage },
161 { "META", MagickFalse, RegisterMETAImage, UnregisterMETAImage },
162 { "MIFF", MagickFalse, RegisterMIFFImage, UnregisterMIFFImage },
163 { "MONO", MagickFalse, RegisterMONOImage, UnregisterMONOImage },
164 { "MPC", MagickFalse, RegisterMPCImage, UnregisterMPCImage },
165 { "MPR", MagickFalse, RegisterMPRImage, UnregisterMPRImage },
166 { "MSL", MagickFalse, RegisterMSLImage, UnregisterMSLImage },
167 { "MTV", MagickFalse, RegisterMTVImage, UnregisterMTVImage },
168 { "MVG", MagickFalse, RegisterMVGImage, UnregisterMVGImage },
169 { "NULL", MagickFalse, RegisterNULLImage, UnregisterNULLImage },
170 { "OTB", MagickFalse, RegisterOTBImage, UnregisterOTBImage },
171 { "PALM", MagickFalse, RegisterPALMImage, UnregisterPALMImage },
172 { "PANGO", MagickFalse, RegisterPANGOImage, UnregisterPANGOImage },
173 { "PATTERN", MagickFalse, RegisterPATTERNImage, UnregisterPATTERNImage },
174 { "PCD", MagickFalse, RegisterPCDImage, UnregisterPCDImage },
175 { "PCL", MagickFalse, RegisterPCLImage, UnregisterPCLImage },
176 { "PCX", MagickFalse, RegisterPCXImage, UnregisterPCXImage },
177 { "PDB", MagickFalse, RegisterPDBImage, UnregisterPDBImage },
178 { "PDF", MagickFalse, RegisterPDFImage, UnregisterPDFImage },
179 { "PES", MagickFalse, RegisterPESImage, UnregisterPESImage },
180 { "PGX", MagickFalse, RegisterPGXImage, UnregisterPGXImage },
181 { "PICT", MagickFalse, RegisterPICTImage, UnregisterPICTImage },
182 { "PIX", MagickFalse, RegisterPIXImage, UnregisterPIXImage },
183 { "PLASMA", MagickFalse, RegisterPLASMAImage, UnregisterPLASMAImage },
184 #if defined(MAGICKCORE_PNG_DELEGATE)
185 { "PNG", MagickFalse, RegisterPNGImage, UnregisterPNGImage },
186 #endif
187 { "PNM", MagickFalse, RegisterPNMImage, UnregisterPNMImage },
188 { "PS", MagickFalse, RegisterPSImage, UnregisterPSImage },
189 { "PS2", MagickFalse, RegisterPS2Image, UnregisterPS2Image },
190 { "PS3", MagickFalse, RegisterPS3Image, UnregisterPS3Image },
191 { "PSD", MagickFalse, RegisterPSDImage, UnregisterPSDImage },
192 { "PWP", MagickFalse, RegisterPWPImage, UnregisterPWPImage },
193 { "RAW", MagickFalse, RegisterRAWImage, UnregisterRAWImage },
194 { "RGB", MagickFalse, RegisterRGBImage, UnregisterRGBImage },
195 { "RGF", MagickFalse, RegisterRGFImage, UnregisterRGFImage },
196 { "RLA", MagickFalse, RegisterRLAImage, UnregisterRLAImage },
197 { "RLE", MagickFalse, RegisterRLEImage, UnregisterRLEImage },
198 { "SCR", MagickFalse, RegisterSCRImage, UnregisterSCRImage },
199 { "SCREENSHOT", MagickFalse, RegisterSCREENSHOTImage, UnregisterSCREENSHOTImage },
200 { "SCT", MagickFalse, RegisterSCTImage, UnregisterSCTImage },
201 { "SFW", MagickFalse, RegisterSFWImage, UnregisterSFWImage },
202 { "SGI", MagickFalse, RegisterSGIImage, UnregisterSGIImage },
203 { "SIXEL", MagickFalse, RegisterSIXELImage, UnregisterSIXELImage },
204 { "STEGANO", MagickFalse, RegisterSTEGANOImage, UnregisterSTEGANOImage },
205 { "SUN", MagickFalse, RegisterSUNImage, UnregisterSUNImage },
206 { "SVG", MagickFalse, RegisterSVGImage, UnregisterSVGImage },
207 { "TGA", MagickFalse, RegisterTGAImage, UnregisterTGAImage },
208 { "THUMBNAIL", MagickFalse, RegisterTHUMBNAILImage, UnregisterTHUMBNAILImage },
209 #if defined(MAGICKCORE_TIFF_DELEGATE)
210 { "TIFF", MagickFalse, RegisterTIFFImage, UnregisterTIFFImage },
211 #endif
212 { "TILE", MagickFalse, RegisterTILEImage, UnregisterTILEImage },
213 { "TIM", MagickFalse, RegisterTIMImage, UnregisterTIMImage },
214 { "TTF", MagickFalse, RegisterTTFImage, UnregisterTTFImage },
215 { "TXT", MagickFalse, RegisterTXTImage, UnregisterTXTImage },
216 { "UIL", MagickFalse, RegisterUILImage, UnregisterUILImage },
217 { "URL", MagickFalse, RegisterURLImage, UnregisterURLImage },
218 { "UYVY", MagickFalse, RegisterUYVYImage, UnregisterUYVYImage },
219 { "VICAR", MagickFalse, RegisterVICARImage, UnregisterVICARImage },
220 { "VID", MagickFalse, RegisterVIDImage, UnregisterVIDImage },
221 { "VIDEO", MagickFalse, RegisterVIDEOImage, UnregisterVIDEOImage },
222 { "VIFF", MagickFalse, RegisterVIFFImage, UnregisterVIFFImage },
223 { "VIPS", MagickFalse, RegisterVIPSImage, UnregisterVIPSImage },
224 { "WBMP", MagickFalse, RegisterWBMPImage, UnregisterWBMPImage },
225 #if defined(MAGICKCORE_WEBP_DELEGATE)
226 { "WEBP", MagickFalse, RegisterWEBPImage, UnregisterWEBPImage },
227 #endif
228 #if defined(MAGICKCORE_WMF_DELEGATE) || defined(MAGICKCORE_WMFLITE_DELEGATE)
229 { "WMF", MagickFalse, RegisterWMFImage, UnregisterWMFImage },
230 #endif
231 { "WPG", MagickFalse, RegisterWPGImage, UnregisterWPGImage },
232 #if defined(MAGICKCORE_X11_DELEGATE)
233 { "X", MagickFalse, RegisterXImage, UnregisterXImage },
234 #endif
235 { "XBM", MagickFalse, RegisterXBMImage, UnregisterXBMImage },
236 { "XC", MagickFalse, RegisterXCImage, UnregisterXCImage },
237 { "XCF", MagickFalse, RegisterXCFImage, UnregisterXCFImage },
238 { "XPM", MagickFalse, RegisterXPMImage, UnregisterXPMImage },
239 { "XPS", MagickFalse, RegisterXPSImage, UnregisterXPSImage },
240 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
241 { "XTRN", MagickFalse, RegisterXTRNImage, UnregisterXTRNImage },
242 #endif
243 #if defined(MAGICKCORE_X11_DELEGATE)
244 { "XWD", MagickFalse, RegisterXWDImage, UnregisterXWDImage },
245 #endif
246 { "YCBCR", MagickFalse, RegisterYCBCRImage, UnregisterYCBCRImage },
247 { "YUV", MagickFalse, RegisterYUVImage, UnregisterYUVImage },
248 #endif
249 { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage }
250 };
251
252 /*
253 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254 % %
255 % %
256 % %
257 % I n v o k e S t a t i c I m a g e F i l t e r %
258 % %
259 % %
260 % %
261 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
262 %
263 % InvokeStaticImageFilter() invokes a static image filter.
264 %
265 % The format of the InvokeStaticImageFilter method is:
266 %
267 % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image,
268 % const int argc,const char **argv)
269 %
270 % A description of each parameter follows:
271 %
272 % o tag: the module tag.
273 %
274 % o image: the image.
275 %
276 % o argc: the number of elements in the argument vector.
277 %
278 % o argv: A text array containing the command line arguments.
279 %
280 % o argv: A text array containing the command line arguments.
281 %
282 % o exception: return any errors or warnings in this structure.
283 %
284 */
285 #if defined(MAGICKCORE_MODULES_SUPPORT)
InvokeStaticImageFilter(const char * tag,Image ** image,const int argc,const char ** argv,ExceptionInfo * exception)286 MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag,
287 Image **image,const int argc,const char **argv,ExceptionInfo *exception)
288 {
289 PolicyRights
290 rights;
291
292 assert(image != (Image **) NULL);
293 assert((*image)->signature == MagickCoreSignature);
294 if ((*image)->debug != MagickFalse)
295 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
296 rights=ReadPolicyRights;
297 if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse)
298 {
299 errno=EPERM;
300 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
301 "NotAuthorized","`%s'",tag);
302 return(MagickFalse);
303 }
304 #if defined(MAGICKCORE_MODULES_SUPPORT)
305 (void) tag;
306 (void) argc;
307 (void) argv;
308 (void) exception;
309 #else
310 {
311 extern size_t
312 analyzeImage(Image **,const int,char **,ExceptionInfo *);
313
314 ImageFilterHandler
315 *image_filter;
316
317 image_filter=(ImageFilterHandler *) NULL;
318 if (LocaleCompare("analyze",tag) == 0)
319 image_filter=(ImageFilterHandler *) analyzeImage;
320 if (image_filter == (ImageFilterHandler *) NULL)
321 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
322 "UnableToLoadModule","`%s'",tag);
323 else
324 {
325 size_t
326 signature;
327
328 if ((*image)->debug != MagickFalse)
329 (void) LogMagickEvent(CoderEvent,GetMagickModule(),
330 "Invoking \"%s\" static image filter",tag);
331 signature=image_filter(image,argc,argv,exception);
332 if ((*image)->debug != MagickFalse)
333 (void) LogMagickEvent(CoderEvent,GetMagickModule(),"\"%s\" completes",
334 tag);
335 if (signature != MagickImageFilterSignature)
336 {
337 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
338 "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
339 (unsigned long) signature,(unsigned long)
340 MagickImageFilterSignature);
341 return(MagickFalse);
342 }
343 }
344 }
345 #endif
346 return(MagickTrue);
347 }
348 #endif
349
350 /*
351 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352 % %
353 % %
354 % %
355 % R e g i s t e r S t a t i c M o d u l e %
356 % %
357 % %
358 % %
359 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
360 %
361 % RegisterStaticModule() statically registers a module.
362 %
363 % The format of the RegisterStaticModule method is:
364 %
365 % MagickBooleanType RegisterStaticModule(const char module,
366 % ExceptionInfo *exception)
367 %
368 % A description of each parameter follows:
369 %
370 % o module: the want to register.
371 %
372 % o exception: return any errors or warnings in this structure.
373 %
374 */
RegisterStaticModule(const char * module,ExceptionInfo * exception)375 MagickExport MagickBooleanType RegisterStaticModule(const char *module,
376 ExceptionInfo *exception)
377 {
378 char
379 module_name[MagickPathExtent];
380
381 PolicyRights
382 rights;
383
384 const CoderInfo
385 *p;
386
387 size_t
388 extent;
389
390 ssize_t
391 i;
392
393 /*
394 Assign module name from alias.
395 */
396 assert(module != (const char *) NULL);
397 (void) CopyMagickString(module_name,module,MagickPathExtent);
398 p=GetCoderInfo(module,exception);
399 if (p != (CoderInfo *) NULL)
400 (void) CopyMagickString(module_name,p->name,MagickPathExtent);
401 rights=ReadPolicyRights|WritePolicyRights;
402 if (IsRightsAuthorized(ModulePolicyDomain,rights,module_name) == MagickFalse)
403 {
404 errno=EPERM;
405 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
406 "NotAuthorized","`%s'",module);
407 return(MagickFalse);
408 }
409 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
410 for (i=0; i < (ssize_t) extent; i++)
411 if (LocaleCompare(MagickModules[i].module,module_name) == 0)
412 {
413 if (MagickModules[i].registered == MagickFalse)
414 {
415 (void) (MagickModules[i].register_module)();
416 MagickModules[i].registered=MagickTrue;
417 }
418 return(MagickTrue);
419 }
420 return(MagickFalse);
421 }
422
423 /*
424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
425 % %
426 % %
427 % %
428 % R e g i s t e r S t a t i c M o d u l e s %
429 % %
430 % %
431 % %
432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
433 %
434 % RegisterStaticModules() statically registers all the available module
435 % handlers.
436 %
437 % The format of the RegisterStaticModules method is:
438 %
439 % (void) RegisterStaticModules(void)
440 %
441 */
RegisterStaticModules(void)442 MagickExport void RegisterStaticModules(void)
443 {
444 PolicyRights
445 rights;
446
447 size_t
448 extent;
449
450 ssize_t
451 i;
452
453 rights=ReadPolicyRights|WritePolicyRights;
454 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
455 for (i=0; i < (ssize_t) extent; i++)
456 {
457 if (MagickModules[i].registered == MagickFalse)
458 {
459 if (IsRightsAuthorized(ModulePolicyDomain,rights,
460 MagickModules[i].module) == MagickFalse)
461 continue;
462 (void) (MagickModules[i].register_module)();
463 MagickModules[i].registered=MagickTrue;
464 }
465 }
466 }
467
468 /*
469 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
470 % %
471 % %
472 % %
473 % U n r e g i s t e r S t a t i c M o d u l e %
474 % %
475 % %
476 % %
477 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
478 %
479 % UnregisterStaticModule() statically unregisters the named module.
480 %
481 % The format of the UnregisterStaticModule method is:
482 %
483 % MagickBooleanType UnregisterStaticModule(const char *module)
484 %
485 % A description of each parameter follows:
486 %
487 % o module: the module we want to unregister.
488 %
489 */
UnregisterStaticModule(const char * module)490 MagickExport MagickBooleanType UnregisterStaticModule(const char *module)
491 {
492 size_t
493 extent;
494
495 ssize_t
496 i;
497
498 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
499 for (i=0; i < (ssize_t) extent; i++)
500 if (LocaleCompare(MagickModules[i].module,module) == 0)
501 {
502 if (MagickModules[i].registered != MagickFalse)
503 {
504 (MagickModules[i].unregister_module)();
505 MagickModules[i].registered=MagickFalse;
506 }
507 return(MagickTrue);
508 }
509 return(MagickFalse);
510 }
511
512 /*
513 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
514 % %
515 % %
516 % %
517 % U n r e g i s t e r S t a t i c M o d u l e s %
518 % %
519 % %
520 % %
521 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
522 %
523 % UnregisterStaticModules() statically unregisters all the available module
524 % handlers.
525 %
526 % The format of the UnregisterStaticModules method is:
527 %
528 % UnregisterStaticModules(void)
529 %
530 */
UnregisterStaticModules(void)531 MagickExport void UnregisterStaticModules(void)
532 {
533 size_t
534 extent;
535
536 ssize_t
537 i;
538
539 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
540 for (i=0; i < (ssize_t) extent; i++)
541 {
542 if (MagickModules[i].registered != MagickFalse)
543 {
544 (MagickModules[i].unregister_module)();
545 MagickModules[i].registered=MagickFalse;
546 }
547 }
548 }
549