cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 % |
cristy | de984cd | 2013-12-01 14:49:27 +0000 | [diff] [blame] | 16 | % Cristy % |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 17 | % March 2000 % |
| 18 | % % |
| 19 | % % |
Cristy | d842011 | 2021-01-01 14:52:00 -0500 | [diff] [blame] | 20 | % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 | % % |
Cristy | 9ddfcca | 2018-09-09 19:46:34 -0400 | [diff] [blame] | 26 | % https://imagemagick.org/script/license.php % |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 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 | */ |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 39 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 40 | /* |
| 41 | Include declarations. |
| 42 | */ |
cristy | 4c08aed | 2011-07-01 19:47:50 +0000 | [diff] [blame] | 43 | #include "MagickCore/studio.h" |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 44 | #include "MagickCore/coder.h" |
cristy | 4c08aed | 2011-07-01 19:47:50 +0000 | [diff] [blame] | 45 | #include "MagickCore/exception-private.h" |
| 46 | #include "MagickCore/image.h" |
| 47 | #include "MagickCore/module.h" |
| 48 | #include "MagickCore/policy.h" |
| 49 | #include "MagickCore/static.h" |
| 50 | #include "MagickCore/string_.h" |
Dirk Lemstra | 7903f95 | 2018-10-04 21:55:17 +0200 | [diff] [blame] | 51 | #include "coders/coders.h" |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 52 | |
Dirk Lemstra | 7903f95 | 2018-10-04 21:55:17 +0200 | [diff] [blame] | 53 | /* |
| 54 | Define declarations. |
| 55 | */ |
Dirk Lemstra | dee4d66 | 2018-10-06 17:43:14 +0200 | [diff] [blame] | 56 | #define AddMagickCoder(coder) { #coder, MagickFalse, \ |
Dirk Lemstra | 7903f95 | 2018-10-04 21:55:17 +0200 | [diff] [blame] | 57 | Register ## coder ## Image, Unregister ## coder ## Image }, |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 58 | |
Cristy | 0ea771d | 2018-01-28 09:03:48 -0500 | [diff] [blame] | 59 | /* |
| 60 | ImageMagick module stub. |
| 61 | */ |
| 62 | ModuleExport size_t RegisterUndefinedImage(void) |
| 63 | { |
| 64 | return(MagickImageCoderSignature); |
| 65 | } |
| 66 | |
| 67 | ModuleExport void UnregisterUndefinedImage(void) |
| 68 | { |
| 69 | } |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 70 | |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 71 | /* |
| 72 | ImageMagick modules. |
| 73 | */ |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 74 | static struct |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 75 | { |
Cristy | c733b9c | 2018-01-27 12:46:37 -0500 | [diff] [blame] | 76 | const char |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 77 | *module; |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 78 | |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 79 | MagickBooleanType |
| 80 | registered; |
| 81 | |
Cristy | b9eb885 | 2018-02-10 15:25:04 -0500 | [diff] [blame] | 82 | size_t |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 83 | (*register_module)(void); |
| 84 | |
Cristy | b9eb885 | 2018-02-10 15:25:04 -0500 | [diff] [blame] | 85 | void |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 86 | (*unregister_module)(void); |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 87 | } MagickModules[] = { |
Cristy | 72ab776 | 2018-02-21 20:44:49 -0500 | [diff] [blame] | 88 | #if !defined(MAGICKCORE_BUILD_MODULES) |
Dirk Lemstra | 7903f95 | 2018-10-04 21:55:17 +0200 | [diff] [blame] | 89 | #include "coders/coders-list.h" |
Cristy | d93c63e | 2018-02-21 20:31:33 -0500 | [diff] [blame] | 90 | #endif |
Cristy | 0ea771d | 2018-01-28 09:03:48 -0500 | [diff] [blame] | 91 | { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage } |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 92 | }; |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 93 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 94 | /* |
| 95 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 96 | % % |
| 97 | % % |
| 98 | % % |
| 99 | % I n v o k e S t a t i c I m a g e F i l t e r % |
| 100 | % % |
| 101 | % % |
| 102 | % % |
| 103 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 104 | % |
| 105 | % InvokeStaticImageFilter() invokes a static image filter. |
| 106 | % |
| 107 | % The format of the InvokeStaticImageFilter method is: |
| 108 | % |
| 109 | % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image, |
| 110 | % const int argc,const char **argv) |
| 111 | % |
| 112 | % A description of each parameter follows: |
| 113 | % |
| 114 | % o tag: the module tag. |
| 115 | % |
| 116 | % o image: the image. |
| 117 | % |
| 118 | % o argc: the number of elements in the argument vector. |
| 119 | % |
| 120 | % o argv: A text array containing the command line arguments. |
| 121 | % |
| 122 | % o argv: A text array containing the command line arguments. |
| 123 | % |
| 124 | % o exception: return any errors or warnings in this structure. |
| 125 | % |
| 126 | */ |
| 127 | #if defined(MAGICKCORE_MODULES_SUPPORT) |
| 128 | MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag, |
| 129 | Image **image,const int argc,const char **argv,ExceptionInfo *exception) |
| 130 | { |
| 131 | PolicyRights |
| 132 | rights; |
| 133 | |
| 134 | assert(image != (Image **) NULL); |
cristy | e1c94d9 | 2015-06-28 12:16:33 +0000 | [diff] [blame] | 135 | assert((*image)->signature == MagickCoreSignature); |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 136 | if ((*image)->debug != MagickFalse) |
| 137 | (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); |
| 138 | rights=ReadPolicyRights; |
| 139 | if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse) |
| 140 | { |
cristy | a9197f6 | 2010-01-12 02:23:34 +0000 | [diff] [blame] | 141 | errno=EPERM; |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 142 | (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, |
cristy | efe601c | 2013-01-05 17:51:12 +0000 | [diff] [blame] | 143 | "NotAuthorized","`%s'",tag); |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 144 | return(MagickFalse); |
| 145 | } |
Cristy | 9a772e8 | 2018-01-31 11:23:07 -0500 | [diff] [blame] | 146 | #if defined(MAGICKCORE_MODULES_SUPPORT) |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 147 | (void) tag; |
| 148 | (void) argc; |
| 149 | (void) argv; |
| 150 | (void) exception; |
| 151 | #else |
| 152 | { |
cristy | bb50337 | 2010-05-27 20:51:26 +0000 | [diff] [blame] | 153 | extern size_t |
cristy | a0b81c3 | 2010-01-22 02:54:33 +0000 | [diff] [blame] | 154 | analyzeImage(Image **,const int,char **,ExceptionInfo *); |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 155 | |
| 156 | ImageFilterHandler |
| 157 | *image_filter; |
| 158 | |
| 159 | image_filter=(ImageFilterHandler *) NULL; |
| 160 | if (LocaleCompare("analyze",tag) == 0) |
cristy | c4c8d13 | 2010-01-07 01:58:38 +0000 | [diff] [blame] | 161 | image_filter=(ImageFilterHandler *) analyzeImage; |
cristy | a6de29a | 2010-06-30 14:34:26 +0000 | [diff] [blame] | 162 | if (image_filter == (ImageFilterHandler *) NULL) |
| 163 | (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, |
cristy | efe601c | 2013-01-05 17:51:12 +0000 | [diff] [blame] | 164 | "UnableToLoadModule","`%s'",tag); |
cristy | a6de29a | 2010-06-30 14:34:26 +0000 | [diff] [blame] | 165 | else |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 166 | { |
cristy | bb50337 | 2010-05-27 20:51:26 +0000 | [diff] [blame] | 167 | size_t |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 168 | signature; |
| 169 | |
| 170 | if ((*image)->debug != MagickFalse) |
| 171 | (void) LogMagickEvent(CoderEvent,GetMagickModule(), |
| 172 | "Invoking \"%s\" static image filter",tag); |
| 173 | signature=image_filter(image,argc,argv,exception); |
| 174 | if ((*image)->debug != MagickFalse) |
| 175 | (void) LogMagickEvent(CoderEvent,GetMagickModule(),"\"%s\" completes", |
| 176 | tag); |
| 177 | if (signature != MagickImageFilterSignature) |
| 178 | { |
| 179 | (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, |
anthony | e5b3965 | 2012-04-21 05:37:29 +0000 | [diff] [blame] | 180 | "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag, |
cristy | b65b330 | 2010-05-29 16:58:33 +0000 | [diff] [blame] | 181 | (unsigned long) signature,(unsigned long) |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 182 | MagickImageFilterSignature); |
| 183 | return(MagickFalse); |
| 184 | } |
| 185 | } |
| 186 | } |
| 187 | #endif |
| 188 | return(MagickTrue); |
| 189 | } |
| 190 | #endif |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 191 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 192 | /* |
| 193 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 194 | % % |
| 195 | % % |
| 196 | % % |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 197 | % R e g i s t e r S t a t i c M o d u l e % |
| 198 | % % |
| 199 | % % |
| 200 | % % |
| 201 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 202 | % |
| 203 | % RegisterStaticModule() statically registers a module. |
| 204 | % |
| 205 | % The format of the RegisterStaticModule method is: |
| 206 | % |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 207 | % MagickBooleanType RegisterStaticModule(const char module, |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 208 | % ExceptionInfo *exception) |
| 209 | % |
| 210 | % A description of each parameter follows: |
| 211 | % |
| 212 | % o module: the want to register. |
| 213 | % |
| 214 | % o exception: return any errors or warnings in this structure. |
| 215 | % |
| 216 | */ |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 217 | MagickExport MagickBooleanType RegisterStaticModule(const char *module, |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 218 | ExceptionInfo *exception) |
| 219 | { |
| 220 | char |
| 221 | module_name[MagickPathExtent]; |
| 222 | |
Cristy | 777e314 | 2018-08-24 20:59:00 -0400 | [diff] [blame] | 223 | PolicyRights |
| 224 | rights; |
| 225 | |
Cristy | f2dc1dd | 2020-12-28 13:59:26 -0500 | [diff] [blame] | 226 | const CoderInfo |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 227 | *p; |
| 228 | |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 229 | size_t |
| 230 | extent; |
| 231 | |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 232 | ssize_t |
| 233 | i; |
| 234 | |
| 235 | /* |
| 236 | Assign module name from alias. |
| 237 | */ |
| 238 | assert(module != (const char *) NULL); |
Cristy | 777e314 | 2018-08-24 20:59:00 -0400 | [diff] [blame] | 239 | rights=ReadPolicyRights; |
| 240 | if (IsRightsAuthorized(ModulePolicyDomain,rights,module) == MagickFalse) |
| 241 | { |
| 242 | errno=EPERM; |
| 243 | (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, |
| 244 | "NotAuthorized","`%s'",module); |
| 245 | return(MagickFalse); |
| 246 | } |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 247 | (void) CopyMagickString(module_name,module,MagickPathExtent); |
| 248 | p=GetCoderInfo(module,exception); |
| 249 | if (p != (CoderInfo *) NULL) |
| 250 | (void) CopyMagickString(module_name,p->name,MagickPathExtent); |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 251 | extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| 252 | for (i=0; i < (ssize_t) extent; i++) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 253 | if (LocaleCompare(MagickModules[i].module,module_name) == 0) |
| 254 | { |
| 255 | if (MagickModules[i].registered == MagickFalse) |
| 256 | { |
| 257 | (void) (MagickModules[i].register_module)(); |
| 258 | MagickModules[i].registered=MagickTrue; |
| 259 | } |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 260 | return(MagickTrue); |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 261 | } |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 262 | return(MagickFalse); |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 263 | } |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 264 | |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 265 | /* |
| 266 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 267 | % % |
| 268 | % % |
| 269 | % % |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 270 | % R e g i s t e r S t a t i c M o d u l e s % |
| 271 | % % |
| 272 | % % |
| 273 | % % |
| 274 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 275 | % |
Cristy | 0ea771d | 2018-01-28 09:03:48 -0500 | [diff] [blame] | 276 | % RegisterStaticModules() statically registers all the available module |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 277 | % handlers. |
| 278 | % |
| 279 | % The format of the RegisterStaticModules method is: |
| 280 | % |
| 281 | % (void) RegisterStaticModules(void) |
| 282 | % |
| 283 | */ |
| 284 | MagickExport void RegisterStaticModules(void) |
| 285 | { |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 286 | size_t |
| 287 | extent; |
| 288 | |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 289 | ssize_t |
| 290 | i; |
| 291 | |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 292 | extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| 293 | for (i=0; i < (ssize_t) extent; i++) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 294 | { |
| 295 | if (MagickModules[i].registered == MagickFalse) |
| 296 | { |
| 297 | (void) (MagickModules[i].register_module)(); |
| 298 | MagickModules[i].registered=MagickTrue; |
| 299 | } |
| 300 | } |
| 301 | } |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 302 | |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 303 | /* |
| 304 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 305 | % % |
| 306 | % % |
| 307 | % % |
| 308 | % U n r e g i s t e r S t a t i c M o d u l e % |
| 309 | % % |
| 310 | % % |
| 311 | % % |
| 312 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 313 | % |
| 314 | % UnregisterStaticModule() statically unregisters the named module. |
| 315 | % |
| 316 | % The format of the UnregisterStaticModule method is: |
| 317 | % |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 318 | % MagickBooleanType UnregisterStaticModule(const char *module) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 319 | % |
| 320 | % A description of each parameter follows: |
| 321 | % |
| 322 | % o module: the module we want to unregister. |
| 323 | % |
| 324 | */ |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 325 | MagickExport MagickBooleanType UnregisterStaticModule(const char *module) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 326 | { |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 327 | size_t |
| 328 | extent; |
| 329 | |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 330 | ssize_t |
| 331 | i; |
| 332 | |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 333 | extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| 334 | for (i=0; i < (ssize_t) extent; i++) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 335 | if (LocaleCompare(MagickModules[i].module,module) == 0) |
| 336 | { |
| 337 | if (MagickModules[i].registered != MagickFalse) |
| 338 | { |
| 339 | (MagickModules[i].unregister_module)(); |
| 340 | MagickModules[i].registered=MagickFalse; |
| 341 | } |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 342 | return(MagickTrue); |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 343 | } |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 344 | return(MagickFalse); |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 345 | } |
Cristy | 3c49d7c | 2018-10-07 09:56:28 -0400 | [diff] [blame] | 346 | |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 347 | /* |
| 348 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 349 | % % |
| 350 | % % |
| 351 | % % |
| 352 | % U n r e g i s t e r S t a t i c M o d u l e s % |
| 353 | % % |
| 354 | % % |
| 355 | % % |
| 356 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 357 | % |
| 358 | % UnregisterStaticModules() statically unregisters all the available module |
| 359 | % handlers. |
| 360 | % |
| 361 | % The format of the UnregisterStaticModules method is: |
| 362 | % |
| 363 | % UnregisterStaticModules(void) |
| 364 | % |
| 365 | */ |
| 366 | MagickExport void UnregisterStaticModules(void) |
| 367 | { |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 368 | size_t |
| 369 | extent; |
| 370 | |
Cristy | dbfbc2a | 2018-01-01 08:08:24 -0500 | [diff] [blame] | 371 | ssize_t |
| 372 | i; |
| 373 | |
Cristy | 62a2a48 | 2018-01-28 08:39:43 -0500 | [diff] [blame] | 374 | extent=sizeof(MagickModules)/sizeof(MagickModules[0]); |
| 375 | for (i=0; i < (ssize_t) extent; i++) |
Cristy | 2221db3 | 2018-01-27 19:07:45 -0500 | [diff] [blame] | 376 | { |
| 377 | if (MagickModules[i].registered != MagickFalse) |
| 378 | { |
| 379 | (MagickModules[i].unregister_module)(); |
| 380 | MagickModules[i].registered=MagickFalse; |
| 381 | } |
| 382 | } |
cristy | 3ed852e | 2009-09-05 21:47:34 +0000 | [diff] [blame] | 383 | } |