2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % CCCC OOO N N FFFFF IIIII GGGG U U RRRR EEEEE %
7 % C O O NN N F I G U U R R E %
8 % C O O N N N FFF I G GG U U RRRR EEE %
9 % C O O N NN F I G G U U R R E %
10 % CCCC OOO N N F IIIII GGG UUU R R EEEEE %
13 % MagickCore Image Configure Methods %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
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. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/client.h"
45 #include "MagickCore/configure.h"
46 #include "MagickCore/exception.h"
47 #include "MagickCore/exception-private.h"
48 #include "MagickCore/hashmap.h"
49 #include "MagickCore/log.h"
50 #include "MagickCore/memory_.h"
51 #include "MagickCore/semaphore.h"
52 #include "MagickCore/string_.h"
53 #include "MagickCore/token.h"
54 #include "MagickCore/utility.h"
55 #include "MagickCore/xml-tree.h"
60 #define ConfigureFilename "configure.xml"
65 typedef struct _ConfigureMapInfo
75 static const ConfigureMapInfo
78 { "NAME", "ImageMagick" }
82 *configure_list = (LinkedListInfo *) NULL;
85 *configure_semaphore = (SemaphoreInfo *) NULL;
87 static volatile MagickBooleanType
88 instantiate_configure = MagickFalse;
93 static MagickBooleanType
94 InitializeConfigureList(ExceptionInfo *),
95 LoadConfigureLists(const char *,ExceptionInfo *);
98 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102 + C o n f i g u r e C o m p o n e n t G e n e s i s %
106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108 % ConfigureComponentGenesis() instantiates the configure component.
110 % The format of the ConfigureComponentGenesis method is:
112 % MagickBooleanType ConfigureComponentGenesis(void)
115 MagickExport MagickBooleanType ConfigureComponentGenesis(void)
117 AcquireSemaphoreInfo(&configure_semaphore);
122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
126 + C o n f i g u r e C o m p o n e n t T e r m i n u s %
130 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
132 % ConfigureComponentTerminus() destroys the configure component.
134 % The format of the ConfigureComponentTerminus method is:
136 % ConfigureComponentTerminus(void)
140 static void *DestroyConfigureElement(void *configure_info)
142 register ConfigureInfo
145 p=(ConfigureInfo *) configure_info;
146 if (p->exempt == MagickFalse)
148 if (p->value != (char *) NULL)
149 p->value=DestroyString(p->value);
150 if (p->name != (char *) NULL)
151 p->name=DestroyString(p->name);
152 if (p->path != (char *) NULL)
153 p->path=DestroyString(p->path);
155 p=(ConfigureInfo *) RelinquishMagickMemory(p);
156 return((void *) NULL);
159 MagickExport void ConfigureComponentTerminus(void)
161 if (configure_semaphore == (SemaphoreInfo *) NULL)
162 AcquireSemaphoreInfo(&configure_semaphore);
163 LockSemaphoreInfo(configure_semaphore);
164 if (configure_list != (LinkedListInfo *) NULL)
165 configure_list=DestroyLinkedList(configure_list,DestroyConfigureElement);
166 configure_list=(LinkedListInfo *) NULL;
167 instantiate_configure=MagickFalse;
168 UnlockSemaphoreInfo(configure_semaphore);
169 DestroySemaphoreInfo(&configure_semaphore);
173 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
177 % D e s t r o y C o n f i g u r e O p t i o n s %
181 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
183 % DestroyConfigureOptions() releases memory associated with an configure
186 % The format of the DestroyProfiles method is:
188 % LinkedListInfo *DestroyConfigureOptions(Image *image)
190 % A description of each parameter follows:
192 % o image: the image.
196 static void *DestroyOptions(void *option)
198 return(DestroyStringInfo((StringInfo *) option));
201 MagickExport LinkedListInfo *DestroyConfigureOptions(LinkedListInfo *options)
203 assert(options != (LinkedListInfo *) NULL);
204 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
205 return(DestroyLinkedList(options,DestroyOptions));
209 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
213 + G e t C o n f i g u r e I n f o %
217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
219 % GetConfigureInfo() searches the configure list for the specified name and if
220 % found returns attributes for that element.
222 % The format of the GetConfigureInfo method is:
224 % const ConfigureInfo *GetConfigureInfo(const char *name,
225 % ExceptionInfo *exception)
227 % A description of each parameter follows:
229 % o configure_info: GetConfigureInfo() searches the configure list for the
230 % specified name and if found returns attributes for that element.
232 % o name: the configure name.
234 % o exception: return any errors or warnings in this structure.
237 MagickExport const ConfigureInfo *GetConfigureInfo(const char *name,
238 ExceptionInfo *exception)
240 register const ConfigureInfo
243 assert(exception != (ExceptionInfo *) NULL);
244 if ((configure_list == (LinkedListInfo *) NULL) ||
245 (instantiate_configure == MagickFalse))
246 if (InitializeConfigureList(exception) == MagickFalse)
247 return((const ConfigureInfo *) NULL);
248 if ((configure_list == (LinkedListInfo *) NULL) ||
249 (IsLinkedListEmpty(configure_list) != MagickFalse))
250 return((const ConfigureInfo *) NULL);
251 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
252 return((const ConfigureInfo *) GetValueFromLinkedList(configure_list,0));
254 Search for configure tag.
256 LockSemaphoreInfo(configure_semaphore);
257 ResetLinkedListIterator(configure_list);
258 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
259 while (p != (const ConfigureInfo *) NULL)
261 if (LocaleCompare(name,p->name) == 0)
263 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
265 if (p != (ConfigureInfo *) NULL)
266 (void) InsertValueInLinkedList(configure_list,0,
267 RemoveElementByValueFromLinkedList(configure_list,p));
268 UnlockSemaphoreInfo(configure_semaphore);
273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
277 % G e t C o n f i g u r e I n f o L i s t %
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
283 % GetConfigureInfoList() returns any configure options that match the
286 % The format of the GetConfigureInfoList function is:
288 % const ConfigureInfo **GetConfigureInfoList(const char *pattern,
289 % size_t *number_options,ExceptionInfo *exception)
291 % A description of each parameter follows:
293 % o pattern: Specifies a pointer to a text string containing a pattern.
295 % o number_options: This integer returns the number of configure options in
298 % o exception: return any errors or warnings in this structure.
302 #if defined(__cplusplus) || defined(c_plusplus)
306 static int ConfigureInfoCompare(const void *x,const void *y)
312 p=(const ConfigureInfo **) x,
313 q=(const ConfigureInfo **) y;
314 if (LocaleCompare((*p)->path,(*q)->path) == 0)
315 return(LocaleCompare((*p)->name,(*q)->name));
316 return(LocaleCompare((*p)->path,(*q)->path));
319 #if defined(__cplusplus) || defined(c_plusplus)
323 MagickExport const ConfigureInfo **GetConfigureInfoList(const char *pattern,
324 size_t *number_options,ExceptionInfo *exception)
329 register const ConfigureInfo
336 Allocate configure list.
338 assert(pattern != (char *) NULL);
339 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
340 assert(number_options != (size_t *) NULL);
342 p=GetConfigureInfo("*",exception);
343 if (p == (const ConfigureInfo *) NULL)
344 return((const ConfigureInfo **) NULL);
345 options=(const ConfigureInfo **) AcquireQuantumMemory((size_t)
346 GetNumberOfElementsInLinkedList(configure_list)+1UL,sizeof(*options));
347 if (options == (const ConfigureInfo **) NULL)
348 return((const ConfigureInfo **) NULL);
350 Generate configure list.
352 LockSemaphoreInfo(configure_semaphore);
353 ResetLinkedListIterator(configure_list);
354 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
355 for (i=0; p != (const ConfigureInfo *) NULL; )
357 if ((p->stealth == MagickFalse) &&
358 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
360 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
362 UnlockSemaphoreInfo(configure_semaphore);
363 qsort((void *) options,(size_t) i,sizeof(*options),ConfigureInfoCompare);
364 options[i]=(ConfigureInfo *) NULL;
365 *number_options=(size_t) i;
370 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
374 % G e t C o n f i g u r e L i s t %
378 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
380 % GetConfigureList() returns any configure options that match the specified
383 % The format of the GetConfigureList function is:
385 % char **GetConfigureList(const char *pattern,
386 % size_t *number_options,ExceptionInfo *exception)
388 % A description of each parameter follows:
390 % o pattern: Specifies a pointer to a text string containing a pattern.
392 % o number_options: This integer returns the number of options in the list.
394 % o exception: return any errors or warnings in this structure.
398 #if defined(__cplusplus) || defined(c_plusplus)
402 static int ConfigureCompare(const void *x,const void *y)
410 return(LocaleCompare(*p,*q));
413 #if defined(__cplusplus) || defined(c_plusplus)
417 MagickExport char **GetConfigureList(const char *pattern,
418 size_t *number_options,ExceptionInfo *exception)
423 register const ConfigureInfo
430 Allocate configure list.
432 assert(pattern != (char *) NULL);
433 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
434 assert(number_options != (size_t *) NULL);
436 p=GetConfigureInfo("*",exception);
437 if (p == (const ConfigureInfo *) NULL)
438 return((char **) NULL);
439 options=(char **) AcquireQuantumMemory((size_t)
440 GetNumberOfElementsInLinkedList(configure_list)+1UL,sizeof(*options));
441 if (options == (char **) NULL)
442 return((char **) NULL);
443 LockSemaphoreInfo(configure_semaphore);
444 ResetLinkedListIterator(configure_list);
445 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
446 for (i=0; p != (const ConfigureInfo *) NULL; )
448 if ((p->stealth == MagickFalse) &&
449 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
450 options[i++]=ConstantString(p->name);
451 p=(const ConfigureInfo *) GetNextValueInLinkedList(configure_list);
453 UnlockSemaphoreInfo(configure_semaphore);
454 qsort((void *) options,(size_t) i,sizeof(*options),ConfigureCompare);
455 options[i]=(char *) NULL;
456 *number_options=(size_t) i;
461 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
465 % G e t C o n f i g u r e O p t i o n %
469 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
471 % GetConfigureOption() returns the value associated with the configure option.
473 % The format of the GetConfigureOption method is:
475 % char *GetConfigureOption(const char *option)
477 % A description of each parameter follows:
479 % o configure_info: The configure info.
482 MagickExport char *GetConfigureOption(const char *option)
493 assert(option != (const char *) NULL);
494 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",option);
495 exception=AcquireExceptionInfo();
496 configure_info=GetConfigureInfo(option,exception);
497 exception=DestroyExceptionInfo(exception);
498 if (configure_info == (ConfigureInfo *) NULL)
499 return((char *) NULL);
500 value=GetConfigureValue(configure_info);
501 if ((value == (const char *) NULL) || (*value == '\0'))
502 return((char *) NULL);
503 return(ConstantString(value));
507 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
511 % G e t C o n f i g u r e O p t i o n s %
515 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
517 % GetConfigureOptions() returns any Magick configuration options associated
518 % with the specified filename.
520 % The format of the GetConfigureOptions method is:
522 % LinkedListInfo *GetConfigureOptions(const char *filename,
523 % ExceptionInfo *exception)
525 % A description of each parameter follows:
527 % o filename: the configure file name.
529 % o exception: return any errors or warnings in this structure.
532 MagickExport LinkedListInfo *GetConfigureOptions(const char *filename,
533 ExceptionInfo *exception)
548 assert(filename != (const char *) NULL);
549 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
550 assert(exception != (ExceptionInfo *) NULL);
551 (void) CopyMagickString(path,filename,MaxTextExtent);
553 Load XML from configuration files to linked-list.
555 options=NewLinkedList(0);
556 paths=GetConfigurePaths(filename,exception);
557 if (paths != (LinkedListInfo *) NULL)
559 ResetLinkedListIterator(paths);
560 element=(const char *) GetNextValueInLinkedList(paths);
561 while (element != (const char *) NULL)
563 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",element,filename);
564 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
565 "Searching for configure file: \"%s\"",path);
566 xml=ConfigureFileToStringInfo(path);
567 if (xml != (StringInfo *) NULL)
568 (void) AppendValueToLinkedList(options,xml);
569 element=(const char *) GetNextValueInLinkedList(paths);
571 paths=DestroyLinkedList(paths,RelinquishMagickMemory);
573 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
578 blob=(char *) NTResourceToBlob(filename);
579 if (blob != (char *) NULL)
581 xml=StringToStringInfo(blob);
582 SetStringInfoPath(xml,filename);
583 (void) AppendValueToLinkedList(options,xml);
584 blob=DestroyString(blob);
588 if (GetNumberOfElementsInLinkedList(options) == 0)
589 (void) ThrowMagickException(exception,GetMagickModule(),ConfigureWarning,
590 "UnableToOpenConfigureFile","`%s'",filename);
591 ResetLinkedListIterator(options);
596 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
600 % G e t C o n f i g u r e P a t h s %
604 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
606 % GetConfigurePaths() returns any Magick configuration paths associated
607 % with the specified filename.
609 % The format of the GetConfigurePaths method is:
611 % LinkedListInfo *GetConfigurePaths(const char *filename,
612 % ExceptionInfo *exception)
614 % A description of each parameter follows:
616 % o filename: the configure file name.
618 % o exception: return any errors or warnings in this structure.
621 MagickExport LinkedListInfo *GetConfigurePaths(const char *filename,
622 ExceptionInfo *exception)
630 assert(filename != (const char *) NULL);
631 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
632 assert(exception != (ExceptionInfo *) NULL);
633 (void) CopyMagickString(path,filename,MaxTextExtent);
634 paths=NewLinkedList(0);
640 Search $MAGICK_CONFIGURE_PATH.
642 configure_path=GetEnvironmentValue("MAGICK_CONFIGURE_PATH");
643 if (configure_path != (char *) NULL)
649 for (p=configure_path-1; p != (char *) NULL; )
651 (void) CopyMagickString(path,p+1,MaxTextExtent);
652 q=strchr(path,DirectoryListSeparator);
653 if (q != (char *) NULL)
655 q=path+strlen(path)-1;
656 if ((q >= path) && (*q != *DirectorySeparator))
657 (void) ConcatenateMagickString(path,DirectorySeparator,
659 (void) AppendValueToLinkedList(paths,ConstantString(path));
660 p=strchr(p+1,DirectoryListSeparator);
662 configure_path=DestroyString(configure_path);
665 #if defined(MAGICKCORE_INSTALLED_SUPPORT)
666 #if defined(MAGICKCORE_SHARE_PATH)
667 (void) AppendValueToLinkedList(paths,ConstantString(
668 MAGICKCORE_SHARE_PATH));
670 #if defined(MAGICKCORE_CONFIGURE_PATH)
671 (void) AppendValueToLinkedList(paths,ConstantString(
672 MAGICKCORE_CONFIGURE_PATH));
674 #if defined(MAGICKCORE_DOCUMENTATION_PATH)
675 (void) AppendValueToLinkedList(paths,ConstantString(
676 MAGICKCORE_DOCUMENTATION_PATH));
678 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && !(defined(MAGICKCORE_CONFIGURE_PATH) || defined(MAGICKCORE_SHARE_PATH))
687 Locate file via registry key.
689 registry_key="ConfigurePath";
690 key_value=NTRegistryKeyLookup(registry_key);
691 if (key_value != (unsigned char *) NULL)
693 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",(char *) key_value,
695 (void) AppendValueToLinkedList(paths,ConstantString(path));
696 key_value=(unsigned char *) RelinquishMagickMemory(key_value);
706 Search under MAGICK_HOME.
708 home=GetEnvironmentValue("MAGICK_HOME");
709 if (home != (char *) NULL)
711 #if !defined(MAGICKCORE_POSIX_SUPPORT)
712 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",home,
714 (void) AppendValueToLinkedList(paths,ConstantString(path));
716 (void) FormatLocaleString(path,MaxTextExtent,"%s/etc/%s/",home,
717 MAGICKCORE_CONFIGURE_RELATIVE_PATH);
718 (void) AppendValueToLinkedList(paths,ConstantString(path));
719 (void) FormatLocaleString(path,MaxTextExtent,"%s/share/%s/",home,
720 MAGICKCORE_SHARE_RELATIVE_PATH);
721 (void) AppendValueToLinkedList(paths,ConstantString(path));
723 home=DestroyString(home);
726 if (*GetClientPath() != '\0')
728 #if !defined(MAGICKCORE_POSIX_SUPPORT)
729 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",GetClientPath(),
731 (void) AppendValueToLinkedList(paths,ConstantString(path));
734 prefix[MaxTextExtent];
737 Search based on executable directory if directory is known.
739 (void) CopyMagickString(prefix,GetClientPath(),MaxTextExtent);
740 ChopPathComponents(prefix,1);
741 (void) FormatLocaleString(path,MaxTextExtent,"%s/etc/%s/",prefix,
742 MAGICKCORE_CONFIGURE_RELATIVE_PATH);
743 (void) AppendValueToLinkedList(paths,ConstantString(path));
744 (void) FormatLocaleString(path,MaxTextExtent,"%s/share/%s/",prefix,
745 MAGICKCORE_SHARE_RELATIVE_PATH);
746 (void) AppendValueToLinkedList(paths,ConstantString(path));
750 Search current directory.
752 (void) AppendValueToLinkedList(paths,ConstantString(""));
758 home=GetEnvironmentValue("HOME");
759 if (home == (char *) NULL)
760 home=GetEnvironmentValue("USERPROFILE");
761 if (home != (char *) NULL)
764 Search $HOME/.magick.
766 (void) FormatLocaleString(path,MaxTextExtent,"%s%s.magick%s",home,
767 DirectorySeparator,DirectorySeparator);
768 (void) AppendValueToLinkedList(paths,ConstantString(path));
769 home=DestroyString(home);
772 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
775 module_path[MaxTextExtent];
777 if ((NTGetModulePath("CORE_RL_magick_.dll",module_path) != MagickFalse) ||
778 (NTGetModulePath("CORE_DB_magick_.dll",module_path) != MagickFalse))
786 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path,
788 element=(char *) RemoveElementByValueFromLinkedList(paths,path);
789 if (element != (char *) NULL)
790 element=DestroyString(element);
791 (void) AppendValueToLinkedList(paths,ConstantString(path));
793 if (NTGetModulePath("Magick.dll",module_path) != MagickFalse)
796 Search PerlMagick module path.
798 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path,
800 (void) AppendValueToLinkedList(paths,ConstantString(path));
801 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path,
802 "\\inc\\lib\\auto\\Image\\Magick\\");
803 (void) AppendValueToLinkedList(paths,ConstantString(path));
811 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
815 % G e t C o n f i g u r e V a l u e %
819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
821 % GetConfigureValue() returns the value associated with the configure info.
823 % The format of the GetConfigureValue method is:
825 % const char *GetConfigureValue(const ConfigureInfo *configure_info)
827 % A description of each parameter follows:
829 % o configure_info: The configure info.
832 MagickExport const char *GetConfigureValue(const ConfigureInfo *configure_info)
834 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
835 assert(configure_info != (ConfigureInfo *) NULL);
836 assert(configure_info->signature == MagickSignature);
837 return(configure_info->value);
841 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
845 + I n i t i a l i z e C o n f i g u r e L i s t %
849 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
851 % InitializeConfigureList() initializes the configure list.
853 % The format of the InitializeConfigureList method is:
855 % MagickBooleanType InitializeConfigureList(ExceptionInfo *exception)
857 % A description of each parameter follows.
859 % o exception: return any errors or warnings in this structure.
862 static MagickBooleanType InitializeConfigureList(ExceptionInfo *exception)
864 if ((configure_list == (LinkedListInfo *) NULL) &&
865 (instantiate_configure == MagickFalse))
867 if (configure_semaphore == (SemaphoreInfo *) NULL)
868 AcquireSemaphoreInfo(&configure_semaphore);
869 LockSemaphoreInfo(configure_semaphore);
870 if ((configure_list == (LinkedListInfo *) NULL) &&
871 (instantiate_configure == MagickFalse))
873 (void) LoadConfigureLists(ConfigureFilename,exception);
874 instantiate_configure=MagickTrue;
876 UnlockSemaphoreInfo(configure_semaphore);
878 return(configure_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
882 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
886 % L i s t C o n f i g u r e I n f o %
890 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
892 % ListConfigureInfo() lists the configure info to a file.
894 % The format of the ListConfigureInfo method is:
896 % MagickBooleanType ListConfigureInfo(FILE *file,ExceptionInfo *exception)
898 % A description of each parameter follows.
900 % o file: An pointer to a FILE.
902 % o exception: return any errors or warnings in this structure.
905 MagickExport MagickBooleanType ListConfigureInfo(FILE *file,
906 ExceptionInfo *exception)
925 if (file == (const FILE *) NULL)
927 configure_info=GetConfigureInfoList("*",&number_options,exception);
928 if (configure_info == (const ConfigureInfo **) NULL)
930 path=(const char *) NULL;
931 for (i=0; i < (ssize_t) number_options; i++)
933 if (configure_info[i]->stealth != MagickFalse)
935 if ((path == (const char *) NULL) ||
936 (LocaleCompare(path,configure_info[i]->path) != 0))
938 if (configure_info[i]->path != (char *) NULL)
939 (void) FormatLocaleFile(file,"\nPath: %s\n\n",
940 configure_info[i]->path);
941 (void) FormatLocaleFile(file,"Name Value\n");
942 (void) FormatLocaleFile(file,
943 "-------------------------------------------------"
944 "------------------------------\n");
946 path=configure_info[i]->path;
948 if (configure_info[i]->name != (char *) NULL)
949 name=configure_info[i]->name;
950 (void) FormatLocaleFile(file,"%s",name);
951 for (j=(ssize_t) strlen(name); j <= 12; j++)
952 (void) FormatLocaleFile(file," ");
953 (void) FormatLocaleFile(file," ");
955 if (configure_info[i]->value != (char *) NULL)
956 value=configure_info[i]->value;
957 (void) FormatLocaleFile(file,"%s",value);
958 (void) FormatLocaleFile(file,"\n");
961 configure_info=(const ConfigureInfo **)
962 RelinquishMagickMemory((void *) configure_info);
967 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
971 + L o a d C o n f i g u r e L i s t %
975 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
977 % LoadConfigureList() loads the configure configuration file which provides a
978 % mapping between configure attributes and a configure name.
980 % The format of the LoadConfigureList method is:
982 % MagickBooleanType LoadConfigureList(const char *xml,const char *filename,
983 % const size_t depth,ExceptionInfo *exception)
985 % A description of each parameter follows:
987 % o xml: The configure list in XML format.
989 % o filename: The configure list filename.
991 % o depth: depth of <include /> statements.
993 % o exception: return any errors or warnings in this structure.
996 static MagickBooleanType LoadConfigureList(const char *xml,const char *filename,
997 const size_t depth,ExceptionInfo *exception)
1000 keyword[MaxTextExtent],
1013 Load the configure map file.
1015 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1016 "Loading configure file \"%s\" ...",filename);
1017 if (configure_list == (LinkedListInfo *) NULL)
1019 configure_list=NewLinkedList(0);
1020 if (configure_list == (LinkedListInfo *) NULL)
1022 ThrowFileException(exception,ResourceLimitError,
1023 "MemoryAllocationFailed",filename);
1024 return(MagickFalse);
1028 configure_info=(ConfigureInfo *) NULL;
1029 token=AcquireString((char *) xml);
1030 for (q=(char *) xml; *q != '\0'; )
1035 GetMagickToken(q,&q,token);
1038 (void) CopyMagickString(keyword,token,MaxTextExtent);
1039 if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
1044 while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
1045 GetMagickToken(q,&q,token);
1048 if (LocaleNCompare(keyword,"<!--",4) == 0)
1053 while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
1054 GetMagickToken(q,&q,token);
1057 if (LocaleCompare(keyword,"<include") == 0)
1062 while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
1064 (void) CopyMagickString(keyword,token,MaxTextExtent);
1065 GetMagickToken(q,&q,token);
1068 GetMagickToken(q,&q,token);
1069 if (LocaleCompare(keyword,"file") == 0)
1072 (void) ThrowMagickException(exception,GetMagickModule(),
1073 ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
1077 path[MaxTextExtent],
1080 GetPathComponent(filename,HeadPath,path);
1082 (void) ConcatenateMagickString(path,DirectorySeparator,
1084 if (*token == *DirectorySeparator)
1085 (void) CopyMagickString(path,token,MaxTextExtent);
1087 (void) ConcatenateMagickString(path,token,MaxTextExtent);
1088 xml=FileToString(path,~0,exception);
1089 if (xml != (char *) NULL)
1091 status=LoadConfigureList(xml,path,depth+1,exception);
1092 xml=(char *) RelinquishMagickMemory(xml);
1099 if (LocaleCompare(keyword,"<configure") == 0)
1104 configure_info=(ConfigureInfo *) AcquireMagickMemory(
1105 sizeof(*configure_info));
1106 if (configure_info == (ConfigureInfo *) NULL)
1107 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1108 (void) ResetMagickMemory(configure_info,0,sizeof(*configure_info));
1109 configure_info->path=ConstantString(filename);
1110 configure_info->exempt=MagickFalse;
1111 configure_info->signature=MagickSignature;
1114 if (configure_info == (ConfigureInfo *) NULL)
1116 if (LocaleCompare(keyword,"/>") == 0)
1118 status=AppendValueToLinkedList(configure_list,configure_info);
1119 if (status == MagickFalse)
1120 (void) ThrowMagickException(exception,GetMagickModule(),
1121 ResourceLimitError,"MemoryAllocationFailed","`%s'",
1122 configure_info->name);
1123 configure_info=(ConfigureInfo *) NULL;
1126 Parse configure element.
1128 GetMagickToken(q,(const char **) NULL,token);
1131 GetMagickToken(q,&q,token);
1132 GetMagickToken(q,&q,token);
1138 if (LocaleCompare((char *) keyword,"name") == 0)
1140 configure_info->name=ConstantString(token);
1148 if (LocaleCompare((char *) keyword,"stealth") == 0)
1150 configure_info->stealth=IsMagickTrue(token);
1158 if (LocaleCompare((char *) keyword,"value") == 0)
1160 configure_info->value=ConstantString(token);
1169 token=(char *) RelinquishMagickMemory(token);
1174 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1178 % L o a d C o n f i g u r e L i s t s %
1182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1184 % LoadConfigureList() loads one or more configure configuration files which
1185 % provides a mapping between configure attributes and a configure name.
1187 % The format of the LoadConfigureLists method is:
1189 % MagickBooleanType LoadConfigureLists(const char *filename,
1190 % ExceptionInfo *exception)
1192 % A description of each parameter follows:
1194 % o filename: the font file name.
1196 % o exception: return any errors or warnings in this structure.
1199 static MagickBooleanType LoadConfigureLists(const char *filename,
1200 ExceptionInfo *exception)
1215 Load built-in configure map.
1218 if (configure_list == (LinkedListInfo *) NULL)
1220 configure_list=NewLinkedList(0);
1221 if (configure_list == (LinkedListInfo *) NULL)
1223 ThrowFileException(exception,ResourceLimitError,
1224 "MemoryAllocationFailed",filename);
1225 return(MagickFalse);
1228 for (i=0; i < (ssize_t) (sizeof(ConfigureMap)/sizeof(*ConfigureMap)); i++)
1233 register const ConfigureMapInfo
1237 configure_info=(ConfigureInfo *) AcquireMagickMemory(
1238 sizeof(*configure_info));
1239 if (configure_info == (ConfigureInfo *) NULL)
1241 (void) ThrowMagickException(exception,GetMagickModule(),
1242 ResourceLimitError,"MemoryAllocationFailed","`%s'",
1243 configure_info->name);
1246 (void) ResetMagickMemory(configure_info,0,sizeof(*configure_info));
1247 configure_info->path=(char *) "[built-in]";
1248 configure_info->name=(char *) p->name;
1249 configure_info->value=(char *) p->value;
1250 configure_info->exempt=MagickTrue;
1251 configure_info->signature=MagickSignature;
1252 status=AppendValueToLinkedList(configure_list,configure_info);
1253 if (status == MagickFalse)
1254 (void) ThrowMagickException(exception,GetMagickModule(),
1255 ResourceLimitError,"MemoryAllocationFailed","`%s'",
1256 configure_info->name);
1259 Load external configure map.
1261 options=GetConfigureOptions(filename,exception);
1262 option=(const StringInfo *) GetNextValueInLinkedList(options);
1263 while (option != (const StringInfo *) NULL)
1265 status|=LoadConfigureList((const char *) GetStringInfoDatum(option),
1266 GetStringInfoPath(option),0,exception);
1267 option=(const StringInfo *) GetNextValueInLinkedList(options);
1269 options=DestroyConfigureOptions(options);
1270 return(status != 0 ? MagickTrue : MagickFalse);