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-2016 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%    http://www.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*/
75MagickExport 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*/
100MagickExport 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)
137  "gslib "
138#endif
139#if defined(MAGICKCORE_GVC_DELEGATE)
140  "gvc "
141#endif
142#if defined(MAGICKCORE_JBIG_DELEGATE)
143  "jbig "
144#endif
145#if defined(MAGICKCORE_JPEG_DELEGATE) && defined(MAGICKCORE_PNG_DELEGATE)
146  "jng "
147#endif
148#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
149  "jp2 "
150#endif
151#if defined(MAGICKCORE_JPEG_DELEGATE)
152  "jpeg "
153#endif
154#if defined(MAGICKCORE_LCMS_DELEGATE)
155  "lcms "
156#endif
157#if defined(MAGICKCORE_LQR_DELEGATE)
158  "lqr "
159#endif
160#if defined(MAGICKCORE_LTDL_DELEGATE)
161  "ltdl "
162#endif
163#if defined(MAGICKCORE_LZMA_DELEGATE)
164  "lzma "
165#endif
166#if defined(MAGICKCORE_OPENEXR_DELEGATE)
167  "openexr "
168#endif
169#if defined(MAGICKCORE_PANGOCAIRO_DELEGATE)
170  "pangocairo "
171#endif
172#if defined(MAGICKCORE_PNG_DELEGATE)
173  "png "
174#endif
175#if defined(MAGICKCORE_DPS_DELEGATE) || defined(MAGICKCORE_GS_DELEGATE) || defined(WIN32)
176  "ps "
177#endif
178#if defined(MAGICKCORE_RSVG_DELEGATE)
179  "rsvg "
180#endif
181#if defined(MAGICKCORE_TIFF_DELEGATE)
182  "tiff "
183#endif
184#if defined(MAGICKCORE_WEBP_DELEGATE)
185  "webp "
186#endif
187#if defined(MAGICKCORE_WMF_DELEGATE) || defined (MAGICKCORE_WMFLITE_DELEGATE)
188  "wmf "
189#endif
190#if defined(MAGICKCORE_X11_DELEGATE)
191  "x "
192#endif
193#if defined(MAGICKCORE_XML_DELEGATE)
194  "xml "
195#endif
196#if defined(MAGICKCORE_ZLIB_DELEGATE)
197  "zlib"
198#endif
199  ;
200}
201
202/*
203%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
204%                                                                             %
205%                                                                             %
206%                                                                             %
207%   G e t M a g i c k F e a t u r e s                                         %
208%                                                                             %
209%                                                                             %
210%                                                                             %
211%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
212%
213%  GetMagickFeatures() returns the ImageMagick features.
214%
215%  The format of the GetMagickFeatures method is:
216%
217%      const char *GetMagickFeatures(void)
218%
219%  No parameters are required.
220%
221*/
222MagickExport const char *GetMagickFeatures(void)
223{
224  return ""
225#if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DEBUG)
226  "Debug "
227#endif
228#if defined(MAGICKCORE_CIPHER_SUPPORT)
229  "Cipher "
230#endif
231#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
232  "DPC "
233#endif
234#if defined(MAGICKCORE_HDRI_SUPPORT)
235  "HDRI "
236#endif
237#if defined(MAGICKCORE_BUILD_MODULES) || defined(_DLL)
238  "Modules "
239#endif
240#if defined(MAGICKCORE_OPENCL_SUPPORT)
241  "OpenCL "
242#endif
243#if defined(MAGICKCORE_OPENMP_SUPPORT)
244  "OpenMP "
245#endif
246#if defined(ZERO_CONFIGURATION_SUPPORT)
247  "Zero-configuration "
248#endif
249  ;
250}
251
252/*
253%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254%                                                                             %
255%                                                                             %
256%                                                                             %
257%   G e t M a g i c k H o m e U R L                                           %
258%                                                                             %
259%                                                                             %
260%                                                                             %
261%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
262%
263%  GetMagickHomeURL() returns the ImageMagick home URL.
264%
265%  The format of the GetMagickHomeURL method is:
266%
267%      char *GetMagickHomeURL(void)
268%
269*/
270MagickExport char *GetMagickHomeURL(void)
271{
272  char
273    path[MagickPathExtent];
274
275  const char
276    *element;
277
278  ExceptionInfo
279    *exception;
280
281  LinkedListInfo
282    *paths;
283
284  exception=AcquireExceptionInfo();
285  paths=GetConfigurePaths(MagickURLFilename,exception);
286  exception=DestroyExceptionInfo(exception);
287  if (paths == (LinkedListInfo *) NULL)
288    return(ConstantString(MagickHomeURL));
289  element=(const char *) GetNextValueInLinkedList(paths);
290  while (element != (const char *) NULL)
291  {
292    (void) FormatLocaleString(path,MagickPathExtent,"%s%s%s",element,
293      DirectorySeparator,MagickURLFilename);
294    if (IsPathAccessible(path) != MagickFalse)
295      return(ConstantString(path));
296    element=(const char *) GetNextValueInLinkedList(paths);
297  }
298  return(ConstantString(MagickHomeURL));
299}
300
301/*
302%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
303%                                                                             %
304%                                                                             %
305%                                                                             %
306%   G e t M a g i c k L i c e n s e                                           %
307%                                                                             %
308%                                                                             %
309%                                                                             %
310%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
311%
312%  GetMagickLicense() returns the ImageMagick API license as a string.
313%
314%  The format of the GetMagickLicense method is:
315%
316%      const char *GetMagickLicense(void)
317%
318*/
319MagickExport const char *GetMagickLicense(void)
320{
321  return(MagickAuthoritativeLicense);
322}
323
324/*
325%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326%                                                                             %
327%                                                                             %
328%                                                                             %
329%   G e t M a g i c k P a c k a g e N a m e                                   %
330%                                                                             %
331%                                                                             %
332%                                                                             %
333%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
334%
335%  GetMagickPackageName() returns the ImageMagick package name.
336%
337%  The format of the GetMagickName method is:
338%
339%      const char *GetMagickName(void)
340%
341%  No parameters are required.
342%
343*/
344MagickExport const char *GetMagickPackageName(void)
345{
346  return(MagickPackageName);
347}
348
349/*
350%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
351%                                                                             %
352%                                                                             %
353%                                                                             %
354%   G e t M a g i c k Q u a n t u m D e p t h                                 %
355%                                                                             %
356%                                                                             %
357%                                                                             %
358%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
359%
360%  GetMagickQuantumDepth() returns the ImageMagick quantum depth.
361%
362%  The format of the GetMagickQuantumDepth method is:
363%
364%      const char *GetMagickQuantumDepth(size_t *depth)
365%
366%  A description of each parameter follows:
367%
368%    o depth: the quantum depth is returned as a number.
369%
370*/
371MagickExport const char *GetMagickQuantumDepth(size_t *depth)
372{
373  if (depth != (size_t *) NULL)
374    *depth=(size_t) MAGICKCORE_QUANTUM_DEPTH;
375  return(MagickQuantumDepth);
376}
377
378/*
379%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
380%                                                                             %
381%                                                                             %
382%                                                                             %
383%   G e t M a g i c k Q u a n t u m R a n g e                                 %
384%                                                                             %
385%                                                                             %
386%                                                                             %
387%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388%
389%  GetMagickQuantumRange() returns the ImageMagick quantum range.
390%
391%  The format of the GetMagickQuantumRange method is:
392%
393%      const char *GetMagickQuantumRange(size_t *range)
394%
395%  A description of each parameter follows:
396%
397%    o range: the quantum range is returned as a number.
398%
399*/
400MagickExport const char *GetMagickQuantumRange(size_t *range)
401{
402  if (range != (size_t *) NULL)
403    *range=(size_t) QuantumRange;
404  return(MagickQuantumRange);
405}
406
407/*
408%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
409%                                                                             %
410%                                                                             %
411%                                                                             %
412%   G e t M a g i c k R e l e a s e D a t e                                   %
413%                                                                             %
414%                                                                             %
415%                                                                             %
416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
417%
418%  GetMagickReleaseDate() returns the ImageMagick release date.
419%
420%  The format of the GetMagickReleaseDate method is:
421%
422%      const char *GetMagickReleaseDate(void)
423%
424%  No parameters are required.
425%
426*/
427MagickExport const char *GetMagickReleaseDate(void)
428{
429  return(MagickReleaseDate);
430}
431
432/*
433%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
434%                                                                             %
435%                                                                             %
436%                                                                             %
437%   G e t M a g i c k S i g n a t u r e                                       %
438%                                                                             %
439%                                                                             %
440%                                                                             %
441%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
442%
443%  GetMagickSignature() returns a signature that uniquely encodes the
444%  MagickCore libary version, quantum depth, HDRI status, OS word size, and
445%  endianness.
446%
447%  The format of the GetMagickSignature method is:
448%
449%      unsigned int GetMagickSignature(const StringInfo *nonce)
450%
451%  A description of each parameter follows:
452%
453%    o nonce: arbitrary data.
454%
455*/
456
457static unsigned int CRC32(const unsigned char *message,const size_t length)
458{
459  register ssize_t
460    i;
461
462  static MagickBooleanType
463    crc_initial = MagickFalse;
464
465  static unsigned int
466    crc_xor[256];
467
468  unsigned int
469    crc;
470
471  /*
472    Generate a 32-bit cyclic redundancy check for the message.
473  */
474  if (crc_initial == MagickFalse)
475    {
476      register unsigned int
477        i;
478
479      unsigned int
480        alpha;
481
482      for (i=0; i < 256; i++)
483      {
484        register ssize_t
485          j;
486
487        alpha=i;
488        for (j=0; j < 8; j++)
489          alpha=(alpha & 0x01) ? (0xEDB88320 ^ (alpha >> 1)) : (alpha >> 1);
490        crc_xor[i]=alpha;
491      }
492      crc_initial=MagickTrue;
493    }
494  crc=0xFFFFFFFF;
495  for (i=0; i < (ssize_t) length; i++)
496    crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8);
497  return(crc ^ 0xFFFFFFFF);
498}
499
500MagickExport unsigned int GetMagickSignature(const StringInfo *nonce)
501{
502  register unsigned char
503    *p;
504
505  StringInfo
506    *version;
507
508  unsigned int
509    signature;
510
511  version=AcquireStringInfo(MagickPathExtent);
512  p=GetStringInfoDatum(version);
513  signature=MAGICKCORE_QUANTUM_DEPTH;
514  (void) memcpy(p,&signature,sizeof(signature));
515  p+=sizeof(signature);
516  signature=MAGICKCORE_HDRI_ENABLE;
517  (void) memcpy(p,&signature,sizeof(signature));
518  p+=sizeof(signature);
519  signature=MagickLibInterface;
520  (void) memcpy(p,&signature,sizeof(signature));
521  p+=sizeof(signature);
522  signature=1;  /* endianess */
523  (void) memcpy(p,&signature,sizeof(signature));
524  p+=sizeof(signature);
525  SetStringInfoLength(version,p-GetStringInfoDatum(version));
526  if (nonce != (const StringInfo *) NULL)
527    ConcatenateStringInfo(version,nonce);
528  signature=CRC32(GetStringInfoDatum(version),GetStringInfoLength(version));
529  version=DestroyStringInfo(version);
530  return(signature);
531}
532
533/*
534%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
535%                                                                             %
536%                                                                             %
537%                                                                             %
538%   G e t M a g i c k V e r s i o n                                           %
539%                                                                             %
540%                                                                             %
541%                                                                             %
542%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
543%
544%  GetMagickVersion() returns the ImageMagick API version as a string and
545%  as a number.
546%
547%  The format of the GetMagickVersion method is:
548%
549%      const char *GetMagickVersion(size_t *version)
550%
551%  A description of each parameter follows:
552%
553%    o version: the ImageMagick version is returned as a number.
554%
555*/
556MagickExport const char *GetMagickVersion(size_t *version)
557{
558  if (version != (size_t *) NULL)
559    *version=MagickLibVersion;
560  return(MagickVersion);
561}
562
563/*
564%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
565%                                                                             %
566%                                                                             %
567%                                                                             %
568%   L i s t M a g i c k V e r s i o n                                         %
569%                                                                             %
570%                                                                             %
571%                                                                             %
572%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
573%
574%  ListMagickVersion() identifies the ImageMagick version by printing its
575%  attributes to the file.  Attributes include the copyright, features, and
576%  delegates.
577%
578%  The format of the ListMagickVersion method is:
579%
580%      void ListMagickVersion(FILE *file)
581%
582%  A description of each parameter follows:
583%
584%    o file: the file, typically stdout.
585%
586*/
587MagickExport void ListMagickVersion(FILE *file)
588{
589  (void) FormatLocaleFile(file,"Version: %s\n",
590    GetMagickVersion((size_t *) NULL));
591  (void) FormatLocaleFile(file,"Copyright: %s\n",GetMagickCopyright());
592  (void) FormatLocaleFile(file,"License: %s\n",GetMagickLicense());
593#if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_FULL_VER)
594  (void) FormatLocaleFile(file,"Visual C++: %d\n",_MSC_FULL_VER);
595#endif
596  (void) FormatLocaleFile(file,"Features: %s\n",GetMagickFeatures());
597  (void) FormatLocaleFile(file,"Delegates (built-in): %s\n",
598    GetMagickDelegates());
599}
600