1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %               V   V  EEEEE  RRRR   SSSSS  IIIII   OOO   N   N               %
7 %               V   V  E      R   R  SS       I    O   O  NN  N               %
8 %               V   V  EEE    RRRR    SSS     I    O   O  N N N               %
9 %                V V   E      R R       SS    I    O   O  N  NN               %
10 %                 V    EEEEE  R  R   SSSSS  IIIII   OOO   N   N               %
11 %                                                                             %
12 %                                                                             %
13 %                   MagickCore Version and Copyright Methods                  %
14 %                                                                             %
15 %                              Software Design                                %
16 %                                   Cristy                                    %
17 %                               September 2002                                %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization      %
21 %  dedicated to making software imaging solutions freely available.           %
22 %                                                                             %
23 %  You may not use this file except in compliance with the License.  You may  %
24 %  obtain a copy of the License at                                            %
25 %                                                                             %
26 %    https://imagemagick.org/script/license.php                               %
27 %                                                                             %
28 %  Unless required by applicable law or agreed to in writing, software        %
29 %  distributed under the License is distributed on an "AS IS" BASIS,          %
30 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31 %  See the License for the specific language governing permissions and        %
32 %  limitations under the License.                                             %
33 %                                                                             %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %
37 */
38 
39 #include "MagickCore/studio.h"
40 #include "MagickCore/configure.h"
41 #include "MagickCore/exception.h"
42 #include "MagickCore/exception-private.h"
43 #include "MagickCore/linked-list.h"
44 #include "MagickCore/locale_.h"
45 #include "MagickCore/option.h"
46 #include "MagickCore/string_.h"
47 #include "MagickCore/utility.h"
48 #include "MagickCore/utility-private.h"
49 #include "MagickCore/version.h"
50 #include "MagickCore/version-private.h"
51 
52 /*
53   Define declarations.
54 */
55 #define MagickURLFilename  "index.html"
56 
57 /*
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59 %                                                                             %
60 %                                                                             %
61 %                                                                             %
62 %   G e t M a g i c k C o p y r i g h t                                       %
63 %                                                                             %
64 %                                                                             %
65 %                                                                             %
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67 %
68 %  GetMagickCopyright() returns the ImageMagick API copyright as a string.
69 %
70 %  The format of the GetMagickCopyright method is:
71 %
72 %      const char *GetMagickCopyright(void)
73 %
74 */
GetMagickCopyright(void)75 MagickExport const char *GetMagickCopyright(void)
76 {
77   return(MagickCopyright);
78 }
79 
80 /*
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 %                                                                             %
83 %                                                                             %
84 %                                                                             %
85 %   G e t M a g i c k D e l e g a t e s                                       %
86 %                                                                             %
87 %                                                                             %
88 %                                                                             %
89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90 %
91 %  GetMagickDelegates() returns the ImageMagick delegate libraries.
92 %
93 %  The format of the GetMagickDelegates method is:
94 %
95 %      const char *GetMagickDelegates(void)
96 %
97 %  No parameters are required.
98 %
99 */
GetMagickDelegates(void)100 MagickExport const char *GetMagickDelegates(void)
101 {
102   return ""
103 #if defined(MAGICKCORE_AUTOTRACE_DELEGATE)
104   "autotrace "
105 #endif
106 #if defined(MAGICKCORE_BZLIB_DELEGATE)
107   "bzlib "
108 #endif
109 #if defined(MAGICKCORE_CAIRO_DELEGATE)
110   "cairo "
111 #endif
112 #if defined(MAGICKCORE_DJVU_DELEGATE)
113   "djvu "
114 #endif
115 #if defined(MAGICKCORE_DPS_DELEGATE)
116   "dps "
117 #endif
118 #if defined(MAGICKCORE_EMF_DELEGATE)
119   "emf "
120 #endif
121 #if defined(MAGICKCORE_FFTW_DELEGATE)
122   "fftw "
123 #endif
124 #if defined(MAGICKCORE_FLIF_DELEGATE)
125   "flif "
126 #endif
127 #if defined(MAGICKCORE_FONTCONFIG_DELEGATE)
128   "fontconfig "
129 #endif
130 #if defined(MAGICKCORE_FPX_DELEGATE)
131   "fpx "
132 #endif
133 #if defined(MAGICKCORE_FREETYPE_DELEGATE)
134   "freetype "
135 #endif
136 #if defined(MAGICKCORE_GS_DELEGATE) || defined(MAGICKCORE_WINDOWS_SUPPORT)
137   "gslib "
138 #endif
139 #if defined(MAGICKCORE_GVC_DELEGATE)
140   "gvc "
141 #endif
142 #if defined(MAGICKCORE_HEIC_DELEGATE)
143   "heic "
144 #endif
145 #if defined(MAGICKCORE_JBIG_DELEGATE)
146   "jbig "
147 #endif
148 #if defined(MAGICKCORE_JPEG_DELEGATE) && defined(MAGICKCORE_PNG_DELEGATE)
149   "jng "
150 #endif
151 #if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
152   "jp2 "
153 #endif
154 #if defined(MAGICKCORE_JPEG_DELEGATE)
155   "jpeg "
156 #endif
157 #if defined(MAGICKCORE_JXL_DELEGATE)
158   "jxl "
159 #endif
160 #if defined(MAGICKCORE_LCMS_DELEGATE)
161   "lcms "
162 #endif
163 #if defined(MAGICKCORE_LQR_DELEGATE)
164   "lqr "
165 #endif
166 #if defined(MAGICKCORE_LTDL_DELEGATE)
167   "ltdl "
168 #endif
169 #if defined(MAGICKCORE_LZMA_DELEGATE)
170   "lzma "
171 #endif
172 #if defined(MAGICKCORE_OPENEXR_DELEGATE)
173   "openexr "
174 #endif
175 #if defined(MAGICKCORE_PANGOCAIRO_DELEGATE)
176   "pangocairo "
177 #endif
178 #if defined(MAGICKCORE_PNG_DELEGATE)
179   "png "
180 #endif
181 #if defined(MAGICKCORE_DPS_DELEGATE) || defined(MAGICKCORE_GS_DELEGATE) || \
182     defined(MAGICKCORE_WINDOWS_SUPPORT)
183   "ps "
184 #endif
185 #if defined(MAGICKCORE_RAQM_DELEGATE)
186   "raqm "
187 #endif
188 #if defined(MAGICKCORE_RAW_R_DELEGATE)
189   "raw "
190 #endif
191 #if defined(MAGICKCORE_RSVG_DELEGATE)
192   "rsvg "
193 #endif
194 #if defined(MAGICKCORE_TIFF_DELEGATE)
195   "tiff "
196 #endif
197 #if defined(MAGICKCORE_WEBP_DELEGATE)
198   "webp "
199 #endif
200 #if defined(MAGICKCORE_WMF_DELEGATE) || defined (MAGICKCORE_WMFLITE_DELEGATE)
201   "wmf "
202 #endif
203 #if defined(MAGICKCORE_X11_DELEGATE)
204   "x "
205 #endif
206 #if defined(MAGICKCORE_XML_DELEGATE)
207   "xml "
208 #endif
209 #if defined(MAGICKCORE_ZIP_DELEGATE)
210   "zip "
211 #endif
212 #if defined(MAGICKCORE_ZLIB_DELEGATE)
213   "zlib"
214 #endif
215   ;
216 }
217 
218 /*
219 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
220 %                                                                             %
221 %                                                                             %
222 %                                                                             %
223 %   G e t M a g i c k F e a t u r e s                                         %
224 %                                                                             %
225 %                                                                             %
226 %                                                                             %
227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
228 %
229 %  GetMagickFeatures() returns the ImageMagick features.
230 %
231 %  The format of the GetMagickFeatures method is:
232 %
233 %      const char *GetMagickFeatures(void)
234 %
235 %  No parameters are required.
236 %
237 */
GetMagickFeatures(void)238 MagickExport const char *GetMagickFeatures(void)
239 {
240   return ""
241 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DEBUG)
242   "Debug "
243 #endif
244 #if defined(MAGICKCORE_CIPHER_SUPPORT)
245   "Cipher "
246 #endif
247 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
248   "DPC "
249 #endif
250 #if defined(MAGICKCORE_HDRI_SUPPORT)
251   "HDRI "
252 #endif
253 #if defined(MAGICKCORE_BUILD_MODULES) || defined(_DLL)
254   "Modules "
255 #endif
256 #if defined(MAGICKCORE_OPENCL_SUPPORT)
257   "OpenCL "
258 #endif
259 #if defined(MAGICKCORE_OPENMP_SUPPORT)
260   "OpenMP"
261 #if _OPENMP == 199810
262   "(1.0) "
263 #elif _OPENMP == 200203
264   "(2.0) "
265 #elif _OPENMP == 200505
266   "(2.5) "
267 #elif _OPENMP == 200805
268   "(3.0) "
269 #elif _OPENMP == 201107
270   "(3.1) "
271 #elif _OPENMP == 201307
272   "(4.0) "
273 #elif _OPENMP == 201511
274   "(4.5) "
275 #elif _OPENMP == 201811
276   "(5.0) "
277 #else
278   " "
279 #endif
280 #endif
281 #if defined(MAGICKCORE_HAVE_TCMALLOC)
282   "TCMalloc "
283 #endif
284 #if defined(ZERO_CONFIGURATION_SUPPORT)
285   "Zero-configuration "
286 #endif
287 #if (MAGICKCORE_QUANTUM_DEPTH == 64)
288   "Q64 (experimental, not for production) "
289 #endif
290   ;
291 }
292 
293 /*
294 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
295 %                                                                             %
296 %                                                                             %
297 %                                                                             %
298 %   G e t M a g i c k H o m e U R L                                           %
299 %                                                                             %
300 %                                                                             %
301 %                                                                             %
302 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
303 %
304 %  GetMagickHomeURL() returns the ImageMagick home URL.
305 %
306 %  The format of the GetMagickHomeURL method is:
307 %
308 %      char *GetMagickHomeURL(void)
309 %
310 */
GetMagickHomeURL(void)311 MagickExport char *GetMagickHomeURL(void)
312 {
313   char
314     path[MagickPathExtent];
315 
316   const char
317     *element;
318 
319   ExceptionInfo
320     *exception;
321 
322   LinkedListInfo
323     *paths;
324 
325   exception=AcquireExceptionInfo();
326   paths=GetConfigurePaths(MagickURLFilename,exception);
327   exception=DestroyExceptionInfo(exception);
328   if (paths == (LinkedListInfo *) NULL)
329     return(ConstantString(MagickHomeURL));
330   element=(const char *) GetNextValueInLinkedList(paths);
331   while (element != (const char *) NULL)
332   {
333     (void) FormatLocaleString(path,MagickPathExtent,"%s%s%s",element,
334       DirectorySeparator,MagickURLFilename);
335     if (IsPathAccessible(path) != MagickFalse)
336       {
337         paths=DestroyLinkedList(paths,RelinquishMagickMemory);
338         return(ConstantString(path));
339       }
340     element=(const char *) GetNextValueInLinkedList(paths);
341   }
342   paths=DestroyLinkedList(paths,RelinquishMagickMemory);
343   return(ConstantString(MagickHomeURL));
344 }
345 
346 /*
347 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
348 %                                                                             %
349 %                                                                             %
350 %                                                                             %
351 %   G e t M a g i c k L i c e n s e                                           %
352 %                                                                             %
353 %                                                                             %
354 %                                                                             %
355 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356 %
357 %  GetMagickLicense() returns the ImageMagick API license as a string.
358 %
359 %  The format of the GetMagickLicense method is:
360 %
361 %      const char *GetMagickLicense(void)
362 %
363 */
GetMagickLicense(void)364 MagickExport const char *GetMagickLicense(void)
365 {
366   return(MagickAuthoritativeLicense);
367 }
368 
369 /*
370 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
371 %                                                                             %
372 %                                                                             %
373 %                                                                             %
374 %   G e t M a g i c k P a c k a g e N a m e                                   %
375 %                                                                             %
376 %                                                                             %
377 %                                                                             %
378 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
379 %
380 %  GetMagickPackageName() returns the ImageMagick package name.
381 %
382 %  The format of the GetMagickName method is:
383 %
384 %      const char *GetMagickName(void)
385 %
386 %  No parameters are required.
387 %
388 */
GetMagickPackageName(void)389 MagickExport const char *GetMagickPackageName(void)
390 {
391   return(MagickPackageName);
392 }
393 
394 /*
395 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
396 %                                                                             %
397 %                                                                             %
398 %                                                                             %
399 %   G e t M a g i c k Q u a n t u m D e p t h                                 %
400 %                                                                             %
401 %                                                                             %
402 %                                                                             %
403 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
404 %
405 %  GetMagickQuantumDepth() returns the ImageMagick quantum depth.
406 %
407 %  The format of the GetMagickQuantumDepth method is:
408 %
409 %      const char *GetMagickQuantumDepth(size_t *depth)
410 %
411 %  A description of each parameter follows:
412 %
413 %    o depth: the quantum depth is returned as a number.
414 %
415 */
GetMagickQuantumDepth(size_t * depth)416 MagickExport const char *GetMagickQuantumDepth(size_t *depth)
417 {
418   if (depth != (size_t *) NULL)
419     *depth=(size_t) MAGICKCORE_QUANTUM_DEPTH;
420   return(MagickQuantumDepth);
421 }
422 
423 /*
424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
425 %                                                                             %
426 %                                                                             %
427 %                                                                             %
428 %   G e t M a g i c k Q u a n t u m R a n g e                                 %
429 %                                                                             %
430 %                                                                             %
431 %                                                                             %
432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
433 %
434 %  GetMagickQuantumRange() returns the ImageMagick quantum range.
435 %
436 %  The format of the GetMagickQuantumRange method is:
437 %
438 %      const char *GetMagickQuantumRange(size_t *range)
439 %
440 %  A description of each parameter follows:
441 %
442 %    o range: the quantum range is returned as a number.
443 %
444 */
GetMagickQuantumRange(size_t * range)445 MagickExport const char *GetMagickQuantumRange(size_t *range)
446 {
447   if (range != (size_t *) NULL)
448     *range=(size_t) QuantumRange;
449   return(MagickQuantumRange);
450 }
451 
452 /*
453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
454 %                                                                             %
455 %                                                                             %
456 %                                                                             %
457 %   G e t M a g i c k R e l e a s e D a t e                                   %
458 %                                                                             %
459 %                                                                             %
460 %                                                                             %
461 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
462 %
463 %  GetMagickReleaseDate() returns the ImageMagick release date.
464 %
465 %  The format of the GetMagickReleaseDate method is:
466 %
467 %      const char *GetMagickReleaseDate(void)
468 %
469 %  No parameters are required.
470 %
471 */
GetMagickReleaseDate(void)472 MagickExport const char *GetMagickReleaseDate(void)
473 {
474   return(MagickReleaseDate);
475 }
476 
477 /*
478 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
479 %                                                                             %
480 %                                                                             %
481 %                                                                             %
482 %   G e t M a g i c k S i g n a t u r e                                       %
483 %                                                                             %
484 %                                                                             %
485 %                                                                             %
486 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
487 %
488 %  GetMagickSignature() returns a signature that uniquely encodes the
489 %  MagickCore libary version, quantum depth, HDRI status, OS word size, and
490 %  endianness.
491 %
492 %  The format of the GetMagickSignature method is:
493 %
494 %      unsigned int GetMagickSignature(const StringInfo *nonce)
495 %
496 %  A description of each parameter follows:
497 %
498 %    o nonce: arbitrary data.
499 %
500 */
501 
CRC32(const unsigned char * message,const size_t length)502 static unsigned int CRC32(const unsigned char *message,const size_t length)
503 {
504   ssize_t
505     i;
506 
507   static MagickBooleanType
508     crc_initial = MagickFalse;
509 
510   static unsigned int
511     crc_xor[256];
512 
513   unsigned int
514     crc;
515 
516   /*
517     Generate a 32-bit cyclic redundancy check for the message.
518   */
519   if (crc_initial == MagickFalse)
520     {
521       unsigned int
522         j;
523 
524       unsigned int
525         alpha;
526 
527       for (j=0; j < 256; j++)
528       {
529         ssize_t
530           k;
531 
532         alpha=j;
533         for (k=0; k < 8; k++)
534           alpha=(alpha & 0x01) ? (0xEDB88320 ^ (alpha >> 1)) : (alpha >> 1);
535         crc_xor[j]=alpha;
536       }
537       crc_initial=MagickTrue;
538     }
539   crc=0xFFFFFFFF;
540   for (i=0; i < (ssize_t) length; i++)
541     crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8);
542   return(crc ^ 0xFFFFFFFF);
543 }
544 
GetMagickSignature(const StringInfo * nonce)545 MagickExport unsigned int GetMagickSignature(const StringInfo *nonce)
546 {
547   unsigned char
548     *p;
549 
550   StringInfo
551     *version;
552 
553   unsigned int
554     signature;
555 
556   version=AcquireStringInfo(MagickPathExtent);
557   p=GetStringInfoDatum(version);
558   signature=MAGICKCORE_QUANTUM_DEPTH;
559   (void) memcpy(p,&signature,sizeof(signature));
560   p+=sizeof(signature);
561   signature=MAGICKCORE_HDRI_ENABLE;
562   (void) memcpy(p,&signature,sizeof(signature));
563   p+=sizeof(signature);
564   signature=MagickLibInterface;
565   (void) memcpy(p,&signature,sizeof(signature));
566   p+=sizeof(signature);
567   signature=1;  /* endianness */
568   (void) memcpy(p,&signature,sizeof(signature));
569   p+=sizeof(signature);
570   SetStringInfoLength(version,p-GetStringInfoDatum(version));
571   if (nonce != (const StringInfo *) NULL)
572     ConcatenateStringInfo(version,nonce);
573   signature=CRC32(GetStringInfoDatum(version),GetStringInfoLength(version));
574   version=DestroyStringInfo(version);
575   return(signature);
576 }
577 
578 /*
579 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
580 %                                                                             %
581 %                                                                             %
582 %                                                                             %
583 %   G e t M a g i c k V e r s i o n                                           %
584 %                                                                             %
585 %                                                                             %
586 %                                                                             %
587 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
588 %
589 %  GetMagickVersion() returns the ImageMagick API version as a string and
590 %  as a number.
591 %
592 %  The format of the GetMagickVersion method is:
593 %
594 %      const char *GetMagickVersion(size_t *version)
595 %
596 %  A description of each parameter follows:
597 %
598 %    o version: the ImageMagick version is returned as a number.
599 %
600 */
GetMagickVersion(size_t * version)601 MagickExport const char *GetMagickVersion(size_t *version)
602 {
603   if (version != (size_t *) NULL)
604     *version=MagickLibVersion;
605   return(MagickVersion);
606 }
607 
608 /*
609 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
610 %                                                                             %
611 %                                                                             %
612 %                                                                             %
613 %   L i s t M a g i c k V e r s i o n                                         %
614 %                                                                             %
615 %                                                                             %
616 %                                                                             %
617 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
618 %
619 %  ListMagickVersion() identifies the ImageMagick version by printing its
620 %  attributes to the file.  Attributes include the copyright, features, and
621 %  delegates.
622 %
623 %  The format of the ListMagickVersion method is:
624 %
625 %      void ListMagickVersion(FILE *file)
626 %
627 %  A description of each parameter follows:
628 %
629 %    o file: the file, typically stdout.
630 %
631 */
ListMagickVersion(FILE * file)632 MagickExport void ListMagickVersion(FILE *file)
633 {
634   (void) FormatLocaleFile(file,"Version: %s\n",
635     GetMagickVersion((size_t *) NULL));;
636   (void) FormatLocaleFile(file,"Copyright: %s\n",GetMagickCopyright());
637   (void) FormatLocaleFile(file,"License: %s\n",GetMagickLicense());
638 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_FULL_VER)
639   (void) FormatLocaleFile(file,"Visual C++: %d\n",_MSC_FULL_VER);
640 #endif
641   (void) FormatLocaleFile(file,"Features: %s\n",GetMagickFeatures());
642   (void) FormatLocaleFile(file,"Delegates (built-in): %s\n",
643     GetMagickDelegates());
644   if (IsEventLogging() != MagickFalse)
645     {
646       (void) FormatLocaleFile(file,"Wizard attributes: ");
647       (void) FormatLocaleFile(file,"QuantumRange=%g; ",(double) QuantumRange);
648       (void) FormatLocaleFile(file,"QuantumScale=%.*g; ",GetMagickPrecision(),
649         (double) QuantumScale);
650       (void) FormatLocaleFile(file,"MagickEpsilon=%.*g; ",GetMagickPrecision(),
651         (double) MagickEpsilon);
652       (void) FormatLocaleFile(file,"MaxMap=%g; ",(double) MaxMap);
653       (void) FormatLocaleFile(file,"MagickPathExtent=%g; ",
654         (double) MagickPathExtent);
655       (void) FormatLocaleFile(file,"sizeof(Quantum)=%g; ",(double)
656         sizeof(Quantum));
657       (void) FormatLocaleFile(file,"sizeof(MagickSizeType)=%g; ",(double)
658         sizeof(MagickSizeType));
659       (void) FormatLocaleFile(file,"sizeof(MagickOffsetType)=%g",(double)
660         sizeof(MagickOffsetType));
661     }
662 }
663