registry.c

Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %           RRRR    EEEEE    GGG   IIIII  SSSSS  TTTTT  RRRR   Y   Y          %
00007 %           R   R   E       G        I    SS       T    R   R   Y Y           %
00008 %           RRRR    EEE     G GGG    I     SSS     T    RRRR     Y            %
00009 %           R R     E       G   G    I       SS    T    R R      Y            %
00010 %           R  R    EEEEE    GGG   IIIII  SSSSS    T    R  R     Y            %
00011 %                                                                             %
00012 %                                                                             %
00013 %                       MagickCore Registry Methods                           %
00014 %                                                                             %
00015 %                              Software Design                                %
00016 %                                John Cristy                                  %
00017 %                                 March 2000                                  %
00018 %                                                                             %
00019 %                                                                             %
00020 %  Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization      %
00021 %  dedicated to making software imaging solutions freely available.           %
00022 %                                                                             %
00023 %  You may not use this file except in compliance with the License.  You may  %
00024 %  obtain a copy of the License at                                            %
00025 %                                                                             %
00026 %    http://www.imagemagick.org/script/license.php                            %
00027 %                                                                             %
00028 %  Unless required by applicable law or agreed to in writing, software        %
00029 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00030 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00031 %  See the License for the specific language governing permissions and        %
00032 %  limitations under the License.                                             %
00033 %                                                                             %
00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00035 %
00036 %
00037 %
00038 */
00039 
00040 /*
00041   Include declarations.
00042 */
00043 #include "magick/studio.h"
00044 #include "magick/exception.h"
00045 #include "magick/exception-private.h"
00046 #include "magick/image.h"
00047 #include "magick/list.h"
00048 #include "magick/memory_.h"
00049 #include "magick/registry.h"
00050 #include "magick/splay-tree.h"
00051 #include "magick/string_.h"
00052 #include "magick/utility.h"
00053 
00054 /*
00055   Typedef declarations.
00056 */
00057 typedef struct _RegistryInfo
00058 {
00059   RegistryType
00060     type;
00061 
00062   void
00063     *value;
00064 
00065   unsigned long
00066     signature;
00067 } RegistryInfo;
00068 
00069 /*
00070   Static declarations.
00071 */
00072 static SplayTreeInfo
00073   *registry = (SplayTreeInfo *) NULL;
00074 
00075 /*
00076 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00077 %                                                                             %
00078 %                                                                             %
00079 %                                                                             %
00080 %   D e f i n e I m a g e R e g i s t r y                                     %
00081 %                                                                             %
00082 %                                                                             %
00083 %                                                                             %
00084 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00085 %
00086 %  DefineImageRegistry() associates a key/value pair with the image registry.
00087 %
00088 %  The format of the DefineImageRegistry method is:
00089 %
00090 %      MagickBooleanType DefineImageRegistry(const RegistryType type,
00091 %        const char *option,ExceptionInfo *exception)
00092 %
00093 %  A description of each parameter follows:
00094 %
00095 %    o type: the type.
00096 %
00097 %    o option: the option.
00098 %
00099 %    o exception: the exception.
00100 %
00101 */
00102 MagickExport MagickBooleanType DefineImageRegistry(const RegistryType type,
00103   const char *option,ExceptionInfo *exception)
00104 {
00105   char
00106     key[MaxTextExtent],
00107     value[MaxTextExtent];
00108 
00109   register char
00110     *p;
00111 
00112   assert(option != (const char *) NULL);
00113   (void) CopyMagickString(key,option,MaxTextExtent);
00114   for (p=key; *p != '\0'; p++)
00115     if (*p == '=')
00116       break;
00117   *value='\0';
00118   if (*p == '=')
00119     (void) CopyMagickString(value,p+1,MaxTextExtent);
00120   *p='\0';
00121   return(SetImageRegistry(type,key,value,exception));
00122 }
00123 
00124 /*
00125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00126 %                                                                             %
00127 %                                                                             %
00128 %                                                                             %
00129 %   D e l e t e I m a g e R e g i s t r y                                     %
00130 %                                                                             %
00131 %                                                                             %
00132 %                                                                             %
00133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00134 %
00135 %  DeleteImageRegistry() deletes a key from the image registry.
00136 %
00137 %  The format of the DeleteImageRegistry method is:
00138 %
00139 %      MagickBooleanType DeleteImageRegistry(const char *key)
00140 %
00141 %  A description of each parameter follows:
00142 %
00143 %    o key: the registry.
00144 %
00145 */
00146 MagickExport MagickBooleanType DeleteImageRegistry(const char *key)
00147 {
00148   if (IsEventLogging() != MagickFalse)
00149     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
00150   if (registry == (void *) NULL)
00151     return(MagickFalse);
00152   return(DeleteNodeFromSplayTree(registry,key));
00153 }
00154 
00155 /*
00156 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00157 %                                                                             %
00158 %                                                                             %
00159 %                                                                             %
00160 %   D e s t r o y I m a g e R e g i s t r y                                   %
00161 %                                                                             %
00162 %                                                                             %
00163 %                                                                             %
00164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00165 %
00166 %  DestroyImageRegistry() releases memory associated with the image registry.
00167 %
00168 %  The format of the DestroyDefines method is:
00169 %
00170 %      void DestroyImageRegistry(void)
00171 %
00172 */
00173 MagickExport void DestroyImageRegistry(void)
00174 {
00175   if (IsEventLogging() != MagickFalse)
00176     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00177   if (registry != (void *) NULL)
00178     registry=DestroySplayTree(registry);
00179 }
00180 
00181 /*
00182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00183 %                                                                             %
00184 %                                                                             %
00185 %                                                                             %
00186 %   G e t I m a g e R e g i s t r y                                           %
00187 %                                                                             %
00188 %                                                                             %
00189 %                                                                             %
00190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00191 %
00192 %  GetImageRegistry() returns a value associated with an image registry key.
00193 %
00194 %  The format of the GetImageRegistry method is:
00195 %
00196 %      const void *GetImageRegistry(const RegistryType type,const char *key,
00197 %        ExceptionInfo *exception)
00198 %
00199 %  A description of each parameter follows:
00200 %
00201 %    o type: the type.
00202 %
00203 %    o key: the key.
00204 %
00205 %    o exception: the exception.
00206 %
00207 */
00208 MagickExport const void *GetImageRegistry(const RegistryType type,
00209   const char *key,ExceptionInfo *exception)
00210 {
00211   const void
00212     *value;
00213 
00214   RegistryInfo
00215     *registry_info;
00216 
00217   if (IsEventLogging() != MagickFalse)
00218     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
00219   if (registry == (void *) NULL)
00220     return((const char *) NULL);
00221   registry_info=(RegistryInfo *) GetValueFromSplayTree(registry,key);
00222   if (registry_info == (void *) NULL)
00223     {
00224       (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
00225         "UnableToGetRegistryID","`%s'",key);
00226       return((void *) NULL);
00227     }
00228   value=(void *) NULL;
00229   switch (type)
00230   {
00231     case ImageRegistryType:
00232     {
00233       if (type == registry_info->type)
00234         value=(void *) CloneImageList((Image *) registry_info->value,exception);
00235       break;
00236     }
00237     case ImageInfoRegistryType:
00238     {
00239       if (type == registry_info->type)
00240         value=(void *) CloneImageInfo((ImageInfo *) registry_info->value);
00241       break;
00242     }
00243     case StringRegistryType:
00244     {
00245       switch (registry_info->type)
00246       {
00247         case ImageRegistryType:
00248         {
00249           value=(Image *) ConstantString(((Image *)
00250             registry_info->value)->filename);
00251           break;
00252         }
00253         case ImageInfoRegistryType:
00254         {
00255           value=(Image *) ConstantString(((ImageInfo *)
00256             registry_info->value)->filename);
00257           break;
00258         }
00259         case StringRegistryType:
00260         {
00261           value=(void *) ConstantString((char *) registry_info->value);
00262           break;
00263         }
00264         default:
00265           break;
00266       }
00267       break;
00268     }
00269     default:
00270       break;
00271   }
00272   return(value);
00273 }
00274 
00275 /*
00276 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00277 %                                                                             %
00278 %                                                                             %
00279 %                                                                             %
00280 %   G e t N e x t I m a g e R e g i s t r y                                   %
00281 %                                                                             %
00282 %                                                                             %
00283 %                                                                             %
00284 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00285 %
00286 %  GetNextImageRegistry() gets the next image registry value.
00287 %
00288 %  The format of the GetNextImageRegistry method is:
00289 %
00290 %      char *GetNextImageRegistry(void)
00291 %
00292 */
00293 MagickExport char *GetNextImageRegistry(void)
00294 {
00295   if (IsEventLogging() != MagickFalse)
00296     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00297   if (registry == (void *) NULL)
00298     return((char *) NULL);
00299   return((char *) GetNextKeyInSplayTree(registry));
00300 }
00301 
00302 /*
00303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00304 %                                                                             %
00305 %                                                                             %
00306 %                                                                             %
00307 %   R e m o v e I m a g e R e g i s t r y                                     %
00308 %                                                                             %
00309 %                                                                             %
00310 %                                                                             %
00311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00312 %
00313 %  RemoveImageRegistry() removes a key from the image registry and returns its
00314 %  value.
00315 %
00316 %  The format of the RemoveImageRegistry method is:
00317 %
00318 %      void *RemoveImageRegistry(const char *key)
00319 %
00320 %  A description of each parameter follows:
00321 %
00322 %    o key: the registry.
00323 %
00324 */
00325 MagickExport void *RemoveImageRegistry(const char *key)
00326 {
00327   if (IsEventLogging() != MagickFalse)
00328     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
00329   if (registry == (void *) NULL)
00330     return((void *) NULL);
00331   return(RemoveNodeFromSplayTree(registry,key));
00332 }
00333 
00334 /*
00335 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00336 %                                                                             %
00337 %                                                                             %
00338 %                                                                             %
00339 %   R e s e t I m a g e R e g i s t r y I t e r a t o r                       %
00340 %                                                                             %
00341 %                                                                             %
00342 %                                                                             %
00343 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00344 %
00345 %  ResetImageRegistryIterator() resets the registry iterator.  Use it in
00346 %  conjunction with GetNextImageRegistry() to iterate over all the values
00347 %  in the image registry.
00348 %
00349 %  The format of the ResetImageRegistryIterator method is:
00350 %
00351 %      ResetImageRegistryIterator(void)
00352 %
00353 */
00354 MagickExport void ResetImageRegistryIterator(void)
00355 {
00356   if (IsEventLogging() != MagickFalse)
00357     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00358   if (registry == (void *) NULL)
00359     return;
00360   ResetSplayTreeIterator(registry);
00361 }
00362 
00363 /*
00364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00365 %                                                                             %
00366 %                                                                             %
00367 %                                                                             %
00368 %   S e t I m a g e R e g i s t r y                                           %
00369 %                                                                             %
00370 %                                                                             %
00371 %                                                                             %
00372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00373 %
00374 %  SetImageRegistry() associates a value with an image registry key.
00375 %
00376 %  The format of the SetImageRegistry method is:
00377 %
00378 %      MagickBooleanType SetImageRegistry(const RegistryType type,
00379 %        const char *key,const void *value,ExceptionInfo *exception)
00380 %
00381 %  A description of each parameter follows:
00382 %
00383 %    o type: the type.
00384 %
00385 %    o key: the key.
00386 %
00387 %    o value: the value.
00388 %
00389 %    o exception: the exception.
00390 %
00391 */
00392 
00393 static void *DestroyRegistryNode(void *registry_info)
00394 {
00395   register RegistryInfo
00396     *p;
00397        
00398   p=(RegistryInfo *) registry_info;
00399   switch (p->type)
00400   {
00401     case StringRegistryType:
00402     default:
00403     {
00404       p->value=RelinquishMagickMemory(p->value);
00405       break;
00406     }
00407     case ImageRegistryType:
00408     {
00409       p->value=(void *) DestroyImageList((Image *) p->value);
00410       break;
00411     }
00412     case ImageInfoRegistryType:
00413     {
00414       p->value=(void *) DestroyImageInfo((ImageInfo *) p->value);
00415       break;
00416     }
00417   } 
00418   return(RelinquishMagickMemory(p));
00419 }
00420 
00421 MagickExport MagickBooleanType SetImageRegistry(const RegistryType type,
00422   const char *key,const void *value,ExceptionInfo *exception)
00423 {
00424   MagickBooleanType
00425     status;
00426 
00427   RegistryInfo
00428     *registry_info;
00429 
00430   void
00431     *clone_value;
00432 
00433   if (IsEventLogging() != MagickFalse)
00434     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",key);
00435   clone_value=(void *) NULL;
00436   switch (type)
00437   {
00438     case StringRegistryType:
00439     default:
00440     {
00441       clone_value=(void *) ConstantString((char *) value);
00442       break;
00443     }
00444     case ImageRegistryType:
00445     {
00446       Image
00447         *image;
00448 
00449       image=(Image *) value;
00450       if (image->signature != MagickSignature)
00451         {
00452           (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
00453             "UnableToSetRegistry",key);
00454           return(MagickFalse);
00455         }
00456       clone_value=(void *) CloneImageList(image,exception);
00457       break;
00458     }
00459     case ImageInfoRegistryType:
00460     {
00461       ImageInfo
00462         *image_info;
00463 
00464       image_info=(ImageInfo *) value;
00465       if (image_info->signature != MagickSignature)
00466         {
00467           (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
00468             "UnableToSetRegistry",key);
00469           return(MagickFalse);
00470         }
00471       clone_value=(void *) CloneImageInfo(image_info);
00472       break;
00473     }
00474   }
00475   if (clone_value == (void *) NULL)
00476     return(MagickFalse);
00477   registry_info=(RegistryInfo *) AcquireMagickMemory(sizeof(*registry_info));
00478   if (registry_info == (RegistryInfo *) NULL)
00479     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
00480   (void) ResetMagickMemory(registry_info,0,sizeof(*registry_info));
00481   registry_info->type=type;
00482   registry_info->value=clone_value;
00483   registry_info->signature=MagickSignature;
00484   if (registry == (void *) NULL)
00485     registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
00486       DestroyRegistryNode);
00487   status=AddValueToSplayTree(registry,ConstantString(key),registry_info);
00488   return(status);
00489 }

Generated on Sat Nov 22 23:45:17 2008 for MagickCore by  doxygen 1.5.7.1