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