43#include "magick/studio.h"
44#include "magick/exception.h"
45#include "magick/exception-private.h"
46#include "magick/image.h"
47#include "magick/list.h"
48#include "magick/memory_.h"
49#include "magick/memory-private.h"
50#include "magick/registry.h"
51#include "magick/splay-tree.h"
52#include "magick/string_.h"
53#include "magick/utility.h"
106MagickExport MagickBooleanType DefineImageRegistry(
const RegistryType type,
111 value[MaxTextExtent];
116 assert(option != (
const char *) NULL);
117 (void) CopyMagickString(key,option,MaxTextExtent);
118 for (p=key; *p !=
'\0'; p++)
123 (void) CopyMagickString(value,p+1,MaxTextExtent);
125 return(SetImageRegistry(type,key,value,exception));
150MagickExport MagickBooleanType DeleteImageRegistry(
const char *key)
152 assert(key != (
const char *) NULL);
153 if (IsEventLogging() != MagickFalse)
154 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",key);
155 if (registry == (
void *) NULL)
157 return(DeleteNodeFromSplayTree(registry,key));
187MagickExport
void *GetImageRegistry(
const RegistryType type,
const char *key,
196 assert(key != (
const char *) NULL);
197 if (IsEventLogging() != MagickFalse)
198 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",key);
199 if (registry == (
void *) NULL)
200 return((
void *) NULL);
201 registry_info=(
RegistryInfo *) GetValueFromSplayTree(registry,key);
202 if (registry_info == (
void *) NULL)
203 return((
void *) NULL);
207 case ImageRegistryType:
209 if (type == registry_info->type)
210 value=(
void *) CloneImageList((
Image *) registry_info->value,exception);
213 case ImageInfoRegistryType:
215 if (type == registry_info->type)
216 value=(
void *) CloneImageInfo((
ImageInfo *) registry_info->value);
219 case StringRegistryType:
221 switch (registry_info->type)
223 case ImageRegistryType:
226 registry_info->value)->filename);
229 case ImageInfoRegistryType:
232 registry_info->value)->filename);
235 case StringRegistryType:
237 value=(
void *) ConstantString((
char *) registry_info->value);
269MagickExport
char *GetNextImageRegistry(
void)
271 if (IsEventLogging() != MagickFalse)
272 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
273 if (registry == (
void *) NULL)
274 return((
char *) NULL);
275 return((
char *) GetNextKeyInSplayTree(registry));
296MagickExport MagickBooleanType RegistryComponentGenesis(
void)
299 registry_semaphore=AllocateSemaphoreInfo();
321MagickExport
void RegistryComponentTerminus(
void)
324 ActivateSemaphoreInfo(®istry_semaphore);
325 LockSemaphoreInfo(registry_semaphore);
326 if (IsEventLogging() != MagickFalse)
327 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
328 if (registry != (
void *) NULL)
329 registry=DestroySplayTree(registry);
330 UnlockSemaphoreInfo(registry_semaphore);
331 DestroySemaphoreInfo(®istry_semaphore);
357MagickExport
void *RemoveImageRegistry(
const char *key)
359 assert(key != (
const char *) NULL);
360 if (IsEventLogging() != MagickFalse)
361 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",key);
362 if (registry == (
void *) NULL)
363 return((
void *) NULL);
364 return(RemoveNodeFromSplayTree(registry,key));
387MagickExport
void ResetImageRegistryIterator(
void)
389 if (IsEventLogging() != MagickFalse)
390 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
391 if (registry == (
void *) NULL)
393 ResetSplayTreeIterator(registry);
426static void *DestroyRegistryNode(
void *registry_info)
434 case StringRegistryType:
437 p->value=RelinquishMagickMemory(p->value);
440 case ImageRegistryType:
442 p->value=(
void *) DestroyImageList((
Image *) p->value);
445 case ImageInfoRegistryType:
447 p->value=(
void *) DestroyImageInfo((
ImageInfo *) p->value);
451 return(RelinquishMagickMemory(p));
454MagickExport MagickBooleanType SetImageRegistry(
const RegistryType type,
463 assert(key != (
const char *) NULL);
464 if (IsEventLogging() != MagickFalse)
465 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",key);
466 if (value == (
const void *) NULL)
468 clone_value=(
void *) NULL;
471 case StringRegistryType:
477 string=(
const char *) value;
478 clone_value=(
void *) ConstantString(
string);
481 case ImageRegistryType:
486 image=(
const Image *) value;
487 if ((image == (
const Image *) NULL) ||
488 (image->signature != MagickCoreSignature))
490 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
491 "UnableToSetRegistry",
"%s",key);
494 clone_value=(
void *) CloneImageList(image,exception);
497 case ImageInfoRegistryType:
503 if ((image_info == (
const ImageInfo *) NULL) ||
504 (image_info->signature != MagickCoreSignature))
506 (void) ThrowMagickException(exception,GetMagickModule(),RegistryError,
507 "UnableToSetRegistry",
"%s",key);
510 clone_value=(
void *) CloneImageInfo(image_info);
514 if (clone_value == (
void *) NULL)
516 registry_info=(
RegistryInfo *) AcquireCriticalMemory(
sizeof(*registry_info));
517 (void) memset(registry_info,0,
sizeof(*registry_info));
518 registry_info->type=type;
519 registry_info->value=clone_value;
520 registry_info->signature=MagickCoreSignature;
524 ActivateSemaphoreInfo(®istry_semaphore);
525 LockSemaphoreInfo(registry_semaphore);
527 registry=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
528 DestroyRegistryNode);
529 UnlockSemaphoreInfo(registry_semaphore);
531 return(AddValueToSplayTree(registry,ConstantString(key),registry_info));