13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             L       OOO    GGGG                             %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             L      O   O  G                                 %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             L      O   O  G GG                              %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             L      O   O  G   G                             %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             LLLLL   OOO    GGG                              %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             MagickCore Log Events                           %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               Software Design                               %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                    Cristy                                   %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                September 2002                               %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/client.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/configure.h"
469639ba36e05b3e2fe85c8d9097b9ad8aa2c0e5eecristy#include "MagickCore/configure-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
49abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/log.h"
515ff4eaf57b3cd47d0371f204f865cbba614674a0cristy#include "MagickCore/log-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
531e37e8f8f760d955432ae54298cb460098a4c21ecristy#include "MagickCore/nt-base-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/timer.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/token.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/thread_.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/thread-private.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
63d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/version.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xml-tree.h"
663291f51a77fdd817efb58d652c78c407cbfdf7d1cristy#include "MagickCore/xml-tree-private.h"
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define LogFilename  "log.xml"
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef enum
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  UndefinedHandler = 0x0000,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  NoHandler = 0x0000,
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ConsoleHandler = 0x0001,
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StdoutHandler = 0x0002,
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StderrHandler = 0x0004,
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FileHandler = 0x0008,
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DebugHandler = 0x0010,
85834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  EventHandler = 0x0020,
86834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  MethodHandler = 0x0040
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} LogHandlerType;
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _EventInfo
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *name;
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogEventType
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} EventInfo;
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _HandlerInfo
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *name;
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogHandlerType
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    handler;
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} HandlerInfo;
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristystruct _LogInfo
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogEventType
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event_mask;
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogHandlerType
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    handler_mask;
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path,
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *name,
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *filename,
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *format;
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
121bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    generations,
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    limit;
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FILE
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *file;
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
128bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    generation;
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    append,
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stealth;
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  TimerInfo
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timer;
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
138bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    signature;
140834a57918ebe6c5e12fb5f97465a9107f805aae5dirk
141834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  MagickLogMethod
142834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    method;
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy};
14485340296861752b741edbf9b2bf9afed393fe141cristy
14585340296861752b741edbf9b2bf9afed393fe141cristytypedef struct _LogMapInfo
14685340296861752b741edbf9b2bf9afed393fe141cristy{
14785340296861752b741edbf9b2bf9afed393fe141cristy  const LogEventType
14885340296861752b741edbf9b2bf9afed393fe141cristy    event_mask;
14985340296861752b741edbf9b2bf9afed393fe141cristy
15085340296861752b741edbf9b2bf9afed393fe141cristy  const LogHandlerType
15185340296861752b741edbf9b2bf9afed393fe141cristy    handler_mask;
15285340296861752b741edbf9b2bf9afed393fe141cristy
15385340296861752b741edbf9b2bf9afed393fe141cristy  const char
15485340296861752b741edbf9b2bf9afed393fe141cristy    *filename,
15585340296861752b741edbf9b2bf9afed393fe141cristy    *format;
15685340296861752b741edbf9b2bf9afed393fe141cristy} LogMapInfo;
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15985340296861752b741edbf9b2bf9afed393fe141cristy  Static declarations.
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const HandlerInfo
162722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy  LogHandlers[32] =
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
164398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "Console", ConsoleHandler },
165398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "Debug", DebugHandler },
166398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "Event", EventHandler },
167398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "File", FileHandler },
168398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "None", NoHandler },
169398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "Stderr", StderrHandler },
170398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { "Stdout", StdoutHandler },
171722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
172722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
173722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
174722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
175722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
176722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
177722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
178722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
179722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
180722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
181722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
182722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
183722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
184722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
185722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
186722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
187722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
188722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
189722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
190722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
191722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
192722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
193722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
194722ffc48569b7391b1f5e0af695b1ef3b60f282fcristy    { (char *) NULL, UndefinedHandler },
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    { (char *) NULL, UndefinedHandler }
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19885340296861752b741edbf9b2bf9afed393fe141cristystatic const LogMapInfo
19985340296861752b741edbf9b2bf9afed393fe141cristy  LogMap[] =
20085340296861752b741edbf9b2bf9afed393fe141cristy  {
201398fd02612ac738cc5c950c0e5df20a6db3db001cristy    { NoEvents, ConsoleHandler, "Magick-%g.log",
202398fd02612ac738cc5c950c0e5df20a6db3db001cristy      "%t %r %u %v %d %c[%p]: %m/%f/%l/%d\\n  %e" }
20385340296861752b741edbf9b2bf9afed393fe141cristy  };
20485340296861752b741edbf9b2bf9afed393fe141cristy
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic char
206151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  log_name[MagickPathExtent] = "Magick";
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LinkedListInfo
20986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  *log_cache = (LinkedListInfo *) NULL;
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo
21249d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy  *event_semaphore = (SemaphoreInfo *) NULL,
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *log_semaphore = (SemaphoreInfo *) NULL;
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LogHandlerType
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ParseLogHandlers(const char *);
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LogInfo
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *GetLogInfo(const char *,ExceptionInfo *);
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
22586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  IsLogCacheInstantiated(ExceptionInfo *),
226cd2cd1803dda951bcfff101c44032ae17e52655fcristy  LoadLogCache(LinkedListInfo *,const char *,const char *,const size_t,
227cd2cd1803dda951bcfff101c44032ae17e52655fcristy    ExceptionInfo *);
22886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
22986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy/*
23086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  A c q u i r e L o g C a c h e                                              %
23586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%                                                                             %
23886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  AcquireLogCache() caches one or more log configurations which provides a
24186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  mapping between log attributes and log name.
24286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  The format of the AcquireLogCache method is:
24486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%      LinkedListInfo *AcquireLogCache(const char *filename,
24686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%        ExceptionInfo *exception)
24786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
24886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  A description of each parameter follows:
24986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
25086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%    o filename: the log configuration filename.
25186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
25286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%    o exception: return any errors or warnings in this structure.
25386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%
25486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy*/
25586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic LinkedListInfo *AcquireLogCache(const char *filename,
25686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ExceptionInfo *exception)
25786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy{
25886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  LinkedListInfo
259b18d864b3f06e9272582b7736230d934d715d542dirk    *cache;
26086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
26186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  MagickStatusType
26286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    status;
26386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
26486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  register ssize_t
26586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    i;
26686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
26786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
26886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load external log map.
26986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
270b18d864b3f06e9272582b7736230d934d715d542dirk  cache=NewLinkedList(0);
271b18d864b3f06e9272582b7736230d934d715d542dirk  if (cache == (LinkedListInfo *) NULL)
27286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
27386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  status=MagickTrue;
274b18d864b3f06e9272582b7736230d934d715d542dirk#if !defined(MAGICKCORE_ZERO_CONFIGURATION_SUPPORT)
27586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
276b18d864b3f06e9272582b7736230d934d715d542dirk    const StringInfo
277b18d864b3f06e9272582b7736230d934d715d542dirk      *option;
278b18d864b3f06e9272582b7736230d934d715d542dirk
279b18d864b3f06e9272582b7736230d934d715d542dirk    LinkedListInfo
280b18d864b3f06e9272582b7736230d934d715d542dirk      *options;
281b18d864b3f06e9272582b7736230d934d715d542dirk
282b18d864b3f06e9272582b7736230d934d715d542dirk    options=GetConfigureOptions(filename,exception);
28386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    option=(const StringInfo *) GetNextValueInLinkedList(options);
284b18d864b3f06e9272582b7736230d934d715d542dirk    while (option != (const StringInfo *) NULL)
285b18d864b3f06e9272582b7736230d934d715d542dirk    {
286b18d864b3f06e9272582b7736230d934d715d542dirk      status&=LoadLogCache(cache,(const char *) GetStringInfoDatum(option),
287b18d864b3f06e9272582b7736230d934d715d542dirk        GetStringInfoPath(option),0,exception);
288b18d864b3f06e9272582b7736230d934d715d542dirk      option=(const StringInfo *) GetNextValueInLinkedList(options);
289b18d864b3f06e9272582b7736230d934d715d542dirk    }
290b18d864b3f06e9272582b7736230d934d715d542dirk    options=DestroyConfigureOptions(options);
29186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
292b18d864b3f06e9272582b7736230d934d715d542dirk#endif
29386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  /*
29486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    Load built-in log map.
29586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  */
29686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  for (i=0; i < (ssize_t) (sizeof(LogMap)/sizeof(*LogMap)); i++)
29786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  {
29886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    LogInfo
29986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *log_info;
30086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
30186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    register const LogMapInfo
30286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      *p;
30386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy
30486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=LogMap+i;
30586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info=(LogInfo *) AcquireMagickMemory(sizeof(*log_info));
30686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (log_info == (LogInfo *) NULL)
30786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      {
30886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        (void) ThrowMagickException(exception,GetMagickModule(),
30986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy          ResourceLimitError,"MemoryAllocationFailed","`%s'",p->filename);
31086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        continue;
31186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      }
31286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) ResetMagickMemory(log_info,0,sizeof(*log_info));
31386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info->path=ConstantString("[built-in]");
31486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetTimerInfo((TimerInfo *) &log_info->timer);
31586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info->event_mask=p->event_mask;
31686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info->handler_mask=p->handler_mask;
31786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info->filename=ConstantString(p->filename);
31886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_info->format=ConstantString(p->format);
319e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy    log_info->signature=MagickCoreSignature;
320b18d864b3f06e9272582b7736230d934d715d542dirk    status&=AppendValueToLinkedList(cache,log_info);
32186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    if (status == MagickFalse)
32286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      (void) ThrowMagickException(exception,GetMagickModule(),
32386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",log_info->name);
32486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  }
325b18d864b3f06e9272582b7736230d934d715d542dirk  return(cache);
32686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy}
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   C l o s e M a g i c k L o g                                               %
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CloseMagickLog() closes the Magick log.
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the CloseMagickLog method is:
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      CloseMagickLog(void)
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void CloseMagickLog(void)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging() == MagickFalse)
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=GetLogInfo("*",exception);
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
359f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (log_info->file != (FILE *) NULL)
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
362398fd02612ac738cc5c950c0e5df20a6db3db001cristy      (void) FormatLocaleFile(log_info->file,"</log>\n");
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fclose(log_info->file);
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      log_info->file=(FILE *) NULL;
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
366f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   G e t L o g I n f o                                                       %
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetLogInfo() searches the log list for the specified name and if found
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns attributes for that log.
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetLogInfo method is:
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      LogInfo *GetLogInfo(const char *name,ExceptionInfo *exception)
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the log name.
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LogInfo *GetLogInfo(const char *name,ExceptionInfo *exception)
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register LogInfo
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
40086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (IsLogCacheInstantiated(exception) == MagickFalse)
401904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy    return((LogInfo *) NULL);
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Search for log tag.
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
405f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
40686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(log_cache);
40786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(LogInfo *) GetNextValueInLinkedList(log_cache);
40849d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy  if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
40949d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    {
41049d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      UnlockSemaphoreInfo(log_semaphore);
41149d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy      return(p);
41249d4d2247a71eab1c5c56bae91a5f9d0fcc4475ccristy    }
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (p != (LogInfo *) NULL)
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(name,p->name) == 0)
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
41786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(LogInfo *) GetNextValueInLinkedList(log_cache);
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (LogInfo *) NULL)
42086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    (void) InsertValueInLinkedList(log_cache,0,
42186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      RemoveElementByValueFromLinkedList(log_cache,p));
422f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(p);
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t L o g I n f o L i s t                                               %
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetLogInfoList() returns any logs that match the specified pattern.
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetLogInfoList function is:
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const LogInfo **GetLogInfoList(const char *pattern,
442bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *number_preferences,ExceptionInfo *exception)
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_preferences:  This integer returns the number of logs in the list.
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int LogInfoCompare(const void *x,const void *y)
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const LogInfo
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const LogInfo **) x,
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const LogInfo **) y;
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare((*p)->path,(*q)->path) == 0)
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(LocaleCompare((*p)->name,(*q)->name));
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare((*p)->path,(*q)->path));
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const LogInfo **GetLogInfoList(const char *pattern,
475bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *number_preferences,ExceptionInfo *exception)
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const LogInfo
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **preferences;
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const LogInfo
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
483bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate log list.
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
491bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_preferences != (size_t *) NULL);
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_preferences=0;
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=GetLogInfo("*",exception);
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const LogInfo *) NULL)
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const LogInfo **) NULL);
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences=(const LogInfo **) AcquireQuantumMemory((size_t)
49786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(log_cache)+1UL,sizeof(*preferences));
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (preferences == (const LogInfo **) NULL)
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((const LogInfo **) NULL);
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate log list.
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
503f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
50486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(log_cache);
50586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const LogInfo *) GetNextValueInLinkedList(log_cache);
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const LogInfo *) NULL; )
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      preferences[i++]=p;
51186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const LogInfo *) GetNextValueInLinkedList(log_cache);
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
513f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) preferences,(size_t) i,sizeof(*preferences),LogInfoCompare);
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences[i]=(LogInfo *) NULL;
516bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_preferences=(size_t) i;
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(preferences);
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t L o g L i s t                                                       %
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetLogList() returns any logs that match the specified pattern.
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetLogList function is:
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
535bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      char **GetLogList(const char *pattern,size_t *number_preferences,
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pattern: Specifies a pointer to a text string containing a pattern.
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_preferences:  This integer returns the number of logs in the list.
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int LogCompare(const void *x,const void *y)
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p,
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **q;
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(const char **) x;
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(const char **) y;
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(LocaleCompare(*p,*q));
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5672e091d4031e4ccf5be2ef0c55872cd5afe9f7d8dcristyMagickExport char **GetLogList(const char *pattern,size_t *number_preferences,
5682e091d4031e4ccf5be2ef0c55872cd5afe9f7d8dcristy  ExceptionInfo *exception)
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **preferences;
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const LogInfo
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
576bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate log list.
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pattern != (char *) NULL);
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
584bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  assert(number_preferences != (size_t *) NULL);
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *number_preferences=0;
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=GetLogInfo("*",exception);
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p == (const LogInfo *) NULL)
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences=(char **) AcquireQuantumMemory((size_t)
59086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    GetNumberOfElementsInLinkedList(log_cache)+1UL,sizeof(*preferences));
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (preferences == (char **) NULL)
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate log list.
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
596f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
59786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  ResetLinkedListIterator(log_cache);
59886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  p=(const LogInfo *) GetNextValueInLinkedList(log_cache);
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; p != (const LogInfo *) NULL; )
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p->stealth == MagickFalse) &&
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      preferences[i++]=ConstantString(p->name);
60486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    p=(const LogInfo *) GetNextValueInLinkedList(log_cache);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
606f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) preferences,(size_t) i,sizeof(*preferences),LogCompare);
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences[i]=(char *) NULL;
609bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  *number_preferences=(size_t) i;
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(preferences);
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   G e t L o g N a m e                                                       %
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  GetLogName() returns the current log name.
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the GetLogName method is:
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *GetLogName(void)
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *GetLogName(void)
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(log_name);
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy+   I s L o g C a c h e I n s t a n t i a t e d                               %
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
647cd2cd1803dda951bcfff101c44032ae17e52655fcristy%  IsLogCacheInstantiated() determines if the log list is instantiated.  If
648cd2cd1803dda951bcfff101c44032ae17e52655fcristy%  not, it instantiates the list and returns it.
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
650904e591bcf6bce4c0086cc200d0efe7fdd3834aecristy%  The format of the IsLogInstantiated method is:
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
65286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%      MagickBooleanType IsLogCacheInstantiated(ExceptionInfo *exception)
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
65986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristystatic MagickBooleanType IsLogCacheInstantiated(ExceptionInfo *exception)
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
66186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (log_cache == (LinkedListInfo *) NULL)
66286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    {
66386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (log_semaphore == (SemaphoreInfo *) NULL)
66486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        ActivateSemaphoreInfo(&log_semaphore);
66586e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      LockSemaphoreInfo(log_semaphore);
66686e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      if (log_cache == (LinkedListInfo *) NULL)
66786e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy        log_cache=AcquireLogCache(LogFilename,exception);
66886e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      UnlockSemaphoreInfo(log_semaphore);
66986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    }
67086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  return(log_cache != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  I s E v e n t L o g g i n g                                                %
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsEventLogging() returns MagickTrue if debug of events is enabled otherwise
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  MagickFalse.
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsEventLogging method is:
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsEventLogging(void)
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType IsEventLogging(void)
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const LogInfo
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if ((log_cache == (LinkedListInfo *) NULL) ||
70186e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy      (IsLinkedListEmpty(log_cache) != MagickFalse))
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=GetLogInfo("*",exception);
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(log_info->event_mask != NoEvents ? MagickTrue : MagickFalse);
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  L i s t L o g I n f o                                                      %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ListLogInfo() lists the log info to a file.
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ListLogInfo method is:
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType ListLogInfo(FILE *file,ExceptionInfo *exception)
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o file:  An pointer to a FILE.
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType ListLogInfo(FILE *file,ExceptionInfo *exception)
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MegabytesToBytes(value) ((MagickSizeType) (value)*1024*1024)
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *path;
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const LogInfo
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **log_info;
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
742bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
745bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_aliases;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7489d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
7499d314ff2c17a77996c05413c2013880387e50f0ecristy    j;
7509d314ff2c17a77996c05413c2013880387e50f0ecristy
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (file == (const FILE *) NULL)
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=stdout;
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=GetLogInfoList("*",&number_aliases,exception);
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (log_info == (const LogInfo **) NULL)
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  path=(const char *) NULL;
758bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_aliases; i++)
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (log_info[i]->stealth != MagickFalse)
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((path == (const char *) NULL) ||
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (LocaleCompare(path,log_info[i]->path) != 0))
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
765398fd02612ac738cc5c950c0e5df20a6db3db001cristy        size_t
766398fd02612ac738cc5c950c0e5df20a6db3db001cristy          length;
767398fd02612ac738cc5c950c0e5df20a6db3db001cristy
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (log_info[i]->path != (char *) NULL)
769b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file,"\nPath: %s\n\n",log_info[i]->path);
770398fd02612ac738cc5c950c0e5df20a6db3db001cristy        length=0;
771398fd02612ac738cc5c950c0e5df20a6db3db001cristy        for (j=0; j < (ssize_t) (8*sizeof(LogHandlerType)); j++)
772398fd02612ac738cc5c950c0e5df20a6db3db001cristy        {
773398fd02612ac738cc5c950c0e5df20a6db3db001cristy          size_t
774398fd02612ac738cc5c950c0e5df20a6db3db001cristy            mask;
775398fd02612ac738cc5c950c0e5df20a6db3db001cristy
776e3216eb99bc9e5c5d003554881083db6463ae109cristy          if (LogHandlers[j].name == (const char *) NULL)
777e3216eb99bc9e5c5d003554881083db6463ae109cristy            break;
778fb8f6e1032696c1912fe3f05ad0eef74e8e2dbdecristy          mask=1;
779fb8f6e1032696c1912fe3f05ad0eef74e8e2dbdecristy          mask<<=j;
780398fd02612ac738cc5c950c0e5df20a6db3db001cristy          if ((log_info[i]->handler_mask & mask) != 0)
781398fd02612ac738cc5c950c0e5df20a6db3db001cristy            {
782398fd02612ac738cc5c950c0e5df20a6db3db001cristy              (void) FormatLocaleFile(file,"%s ",LogHandlers[j].name);
783398fd02612ac738cc5c950c0e5df20a6db3db001cristy              length+=strlen(LogHandlers[j].name);
784398fd02612ac738cc5c950c0e5df20a6db3db001cristy            }
785398fd02612ac738cc5c950c0e5df20a6db3db001cristy        }
786398fd02612ac738cc5c950c0e5df20a6db3db001cristy        for (j=(ssize_t) length; j <= 12; j++)
787398fd02612ac738cc5c950c0e5df20a6db3db001cristy          (void) FormatLocaleFile(file," ");
788398fd02612ac738cc5c950c0e5df20a6db3db001cristy        (void) FormatLocaleFile(file," Generations     Limit  Format\n");
789398fd02612ac738cc5c950c0e5df20a6db3db001cristy        (void) FormatLocaleFile(file,"-----------------------------------------"
790398fd02612ac738cc5c950c0e5df20a6db3db001cristy          "--------------------------------------\n");
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    path=log_info[i]->path;
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (log_info[i]->filename != (char *) NULL)
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
795b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        (void) FormatLocaleFile(file,"%s",log_info[i]->filename);
796bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (j=(ssize_t) strlen(log_info[i]->filename); j <= 16; j++)
797b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(file," ");
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
799b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"%9g  ",(double) log_info[i]->generations);
800398fd02612ac738cc5c950c0e5df20a6db3db001cristy    (void) FormatLocaleFile(file,"%8g   ",(double) log_info[i]->limit);
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (log_info[i]->format != (char *) NULL)
802b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"%s",log_info[i]->format);
803b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"\n");
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fflush(file);
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=(const LogInfo **) RelinquishMagickMemory((void *) log_info);
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
815f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   L o g C o m p o n e n t G e n e s i s                                     %
816f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
817f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
818f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
819f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
820f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
821f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  LogComponentGenesis() instantiates the log component.
822f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
823f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the LogComponentGenesis method is:
824f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
825f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      MagickBooleanType LogComponentGenesis(void)
826f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
827f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
8285ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType LogComponentGenesis(void)
829f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
83085dfbbbbf40e62b47b13e5842a700e15a216fabacristy  ExceptionInfo
83185dfbbbbf40e62b47b13e5842a700e15a216fabacristy    *exception;
83285dfbbbbf40e62b47b13e5842a700e15a216fabacristy
8337c9770650f31145e0fe8811d10b2e0ecd47697c8cristy  if (log_semaphore == (SemaphoreInfo *) NULL)
8347c9770650f31145e0fe8811d10b2e0ecd47697c8cristy    log_semaphore=AcquireSemaphoreInfo();
83585dfbbbbf40e62b47b13e5842a700e15a216fabacristy  exception=AcquireExceptionInfo();
83685dfbbbbf40e62b47b13e5842a700e15a216fabacristy  (void) GetLogInfo("*",exception);
83785dfbbbbf40e62b47b13e5842a700e15a216fabacristy  exception=DestroyExceptionInfo(exception);
8383d308f4863a430314cac534baafdb7a72638fe7ecristy  event_semaphore=AcquireSemaphoreInfo();
839f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return(MagickTrue);
840f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
841f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
842f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
843f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
845f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
846f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
847f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   L o g C o m p o n e n t T e r m i n u s                                   %
848f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
849f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
850f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
851f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
852f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
853f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  LogComponentTerminus() destroys the logging component.
854f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
855f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the LogComponentTerminus method is:
856f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
857f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      LogComponentTerminus(void)
858f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
859f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
860f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
861f34a145c545cb86152ad42a787f6d5fffea6b77ccristystatic void *DestroyLogElement(void *log_info)
862f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
863f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  register LogInfo
864f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    *p;
865f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
866f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(LogInfo *) log_info;
867f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  if (p->file != (FILE *) NULL)
868f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    {
869398fd02612ac738cc5c950c0e5df20a6db3db001cristy      (void) FormatLocaleFile(p->file,"</log>\n");
870f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      (void) fclose(p->file);
871f34a145c545cb86152ad42a787f6d5fffea6b77ccristy      p->file=(FILE *) NULL;
872f34a145c545cb86152ad42a787f6d5fffea6b77ccristy    }
8735965b4960fada91283e62d9a33348db18339aa38cristy  if (p->format != (char *) NULL)
8745965b4960fada91283e62d9a33348db18339aa38cristy    p->format=DestroyString(p->format);
8755965b4960fada91283e62d9a33348db18339aa38cristy  if (p->path != (char *) NULL)
8765965b4960fada91283e62d9a33348db18339aa38cristy    p->path=DestroyString(p->path);
8775965b4960fada91283e62d9a33348db18339aa38cristy  if (p->filename != (char *) NULL)
8785965b4960fada91283e62d9a33348db18339aa38cristy    p->filename=DestroyString(p->filename);
879f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  p=(LogInfo *) RelinquishMagickMemory(p);
880f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  return((void *) NULL);
881f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
882f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
8835ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void LogComponentTerminus(void)
884f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
8853d308f4863a430314cac534baafdb7a72638fe7ecristy  if (event_semaphore == (SemaphoreInfo *) NULL)
8863d308f4863a430314cac534baafdb7a72638fe7ecristy    ActivateSemaphoreInfo(&event_semaphore);
8873d308f4863a430314cac534baafdb7a72638fe7ecristy  LockSemaphoreInfo(event_semaphore);
8883d308f4863a430314cac534baafdb7a72638fe7ecristy  UnlockSemaphoreInfo(event_semaphore);
8893d308f4863a430314cac534baafdb7a72638fe7ecristy  RelinquishSemaphoreInfo(&event_semaphore);
89018b17443128598500357da7bff2f01683cf32890cristy  if (log_semaphore == (SemaphoreInfo *) NULL)
89104b11db5504ecdf205114ae7e9e68774a1ff0b9bcristy    ActivateSemaphoreInfo(&log_semaphore);
892f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
89386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  if (log_cache != (LinkedListInfo *) NULL)
89486e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy    log_cache=DestroyLinkedList(log_cache,DestroyLogElement);
895f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
8963d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy  RelinquishSemaphoreInfo(&log_semaphore);
897f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
898f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
899f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
900f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
901f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
902f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
903f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   L o g M a g i c k E v e n t                                               %
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  LogMagickEvent() logs an event as determined by the log configuration file.
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  If an error occurs, MagickFalse is returned otherwise MagickTrue.
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LogMagickEvent method is:
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType LogMagickEvent(const LogEventType type,
916bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        const char *module,const char *function,const size_t line,
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *format,...)
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o type: the event type.
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the source module filename.
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o function: the function name.
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o line: the line number of the source module.
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o format: the output format.
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
932d2a7a2d4a46c82a8679688ae763ef9d7bb53ccd7dirkstatic char *TranslateEvent(const char *module,const char *function,
933d2a7a2d4a46c82a8679688ae763ef9d7bb53ccd7dirk  const size_t line,const char *domain,const char *event)
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text;
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    elapsed_time,
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    user_time;
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    extent;
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    seconds;
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=(LogInfo *) GetLogInfo("*",exception);
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  seconds=time((time_t *) NULL);
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  elapsed_time=GetElapsedTime(&log_info->timer);
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  user_time=GetUserTime(&log_info->timer);
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=AcquireString(event);
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (log_info->format == (char *) NULL)
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(text);
969151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  extent=strlen(event)+MagickPathExtent;
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare(log_info->format,"xml") == 0)
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
973151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        timestamp[MagickPathExtent];
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Translate event in "XML" format.
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickTime(seconds,extent,timestamp);
979b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(text,extent,
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "<entry>\n"
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <timestamp>%s</timestamp>\n"
98291f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        "  <elapsed-time>%lu:%02lu.%03lu</elapsed-time>\n"
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <user-time>%0.3f</user-time>\n"
984e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "  <process-id>%.20g</process-id>\n"
985e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "  <thread-id>%.20g</thread-id>\n"
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <module>%s</module>\n"
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <function>%s</function>\n"
988e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "  <line>%.20g</line>\n"
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <domain>%s</domain>\n"
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  <event>%s</event>\n"
99191f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        "</entry>",timestamp,(unsigned long) (elapsed_time/60.0),
99291f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        (unsigned long) floor(fmod(elapsed_time,60.0)),(unsigned long)
99391f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        (1000.0*(elapsed_time-floor(elapsed_time))+0.5),user_time,
99491f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        (double) getpid(),(double) GetMagickThreadSignature(),module,function,
99591f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy        (double) line,domain,event);
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(text);
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Translate event in "human readable" format.
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=text;
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=log_info->format; *p != '\0'; p++)
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q='\0';
1005151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    if ((size_t) (q-text+MagickPathExtent) >= extent)
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1007151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        extent+=MagickPathExtent;
1008151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        text=(char *) ResizeQuantumMemory(text,extent+MagickPathExtent,
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sizeof(*text));
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (text == (char *) NULL)
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((char *) NULL);
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=text+strlen(text);
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      The format of the log is defined by embedding special format characters:
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %c   client name
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %d   domain
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %e   event
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %f   function
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %g   generation
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %l   line
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %m   module
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %n   log name
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %p   process id
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %r   real CPU time
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %t   wall clock time
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %u   user CPU time
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %v   version
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %%   percent sign
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        \n   newline
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        \r   carriage return
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == '\\') && (*(p+1) == 'r'))
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++='\r';
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == '\\') && (*(p+1) == 'n'))
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++='\n';
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p != '%')
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*p)
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'c':
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,GetClientName(),extent);
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'd':
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,domain,extent);
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'e':
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,event,extent);
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'f':
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,function,extent);
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'g':
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (log_info->generations == 0)
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(q,"0",extent);
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q++;
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1082b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%.20g",(double) (log_info->generation %
1083e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          log_info->generations));
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'l':
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1088b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%.20g",(double) line);
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'm':
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        register const char
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *p;
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (p=module+strlen(module)-1; p > module; p--)
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*p == *DirectorySeparator)
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p++;
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,p,extent);
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,GetLogName(),extent);
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'p':
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1112b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%.20g",(double) getpid());
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'r':
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1117b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%lu:%02lu.%03lu",(unsigned long)
111891f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy          (elapsed_time/60.0),(unsigned long) floor(fmod(elapsed_time,60.0)),
111991f905af3b85704a2cf16a85ef1a90f0fcfda50dcristy          (unsigned long) (1000.0*(elapsed_time-floor(elapsed_time))+0.5));
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 't':
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=FormatMagickTime(seconds,extent,q);
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'u':
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1129b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%0.3fu",user_time);
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'v':
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,MagickLibVersionText,extent);
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case '%':
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++='%';
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(text);
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic char *TranslateFilename(const LogInfo *log_info)
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *filename;
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    extent;
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Translate event in "human readable" format.
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(log_info != (LogInfo *) NULL);
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(log_info->filename != (char *) NULL);
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  filename=AcquireString((char *) NULL);
1174151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  extent=MagickPathExtent;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=filename;
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=log_info->filename; *p != '\0'; p++)
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q='\0';
1179151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    if ((size_t) (q-filename+MagickPathExtent) >= extent)
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1181151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        extent+=MagickPathExtent;
1182151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        filename=(char *) ResizeQuantumMemory(filename,extent+MagickPathExtent,
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sizeof(*filename));
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (filename == (char *) NULL)
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((char *) NULL);
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=filename+strlen(filename);
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      The format of the filename is defined by embedding special format
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      characters:
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %c   client name
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %n   log name
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %p   process id
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %v   version
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        %%   percent sign
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*p != '%')
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*p)
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'c':
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,GetClientName(),extent);
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'g':
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (log_info->generations == 0)
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(q,"0",extent);
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q++;
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1219b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%.20g",(double) (log_info->generation %
1220e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          log_info->generations));
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'n':
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,GetLogName(),extent);
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'p':
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1230b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy        q+=FormatLocaleString(q,extent,"%.20g",(double) getpid());
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'v':
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=CopyMagickString(q,MagickLibVersionText,extent);
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case '%':
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++='%';
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q++=(*p);
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q='\0';
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(filename);
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickBooleanType LogMagickEventList(const LogEventType type,const char *module,
12562e091d4031e4ccf5be2ef0c55872cd5afe9f7d8dcristy  const char *function,const size_t line,const char *format,va_list operands)
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1259151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    event[MagickPathExtent],
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text;
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *domain;
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n;
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging() == MagickFalse)
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=(LogInfo *) GetLogInfo("*",exception);
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
12793d308f4863a430314cac534baafdb7a72638fe7ecristy  if (event_semaphore == (SemaphoreInfo *) NULL)
12803d308f4863a430314cac534baafdb7a72638fe7ecristy    ActivateSemaphoreInfo(&event_semaphore);
12813d308f4863a430314cac534baafdb7a72638fe7ecristy  LockSemaphoreInfo(event_semaphore);
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->event_mask & type) == 0)
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12843d308f4863a430314cac534baafdb7a72638fe7ecristy      UnlockSemaphoreInfo(event_semaphore);
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1287042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy  domain=CommandOptionToMnemonic(MagickLogEventOptions,type);
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_VSNPRINTF)
1289151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  n=vsnprintf(event,MagickPathExtent,format,operands);
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  n=vsprintf(event,format,operands);
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (n < 0)
1294151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    event[MagickPathExtent-1]='\0';
1295d2a7a2d4a46c82a8679688ae763ef9d7bb53ccd7dirk  text=TranslateEvent(module,function,line,domain,event);
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ContinueTimer((TimerInfo *) &log_info->timer);
12993d308f4863a430314cac534baafdb7a72638fe7ecristy      UnlockSemaphoreInfo(event_semaphore);
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & ConsoleHandler) != 0)
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1304b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stderr,"%s\n",text);
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fflush(stderr);
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & DebugHandler) != 0)
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13090157aeadef2fce908277168097a160a8f15a6952cristy#if defined(MAGICKCORE_WINDOWS_SUPPORT)
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      OutputDebugString(text);
1311690a0eb8cbbcf8e5c69b3d33d1f562a8eea8889dcristy      OutputDebugString("\n");
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & EventHandler) != 0)
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13160157aeadef2fce908277168097a160a8f15a6952cristy#if defined(MAGICKCORE_WINDOWS_SUPPORT)
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) NTReportEvent(text,MagickFalse);
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & FileHandler) != 0)
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      struct stat
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        file_info;
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      file_info.st_size=0;
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (log_info->file != (FILE *) NULL)
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) fstat(fileno(log_info->file),&file_info);
132894b11835effe9f2ded8638e50db5fb7acd92ea0bcristy      if (file_info.st_size > (ssize_t) (1024*1024*log_info->limit))
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1330b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(log_info->file,"</log>\n");
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) fclose(log_info->file);
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          log_info->file=(FILE *) NULL;
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (log_info->file == (FILE *) NULL)
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          char
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *filename;
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          filename=TranslateFilename(log_info);
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (filename == (char *) NULL)
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) ContinueTimer((TimerInfo *) &log_info->timer);
13433d308f4863a430314cac534baafdb7a72638fe7ecristy              UnlockSemaphoreInfo(event_semaphore);
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              return(MagickFalse);
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          log_info->append=IsPathAccessible(filename);
134718c6c27bc513a8c73a5bc4a2c157afb19c3e24b9cristy          log_info->file=fopen_utf8(filename,"ab");
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          filename=(char  *) RelinquishMagickMemory(filename);
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (log_info->file == (FILE *) NULL)
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13513d308f4863a430314cac534baafdb7a72638fe7ecristy              UnlockSemaphoreInfo(event_semaphore);
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              return(MagickFalse);
13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          log_info->generation++;
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (log_info->append == MagickFalse)
1356398fd02612ac738cc5c950c0e5df20a6db3db001cristy            (void) FormatLocaleFile(log_info->file,"<?xml version=\"1.0\" "
1357398fd02612ac738cc5c950c0e5df20a6db3db001cristy              "encoding=\"UTF-8\" standalone=\"yes\"?>\n");
1358398fd02612ac738cc5c950c0e5df20a6db3db001cristy          (void) FormatLocaleFile(log_info->file,"<log>\n");
13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1360cd2cd1803dda951bcfff101c44032ae17e52655fcristy      (void) FormatLocaleFile(log_info->file,"  <event>%s</event>\n",text);
13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fflush(log_info->file);
13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1363834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  if ((log_info->handler_mask & MethodHandler) != 0)
1364834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    {
1365834a57918ebe6c5e12fb5f97465a9107f805aae5dirk      if (log_info->method != (MagickLogMethod) NULL)
1366834a57918ebe6c5e12fb5f97465a9107f805aae5dirk        log_info->method(type,text);
1367834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    }
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & StdoutHandler) != 0)
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1370b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stdout,"%s\n",text);
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fflush(stdout);
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((log_info->handler_mask & StderrHandler) != 0)
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1375b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stderr,"%s\n",text);
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fflush(stderr);
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=(char  *) RelinquishMagickMemory(text);
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ContinueTimer((TimerInfo *) &log_info->timer);
13803d308f4863a430314cac534baafdb7a72638fe7ecristy  UnlockSemaphoreInfo(event_semaphore);
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickBooleanType LogMagickEvent(const LogEventType type,const char *module,
1385bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const char *function,const size_t line,const char *format,...)
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  va_list
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    operands;
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  va_start(operands,format);
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=LogMagickEventList(type,module,function,line,format,operands);
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  va_end(operands);
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1404fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk+   L o a d L o g C a c h e                                                   %
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
141086e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  LoadLogCache() loads the log configurations which provides a
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  mapping between log attributes and log name.
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
141386e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy%  The format of the LoadLogCache method is:
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1415b18d864b3f06e9272582b7736230d934d715d542dirk%      MagickBooleanType LoadLogCache(LinkedListInfo *cache,const char *xml,
1416cd2cd1803dda951bcfff101c44032ae17e52655fcristy%        const char *filename,const size_t depth,ExceptionInfo *exception)
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o xml:  The log list in XML format.
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename:  The log list filename.
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o depth: depth of <include /> statements.
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1429b18d864b3f06e9272582b7736230d934d715d542dirkstatic MagickBooleanType LoadLogCache(LinkedListInfo *cache,const char *xml,
1430cd2cd1803dda951bcfff101c44032ae17e52655fcristy  const char *filename,const size_t depth,ExceptionInfo *exception)
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1433151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    keyword[MagickPathExtent],
14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *token;
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info = (LogInfo *) NULL;
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickStatusType
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1445fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk  size_t
1446fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk    extent;
1447fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load the log map file.
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (xml == (const char *) NULL)
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
1454fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk  token=AcquireString(xml);
1455fc0f1249300d84ccb63b81a9dd87245d6ed34806dirk  extent=strlen(token)+MagickPathExtent;
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (q=(const char *) xml; *q != '\0'; )
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Interpret XML.
14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
14618bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token == '\0')
14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
1464151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(keyword,token,MagickPathExtent);
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Doctype element.
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
14718bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleNCompare(keyword,"<!--",4) == 0)
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Comment element.
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
14808bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<include") == 0)
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Include element.
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1490151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(keyword,token,MagickPathExtent);
14918bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (*token != '=')
14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
14948bedb4edca01599dfd0612cb0daa35b09c67d736Cristy          GetNextToken(q,&q,extent,token);
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(keyword,"file") == 0)
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (depth > 200)
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ThrowMagickException(exception,GetMagickModule(),
1499efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy                  ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  char
1503151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    path[MagickPathExtent],
1504b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                    *file_xml;
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  GetPathComponent(filename,HeadPath,path);
15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*path != '\0')
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) ConcatenateMagickString(path,DirectorySeparator,
1509151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                      MagickPathExtent);
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*token == *DirectorySeparator)
1511151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) CopyMagickString(path,token,MagickPathExtent);
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
1513151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    (void) ConcatenateMagickString(path,token,MagickPathExtent);
1514b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                  file_xml=FileToXML(path,~0UL);
1515b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                  if (file_xml != (char *) NULL)
15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
1517b18d864b3f06e9272582b7736230d934d715d542dirk                      status&=LoadLogCache(cache,file_xml,path,depth+1,
1518cd2cd1803dda951bcfff101c44032ae17e52655fcristy                        exception);
1519b81f0abf7970b3c3e43ba0c95266a1c252806425dirk                      file_xml=DestroyString(file_xml);
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"<logmap>") == 0)
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Allocate memory for the log list.
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
153173bd4a51b419e914565bdf204bf1540dc4c8ee26cristy        log_info=(LogInfo *) AcquireMagickMemory(sizeof(*log_info));
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (log_info == (LogInfo *) NULL)
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ResetMagickMemory(log_info,0,sizeof(*log_info));
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        log_info->path=ConstantString(filename);
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        GetTimerInfo((TimerInfo *) &log_info->timer);
1537e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy        log_info->signature=MagickCoreSignature;
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (log_info == (LogInfo *) NULL)
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(keyword,"</logmap>") == 0)
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1544b18d864b3f06e9272582b7736230d934d715d542dirk        status=AppendValueToLinkedList(cache,log_info);
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ThrowMagickException(exception,GetMagickModule(),
1547efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy            ResourceLimitError,"MemoryAllocationFailed","`%s'",filename);
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        log_info=(LogInfo *) NULL;
1549d3e70a10bb3ed0cf41112b369f97b7fd2b422c58cristy        continue;
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
15518bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,(const char **) NULL,extent,token);
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (*token != '=')
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
15548bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
15558bedb4edca01599dfd0612cb0daa35b09c67d736Cristy    GetNextToken(q,&q,extent,token);
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*keyword)
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'E':
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'e':
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"events") == 0)
15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            log_info->event_mask=(LogEventType) (log_info->event_mask |
1564042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy              ParseCommandOption(MagickLogEventOptions,MagickTrue,token));
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'F':
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'f':
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"filename") == 0)
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (log_info->filename != (char *) NULL)
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              log_info->filename=(char *)
15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                RelinquishMagickMemory(log_info->filename);
15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            log_info->filename=ConstantString(token);
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"format") == 0)
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (log_info->format != (char *) NULL)
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              log_info->format=(char *)
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                RelinquishMagickMemory(log_info->format);
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            log_info->format=ConstantString(token);
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'G':
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'g':
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"generations") == 0)
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare(token,"unlimited") == 0)
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                log_info->generations=(~0UL);
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
1600e27293e706ca05b6b121e9512a83b16f7ad887f2cristy            log_info->generations=StringToUnsignedLong(token);
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'L':
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'l':
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"limit") == 0)
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare(token,"unlimited") == 0)
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                log_info->limit=(~0UL);
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
1615e27293e706ca05b6b121e9512a83b16f7ad887f2cristy            log_info->limit=StringToUnsignedLong(token);
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'O':
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'o':
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare((char *) keyword,"output") == 0)
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            log_info->handler_mask=(LogHandlerType)
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (log_info->handler_mask | ParseLogHandlers(token));
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  token=DestroyString(token);
1636b18d864b3f06e9272582b7736230d934d715d542dirk  if (cache == (LinkedListInfo *) NULL)
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status != 0 ? MagickTrue : MagickFalse);
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   P a r s e L o g H a n d l e r s                                           %
16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ParseLogHandlers() parses a string defining which handlers takes a log
16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  message and exports them.
16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ParseLogHandlers method is:
16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      LogHandlerType ParseLogHandlers(const char *handlers)
16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o handlers: one or more handlers separated by commas.
16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic LogHandlerType ParseLogHandlers(const char *handlers)
16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogHandlerType
16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    handler_mask;
16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1672bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  handler_mask=NoHandler;
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=handlers; p != (char *) NULL; p=strchr(p,','))
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((*p != '\0') && ((isspace((int) ((unsigned char) *p)) != 0) ||
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (*p == ',')))
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p++;
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (i=0; LogHandlers[i].name != (char *) NULL; i++)
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=strlen(LogHandlers[i].name);
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleNCompare(p,LogHandlers[i].name,length) == 0)
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          handler_mask=(LogHandlerType) (handler_mask | LogHandlers[i].handler);
16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LogHandlers[i].name == (char *) NULL)
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(UndefinedHandler);
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(handler_mask);
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t L o g E v e n t M a s k                                             %
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetLogEventMask() accepts a list that determines which events to log.  All
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  other events are ignored.  By default, no debug is enabled.  This method
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns the previous log event mask.
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetLogEventMask method is:
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      LogEventType SetLogEventMask(const char *events)
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o events: log these events.
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport LogEventType SetLogEventMask(const char *events)
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1731bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    option;
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=(LogInfo *) GetLogInfo("*",exception);
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
1737042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy  option=ParseCommandOption(MagickLogEventOptions,MagickTrue,events);
1738f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
173986e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  log_info=(LogInfo *) GetValueFromLinkedList(log_cache,0);
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info->event_mask=(LogEventType) option;
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (option == -1)
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    log_info->event_mask=UndefinedEvents;
1743f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(log_info->event_mask);
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t L o g F o r m a t                                                   %
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetLogFormat() sets the format for the "human readable" log record.
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the LogMagickFormat method is:
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      SetLogFormat(const char *format)
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o format: the log record format.
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void SetLogFormat(const char *format)
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LogInfo
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *log_info;
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info=(LogInfo *) GetLogInfo("*",exception);
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
1780f84a193d5f435588cd78d521fff3f1f852e227f8cristy  LockSemaphoreInfo(log_semaphore);
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (log_info->format != (char *) NULL)
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    log_info->format=DestroyString(log_info->format);
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  log_info->format=ConstantString(format);
1784f84a193d5f435588cd78d521fff3f1f852e227f8cristy  UnlockSemaphoreInfo(log_semaphore);
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1786834a57918ebe6c5e12fb5f97465a9107f805aae5dirk
1787834a57918ebe6c5e12fb5f97465a9107f805aae5dirk/*
1788834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1789834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1790834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1791834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1792834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%   S e t L o g M e t h o d                                                   %
1793834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1794834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1795834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%                                                                             %
1796834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1797834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1798834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%  SetLogMethod() sets the method that will be called when an event is logged.
1799834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1800834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%  The format of the SetLogMethod method is:
1801834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1802834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%      void SetLogMethod(MagickLogMethod method)
1803834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1804834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%  A description of each parameter follows:
1805834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1806834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%    o method: pointer to a method that will be called when LogMagickEvent is
1807834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%      being called.
1808834a57918ebe6c5e12fb5f97465a9107f805aae5dirk%
1809834a57918ebe6c5e12fb5f97465a9107f805aae5dirk*/
1810834a57918ebe6c5e12fb5f97465a9107f805aae5dirkMagickExport void SetLogMethod(MagickLogMethod method)
1811834a57918ebe6c5e12fb5f97465a9107f805aae5dirk{
1812834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  ExceptionInfo
1813834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    *exception;
1814834a57918ebe6c5e12fb5f97465a9107f805aae5dirk
1815834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  LogInfo
1816834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    *log_info;
1817834a57918ebe6c5e12fb5f97465a9107f805aae5dirk
1818834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  exception=AcquireExceptionInfo();
1819834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  log_info=(LogInfo *) GetLogInfo("*",exception);
1820834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  exception=DestroyExceptionInfo(exception);
1821834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  LockSemaphoreInfo(log_semaphore);
182286e5ac9bd8a1d10f4fc55dae95585db303b6a1e7cristy  log_info=(LogInfo *) GetValueFromLinkedList(log_cache,0);
1823834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  log_info->handler_mask=(LogHandlerType) (log_info->handler_mask |
1824834a57918ebe6c5e12fb5f97465a9107f805aae5dirk    MethodHandler);
1825834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  log_info->method=method;
1826834a57918ebe6c5e12fb5f97465a9107f805aae5dirk  UnlockSemaphoreInfo(log_semaphore);
1827834a57918ebe6c5e12fb5f97465a9107f805aae5dirk}
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t L o g N a m e                                                       %
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetLogName() sets the log name and returns it.
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetLogName method is:
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      const char *SetLogName(const char *name)
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o log_name: SetLogName() returns the current client name.
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: Specifies the new client name.
18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport const char *SetLogName(const char *name)
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((name != (char *) NULL) && (*name != '\0'))
1856151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) CopyMagickString(log_name,name,MagickPathExtent);
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(log_name);
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1859