/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + R e a d C o n f i g u r e F i l e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Method ReadConfigureFile reads the color configuration file which maps % color strings with a particular image format. % % The format of the ReadConfigureFile method is: % % unsigned int ReadConfigureFile(const char *basename, % const unsigned long depth,ExceptionInfo *exception) % % A description of each parameter follows: % % o status: Method ReadConfigureFile returns True if at least one color % is defined otherwise False. % % o basename: The color configuration filename. % % o depth: depth of <include /> statements. % % o exception: Return any errors or warnings in this structure. % % */ #if defined(MSWINDOWS) static void CatDelegatePath(char *path, const char *binpath, const char *command) { strcpy(path,binpath); strcat(path,command); if (IsAccessibleNoLogging(path)) return; strcpy(path,command); return; } #endif /* defined(MSWINDOWS) */ static unsigned int ReadConfigureFile(const char *basename, const unsigned long depth,ExceptionInfo *exception) { char keyword[MaxTextExtent], path[MaxTextExtent], *q, *token, *xml; size_t length; /* Read the delegates configure file. */ (void) strcpy(path,basename); if (depth == 0) xml=(char *) GetConfigureBlob(basename,path,&length,exception); else xml=(char *) FileToBlob(basename,&length,exception); if (xml == (char *) NULL) xml=AllocateString(DelegateMap); token=AllocateString(xml); for (q=xml; *q != '\0'; ) { /* Interpret XML. */ GetToken(q,&q,token); if (*token == '\0') break; (void) strlcpy(keyword,token,MaxTextExtent); if (LocaleNCompare(keyword,"<!--",4) == 0) { /* Comment element. */ while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0')) GetToken(q,&q,token); continue; } if (LocaleCompare(keyword,"<include") == 0) { /* Include element. */ while ((*token != '>') && (*q != '\0')) { (void) strlcpy(keyword,token,MaxTextExtent); GetToken(q,&q,token); if (*token != '=') continue; GetToken(q,&q,token); if (LocaleCompare(keyword,"file") == 0) { if (depth > 200) ThrowException(exception,ConfigureError,IncludeElementNestedTooDeeply,path); else { char filename[MaxTextExtent]; GetPathComponent(path,HeadPath,filename); if (*filename != '\0') (void) strlcat(filename,DirectorySeparator,MaxTextExtent); (void) strlcat(filename,token,MaxTextExtent); (void) ReadConfigureFile(filename,depth+1,exception); } if (delegate_list != (DelegateInfo *) NULL) while (delegate_list->next != (DelegateInfo *) NULL) delegate_list=delegate_list->next; } } continue; } if (LocaleCompare(keyword,"<delegate") == 0) { DelegateInfo *delegate_info; /* Allocate memory for the delegate list. */ delegate_info=MagickAllocateMemory(DelegateInfo *,sizeof(DelegateInfo)); if (delegate_info == (DelegateInfo *) NULL) MagickFatalError3(ResourceLimitFatalError,MemoryAllocationFailed, UnableToAllocateDelegateInfo); (void) memset(delegate_info,0,sizeof(DelegateInfo)); delegate_info->path=AcquireString(path); delegate_info->signature=MagickSignature; if (delegate_list == (DelegateInfo *) NULL) { delegate_list=delegate_info; continue; } delegate_list->next=delegate_info; delegate_info->previous=delegate_list; delegate_list=delegate_list->next; continue; } if (delegate_list == (DelegateInfo *) NULL) continue; GetToken(q,(char **) NULL,token); if (*token != '=') continue; GetToken(q,&q,token); GetToken(q,&q,token); switch (*keyword) { case 'C': case 'c': { if (LocaleCompare((char *) keyword,"command") == 0) { delegate_list->commands=AllocateString(token); #if defined(MSWINDOWS) if (strchr(delegate_list->commands,'@') != (char *) NULL) { char BinPath[MaxTextExtent], path[MaxTextExtent]; BinPath[0]=0; /* Substitute @PSDelegate@ with path to Ghostscript */ NTGhostscriptEXE(path,MaxTextExtent-1); SubstituteString((char **) &delegate_list->commands, "@PSDelegate@",path); # if defined(UseInstalledMagick) # if defined(MagickBinPath) strcpy(BinPath,MagickBinPath); # else { char *key, *key_value; /* Obtain installation path from registry */ key="BinPath"; key_value=NTRegistryKeyLookup(key); if (!key_value) { ThrowException(exception,ConfigureError, RegistryKeyLookupFailed,key); } else { strcpy(BinPath,key_value); MagickFreeMemory(key_value); } } # endif /* defined(MagickBinPath) */ # else /* Base path off of client path */ strcpy(BinPath,SetClientPath(NULL)); # endif /* defined(UseInstalledMagick) */ if ((BinPath[0] != 0) && (BinPath[strlen(BinPath)-1] != *DirectorySeparator)) strcat(BinPath,DirectorySeparator); /* Substitute @GMDelegate@ with path to gm.exe */ CatDelegatePath(path,BinPath,"gm.exe"); SubstituteString((char **) &delegate_list->commands, "@GMDelegate@",path); /* Substitute @GMDisplayDelegate@ with path to gmdisplay.exe */ CatDelegatePath(path,BinPath,"gmdisplay.exe"); SubstituteString((char **) &delegate_list->commands, "@GMDisplayDelegate@",path); /* Substitute @MPEGDecodeDelegate@ with path to mpeg2dec.exe */ CatDelegatePath(path,BinPath,"mpeg2dec.exe"); SubstituteString((char **) &delegate_list->commands, "@MPEGDecodeDelegate@",path); /* Substitute @MPEGEncodeDelegate@ with path to mpeg2enc.exe */ CatDelegatePath(path,BinPath,"mpeg2enc.exe"); SubstituteString((char **) &delegate_list->commands, "@MPEGEncodeDelegate@",path); /* Substitute @HPGLDecodeDelegate@ with path to hp2xx.exe */ CatDelegatePath(path,BinPath,"hp2xx.exe"); SubstituteString((char **) &delegate_list->commands, "@HPGLDecodeDelegate@",path); } #endif /* defined(MSWINDOWS) */ } /* LocaleCompare */ break; } case 'D': case 'd': { if (LocaleCompare((char *) keyword,"decode") == 0) { delegate_list->decode=AcquireString(token); delegate_list->mode=1; break; } break; } case 'E': case 'e': { if (LocaleCompare((char *) keyword,"encode") == 0) { delegate_list->encode=AcquireString(token); delegate_list->mode=(-1); break; } break; } case 'M': case 'm': { if (LocaleCompare((char *) keyword,"mode") == 0) { delegate_list->mode=1; if (LocaleCompare(token,"bi") == 0) delegate_list->mode=0; else if (LocaleCompare(token,"encode") == 0) delegate_list->mode=(-1); break; } break; } case 'S': case 's': { if (LocaleCompare((char *) keyword,"stealth") == 0) { delegate_list->stealth=LocaleCompare(token,"True") == 0; break; } break; } default: break; } }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C o n f i g u r e P a t h s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetConfigurePaths() returns any Magick configuration paths associated % with the specified filename. % % The format of the GetConfigurePaths method is: % % LinkedListInfo *GetConfigurePaths(const char *filename, % ExceptionInfo *exception) % % A description of each parameter follows: % % o filename: the configure file name. % % o exception: return any errors or warnings in this structure. % */ MagickExport LinkedListInfo *GetConfigurePaths(const char *filename, ExceptionInfo *exception) { #define RegistryKey "ConfigurePath" #define MagickCoreDLL "CORE_RL_magick_.dll" #define MagickCoreDebugDLL "CORE_DB_magick_.dll" char path[MaxTextExtent]; LinkedListInfo *paths; assert(filename != (const char *) NULL); (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename); assert(exception != (ExceptionInfo *) NULL); (void) CopyMagickString(path,filename,MaxTextExtent); paths=NewLinkedList(0); { char *configure_path; /* Search $MAGICK_CONFIGURE_PATH. */ configure_path=GetEnvironmentValue("MAGICK_CONFIGURE_PATH"); if (configure_path != (char *) NULL) { register char *p, *q; for (p=configure_path-1; p != (char *) NULL; ) { (void) CopyMagickString(path,p+1,MaxTextExtent); q=strchr(path,DirectoryListSeparator); if (q != (char *) NULL) *q='\0'; q=path+strlen(path)-1; if ((q >= path) && (*q != *DirectorySeparator)) (void) ConcatenateMagickString(path,DirectorySeparator, MaxTextExtent); (void) AppendValueToLinkedList(paths,ConstantString(path)); p=strchr(p+1,DirectoryListSeparator); } configure_path=DestroyString(configure_path); } } #if defined(MAGICKCORE_INSTALLED_SUPPORT) #if defined(MAGICKCORE_SHARE_PATH) (void) AppendValueToLinkedList(paths,ConstantString(MAGICKCORE_SHARE_PATH)); #endif #if defined(MAGICKCORE_SHAREARCH_PATH) (void) AppendValueToLinkedList(paths,ConstantString( MAGICKCORE_SHAREARCH_PATH)); #endif #if defined(MAGICKCORE_CONFIGURE_PATH) (void) AppendValueToLinkedList(paths,ConstantString( MAGICKCORE_CONFIGURE_PATH)); #endif #if defined(MAGICKCORE_DOCUMENTATION_PATH) (void) AppendValueToLinkedList(paths,ConstantString( MAGICKCORE_DOCUMENTATION_PATH)); #endif #if defined(MAGICKCORE_WINDOWS_SUPPORT) && !(defined(MAGICKCORE_CONFIGURE_PATH) || defined(MAGICKCORE_SHARE_PATH)) { unsigned char *key_value; /* Locate file via registry key. */ key_value=NTRegistryKeyLookup(RegistryKey); if (key_value != (unsigned char *) NULL) { (void) FormatLocaleString(path,MaxTextExtent,"%s%s",(char *) key_value, DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); key_value=(unsigned char *) RelinquishMagickMemory(key_value); } } #endif #else { char *home; /* Search under MAGICK_HOME. */ home=GetEnvironmentValue("MAGICK_HOME"); if (home != (char *) NULL) { #if !defined(MAGICKCORE_POSIX_SUPPORT) (void) FormatLocaleString(path,MaxTextExtent,"%s%s",home, DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); #else (void) FormatLocaleString(path,MaxTextExtent,"%s/etc/%s/",home, MAGICKCORE_CONFIGURE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,ConstantString(path)); (void) FormatLocaleString(path,MaxTextExtent,"%s/share/%s/",home, MAGICKCORE_SHARE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,ConstantString(path)); #endif home=DestroyString(home); } } if (*GetClientPath() != '\0') { #if !defined(MAGICKCORE_POSIX_SUPPORT) (void) FormatLocaleString(path,MaxTextExtent,"%s%s",GetClientPath(), DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); #else char prefix[MaxTextExtent]; /* Search based on executable directory if directory is known. */ (void) CopyMagickString(prefix,GetClientPath(),MaxTextExtent); ChopPathComponents(prefix,1); (void) FormatLocaleString(path,MaxTextExtent,"%s/etc/%s/",prefix, MAGICKCORE_CONFIGURE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,ConstantString(path)); (void) FormatLocaleString(path,MaxTextExtent,"%s/share/%s/",prefix, MAGICKCORE_SHARE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,ConstantString(path)); #endif } /* Search current directory. */ (void) AppendValueToLinkedList(paths,ConstantString("")); #endif { char *home; home=GetEnvironmentValue("HOME"); if (home == (char *) NULL) home=GetEnvironmentValue("USERPROFILE"); if (home != (char *) NULL) { /* Search $HOME/.magick. */ (void) FormatLocaleString(path,MaxTextExtent,"%s%s.magick%s",home, DirectorySeparator,DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); home=DestroyString(home); } } #if defined(MAGICKCORE_WINDOWS_SUPPORT) { char module_path[MaxTextExtent]; if ((NTGetModulePath(MagickCoreDLL,module_path) != MagickFalse) || (NTGetModulePath(MagickCoreDebugDLL,module_path) != MagickFalse)) { unsigned char *key_value; /* Search module path. */ (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path, DirectorySeparator); key_value=NTRegistryKeyLookup(RegistryKey); if (key_value == (unsigned char *) NULL) (void) AppendValueToLinkedList(paths,ConstantString(path)); else key_value=(unsigned char *) RelinquishMagickMemory(key_value); } if (NTGetModulePath("Magick.dll",module_path) != MagickFalse) { /* Search PerlMagick module path. */ (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path, DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); (void) FormatLocaleString(path,MaxTextExtent,"%s%s",module_path, "\\inc\\lib\\auto\\Image\\Magick\\"); (void) AppendValueToLinkedList(paths,ConstantString(path)); } } #endif return(paths); }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t C o n f i g u r e P a t h s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetConfigurePaths() returns any Wizard configuration paths associated % with the specified filename. % % The format of the GetConfigurePaths method is: % % LinkedListInfo *GetConfigurePaths(const char *filename, % ExceptionInfo *exception) % % A description of each parameter follows: % % o filename: The configure file name. % % o exception: Return any errors or warnings in this structure. % */ WizardExport LinkedListInfo *GetConfigurePaths(const char *filename, ExceptionInfo *exception) { #define RegistryKey "ConfigurePath" #define WizardsToolkitDLL "Wizard's Toolkit.dll" char path[WizardPathExtent]; LinkedListInfo *paths; assert(filename != (const char *) NULL); (void) LogWizardEvent(TraceEvent,GetWizardModule(),"%s",filename); assert(exception != (ExceptionInfo *) NULL); (void) CopyWizardString(path,filename,WizardPathExtent); paths=NewLinkedList(0); { char *configure_path; register char *q; register const char *p; /* Search WIZARD_CONFIGURE_PATH. */ configure_path=GetEnvironmentValue("WIZARD_CONFIGURE_PATH"); if (configure_path != (char *) NULL) { for (p=configure_path-1; p != (char *) NULL; ) { (void) CopyWizardString(path,p+1,WizardPathExtent); q=strchr(path,DirectoryListSeparator); if (q != (char *) NULL) *q='\0'; q=path+strlen(path)-1; if ((q >= path) && (*q != *DirectorySeparator)) (void) ConcatenateWizardString(path,DirectorySeparator, WizardPathExtent); (void) AppendValueToLinkedList(paths,AcquireString(path)); p=strchr(p+1,DirectoryListSeparator); } configure_path=(char *) RelinquishWizardMemory(configure_path); } } #if defined(WIZARDSTOOLKIT_INSTALLED_SUPPORT) #if defined(WIZARDSTOOLKIT_CONFIGURE_PATH) (void) AppendValueToLinkedList(paths,AcquireString( WIZARDSTOOLKIT_CONFIGURE_PATH)); #endif #if defined(WIZARDSTOOLKIT_SHARE_PATH) (void) AppendValueToLinkedList(paths,AcquireString( WIZARDSTOOLKIT_SHARE_PATH)); #endif #if defined(WIZARDSTOOLKIT_SHAREARCH_PATH) (void) AppendValueToLinkedList(paths,ConstantString( WIZARDSTOOLKIT_SHAREARCH_PATH)); #endif #if defined(WIZARDSTOOLKIT_DOCUMENTATION_PATH) (void) AppendValueToLinkedList(paths,AcquireString( WIZARDSTOOLKIT_DOCUMENTATION_PATH)); #endif #if defined(WIZARDSTOOLKIT_SHARE_PATH) (void) AppendValueToLinkedList(paths,AcquireString( WIZARDSTOOLKIT_SHARE_PATH)); #endif #if defined(WIZARDSTOOLKIT_WINDOWS_SUPPORT) && !(defined(WIZARDSTOOLKIT_CONFIGURE_PATH) || defined(WIZARDSTOOLKIT_SHARE_PATH)) { unsigned char *key_value; /* Locate file via registry key. */ key_value=NTRegistryKeyLookup(RegistryKey); if (key_value != (unsigned char *) NULL) { (void) FormatLocaleString(path,WizardPathExtent,"%s%s",(char *) key_value, DirectorySeparator); (void) AppendValueToLinkedList(paths,ConstantString(path)); key_value=(unsigned char *) RelinquishWizardMemory(key_value); } } #endif #else { char *home; /* Search under WIZARD_HOME. */ home=GetEnvironmentValue("WIZARD_HOME"); if (home != (char *) NULL) { #if !defined(WIZARDSTOOLKIT_POSIX_SUPPORT) (void) FormatLocaleString(path,WizardPathExtent, "%s%s.config%sWizardsToolkit%s",home,DirectorySeparator, DirectorySeparator,DirectorySeparator); (void) AppendValueToLinkedList(paths,AcquireString(path)); #else (void) FormatLocaleString(path,WizardPathExtent,"%s/etc/%s/",home, WIZARDSTOOLKIT_CONFIGURE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); (void) FormatLocaleString(path,WizardPathExtent,"%s/share/%s/",home, WIZARDSTOOLKIT_SHARE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); (void) FormatLocaleString(path,WizardPathExtent,"%s", WIZARDSTOOLKIT_SHAREARCH_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); #endif home=(char *) RelinquishWizardMemory(home); } } if (*GetClientPath() != '\0') { #if !defined(WIZARDSTOOLKIT_POSIX_SUPPORT) (void) FormatLocaleString(path,WizardPathExtent,"%s%s",GetClientPath(), DirectorySeparator); (void) AppendValueToLinkedList(paths,AcquireString(path)); #else char prefix[WizardPathExtent]; /* Search based on executable directory if directory is known. */ (void) CopyWizardString(prefix,GetClientPath(),WizardPathExtent); ChopPathComponents(prefix,1); (void) FormatLocaleString(path,WizardPathExtent,"%s/etc/%s/",prefix, WIZARDSTOOLKIT_CONFIGURE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); (void) FormatLocaleString(path,WizardPathExtent,"%s/share/%s/",prefix, WIZARDSTOOLKIT_SHARE_RELATIVE_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); (void) FormatLocaleString(path,WizardPathExtent,"%s", WIZARDSTOOLKIT_SHAREARCH_PATH); (void) AppendValueToLinkedList(paths,AcquireString(path)); #endif } /* Search current directory. */ (void) AppendValueToLinkedList(paths,AcquireString("")); #endif { char *home; home=GetEnvironmentValue("XDG_CONFIG_HOME"); if (home == (char *) NULL) home=GetEnvironmentValue("LOCALAPPDATA"); if (home == (char *) NULL) home=GetEnvironmentValue("APPDATA"); if (home == (char *) NULL) home=GetEnvironmentValue("USERPROFILE"); if (home != (char *) NULL) { /* Search $XDG_CONFIG_HOME/ImageMagick. */ (void) FormatLocaleString(path,WizardPathExtent, "%s%sWizardsToolkit%s%s",home,DirectorySeparator,DirectorySeparator, filename); (void) AppendValueToLinkedList(paths,ConstantString(path)); home=DestroyString(home); } home=GetEnvironmentValue("HOME"); if (home != (char *) NULL) { /* Search $HOME/.config/WizardsToolkit. */ (void) FormatLocaleString(path,WizardPathExtent, "%s%s.config%sWizardsToolkit%s",home,DirectorySeparator, DirectorySeparator,DirectorySeparator); (void) AppendValueToLinkedList(paths,AcquireString(path)); home=(char *) RelinquishWizardMemory(home); } } #if defined(WIZARDSTOOLKIT_WINDOWS_SUPPORT) { char module_path[WizardPathExtent]; if (NTGetModulePath(WizardsToolkitDLL,module_path) != WizardFalse) { unsigned char *key_value; /* Search module path. */ (void) FormatLocaleString(path,WizardPathExtent,"%s%s",module_path, DirectorySeparator); key_value=NTRegistryKeyLookup(RegistryKey); if (key_value == (unsigned char *) NULL) (void) AppendValueToLinkedList(paths,ConstantString(path)); else key_value=(unsigned char *) RelinquishWizardMemory(key_value); } } #endif return(paths); }