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-2020 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_ZLIB_DELEGATE)
210 "zlib"
211 #endif
212 ;
213 }
214
215 /*
216 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
217 % %
218 % %
219 % %
220 % G e t M a g i c k F e a t u r e s %
221 % %
222 % %
223 % %
224 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
225 %
226 % GetMagickFeatures() returns the ImageMagick features.
227 %
228 % The format of the GetMagickFeatures method is:
229 %
230 % const char *GetMagickFeatures(void)
231 %
232 % No parameters are required.
233 %
234 */
GetMagickFeatures(void)235 MagickExport const char *GetMagickFeatures(void)
236 {
237 return ""
238 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DEBUG)
239 "Debug "
240 #endif
241 #if defined(MAGICKCORE_CIPHER_SUPPORT)
242 "Cipher "
243 #endif
244 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
245 "DPC "
246 #endif
247 #if defined(MAGICKCORE_HDRI_SUPPORT)
248 "HDRI "
249 #endif
250 #if defined(MAGICKCORE_BUILD_MODULES) || defined(_DLL)
251 "Modules "
252 #endif
253 #if defined(MAGICKCORE_OPENCL_SUPPORT)
254 "OpenCL "
255 #endif
256 #if defined(MAGICKCORE_OPENMP_SUPPORT)
257 "OpenMP"
258 #if _OPENMP == 199810
259 "(1.0) "
260 #elif _OPENMP == 200203
261 "(2.0) "
262 #elif _OPENMP == 200505
263 "(2.5) "
264 #elif _OPENMP == 200805
265 "(3.0) "
266 #elif _OPENMP == 201107
267 "(3.1) "
268 #elif _OPENMP == 201307
269 "(4.0) "
270 #elif _OPENMP == 201511
271 "(4.5) "
272 #elif _OPENMP == 201811
273 "(5.0) "
274 #else
275 " "
276 #endif
277 #endif
278 #if defined(ZERO_CONFIGURATION_SUPPORT)
279 "Zero-configuration "
280 #endif
281 #if (MAGICKCORE_QUANTUM_DEPTH == 64)
282 "Q64 (experimental, not for production) "
283 #endif
284 ;
285 }
286
287 /*
288 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
289 % %
290 % %
291 % %
292 % G e t M a g i c k H o m e U R L %
293 % %
294 % %
295 % %
296 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
297 %
298 % GetMagickHomeURL() returns the ImageMagick home URL.
299 %
300 % The format of the GetMagickHomeURL method is:
301 %
302 % char *GetMagickHomeURL(void)
303 %
304 */
GetMagickHomeURL(void)305 MagickExport char *GetMagickHomeURL(void)
306 {
307 char
308 path[MagickPathExtent];
309
310 const char
311 *element;
312
313 ExceptionInfo
314 *exception;
315
316 LinkedListInfo
317 *paths;
318
319 exception=AcquireExceptionInfo();
320 paths=GetConfigurePaths(MagickURLFilename,exception);
321 exception=DestroyExceptionInfo(exception);
322 if (paths == (LinkedListInfo *) NULL)
323 return(ConstantString(MagickHomeURL));
324 element=(const char *) GetNextValueInLinkedList(paths);
325 while (element != (const char *) NULL)
326 {
327 (void) FormatLocaleString(path,MagickPathExtent,"%s%s%s",element,
328 DirectorySeparator,MagickURLFilename);
329 if (IsPathAccessible(path) != MagickFalse)
330 {
331 paths=DestroyLinkedList(paths,RelinquishMagickMemory);
332 return(ConstantString(path));
333 }
334 element=(const char *) GetNextValueInLinkedList(paths);
335 }
336 paths=DestroyLinkedList(paths,RelinquishMagickMemory);
337 return(ConstantString(MagickHomeURL));
338 }
339
340 /*
341 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
342 % %
343 % %
344 % %
345 % G e t M a g i c k L i c e n s e %
346 % %
347 % %
348 % %
349 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
350 %
351 % GetMagickLicense() returns the ImageMagick API license as a string.
352 %
353 % The format of the GetMagickLicense method is:
354 %
355 % const char *GetMagickLicense(void)
356 %
357 */
GetMagickLicense(void)358 MagickExport const char *GetMagickLicense(void)
359 {
360 return(MagickAuthoritativeLicense);
361 }
362
363 /*
364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
365 % %
366 % %
367 % %
368 % G e t M a g i c k P a c k a g e N a m e %
369 % %
370 % %
371 % %
372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
373 %
374 % GetMagickPackageName() returns the ImageMagick package name.
375 %
376 % The format of the GetMagickName method is:
377 %
378 % const char *GetMagickName(void)
379 %
380 % No parameters are required.
381 %
382 */
GetMagickPackageName(void)383 MagickExport const char *GetMagickPackageName(void)
384 {
385 return(MagickPackageName);
386 }
387
388 /*
389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
390 % %
391 % %
392 % %
393 % G e t M a g i c k Q u a n t u m D e p t h %
394 % %
395 % %
396 % %
397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
398 %
399 % GetMagickQuantumDepth() returns the ImageMagick quantum depth.
400 %
401 % The format of the GetMagickQuantumDepth method is:
402 %
403 % const char *GetMagickQuantumDepth(size_t *depth)
404 %
405 % A description of each parameter follows:
406 %
407 % o depth: the quantum depth is returned as a number.
408 %
409 */
GetMagickQuantumDepth(size_t * depth)410 MagickExport const char *GetMagickQuantumDepth(size_t *depth)
411 {
412 if (depth != (size_t *) NULL)
413 *depth=(size_t) MAGICKCORE_QUANTUM_DEPTH;
414 return(MagickQuantumDepth);
415 }
416
417 /*
418 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
419 % %
420 % %
421 % %
422 % G e t M a g i c k Q u a n t u m R a n g e %
423 % %
424 % %
425 % %
426 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
427 %
428 % GetMagickQuantumRange() returns the ImageMagick quantum range.
429 %
430 % The format of the GetMagickQuantumRange method is:
431 %
432 % const char *GetMagickQuantumRange(size_t *range)
433 %
434 % A description of each parameter follows:
435 %
436 % o range: the quantum range is returned as a number.
437 %
438 */
GetMagickQuantumRange(size_t * range)439 MagickExport const char *GetMagickQuantumRange(size_t *range)
440 {
441 if (range != (size_t *) NULL)
442 *range=(size_t) QuantumRange;
443 return(MagickQuantumRange);
444 }
445
446 /*
447 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
448 % %
449 % %
450 % %
451 % G e t M a g i c k R e l e a s e D a t e %
452 % %
453 % %
454 % %
455 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
456 %
457 % GetMagickReleaseDate() returns the ImageMagick release date.
458 %
459 % The format of the GetMagickReleaseDate method is:
460 %
461 % const char *GetMagickReleaseDate(void)
462 %
463 % No parameters are required.
464 %
465 */
GetMagickReleaseDate(void)466 MagickExport const char *GetMagickReleaseDate(void)
467 {
468 return(MagickReleaseDate);
469 }
470
471 /*
472 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
473 % %
474 % %
475 % %
476 % G e t M a g i c k S i g n a t u r e %
477 % %
478 % %
479 % %
480 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
481 %
482 % GetMagickSignature() returns a signature that uniquely encodes the
483 % MagickCore libary version, quantum depth, HDRI status, OS word size, and
484 % endianness.
485 %
486 % The format of the GetMagickSignature method is:
487 %
488 % unsigned int GetMagickSignature(const StringInfo *nonce)
489 %
490 % A description of each parameter follows:
491 %
492 % o nonce: arbitrary data.
493 %
494 */
495
CRC32(const unsigned char * message,const size_t length)496 static unsigned int CRC32(const unsigned char *message,const size_t length)
497 {
498 register ssize_t
499 i;
500
501 static MagickBooleanType
502 crc_initial = MagickFalse;
503
504 static unsigned int
505 crc_xor[256];
506
507 unsigned int
508 crc;
509
510 /*
511 Generate a 32-bit cyclic redundancy check for the message.
512 */
513 if (crc_initial == MagickFalse)
514 {
515 register unsigned int
516 j;
517
518 unsigned int
519 alpha;
520
521 for (j=0; j < 256; j++)
522 {
523 register ssize_t
524 k;
525
526 alpha=j;
527 for (k=0; k < 8; k++)
528 alpha=(alpha & 0x01) ? (0xEDB88320 ^ (alpha >> 1)) : (alpha >> 1);
529 crc_xor[j]=alpha;
530 }
531 crc_initial=MagickTrue;
532 }
533 crc=0xFFFFFFFF;
534 for (i=0; i < (ssize_t) length; i++)
535 crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8);
536 return(crc ^ 0xFFFFFFFF);
537 }
538
GetMagickSignature(const StringInfo * nonce)539 MagickExport unsigned int GetMagickSignature(const StringInfo *nonce)
540 {
541 register unsigned char
542 *p;
543
544 StringInfo
545 *version;
546
547 unsigned int
548 signature;
549
550 version=AcquireStringInfo(MagickPathExtent);
551 p=GetStringInfoDatum(version);
552 signature=MAGICKCORE_QUANTUM_DEPTH;
553 (void) memcpy(p,&signature,sizeof(signature));
554 p+=sizeof(signature);
555 signature=MAGICKCORE_HDRI_ENABLE;
556 (void) memcpy(p,&signature,sizeof(signature));
557 p+=sizeof(signature);
558 signature=MagickLibInterface;
559 (void) memcpy(p,&signature,sizeof(signature));
560 p+=sizeof(signature);
561 signature=1; /* endianess */
562 (void) memcpy(p,&signature,sizeof(signature));
563 p+=sizeof(signature);
564 SetStringInfoLength(version,p-GetStringInfoDatum(version));
565 if (nonce != (const StringInfo *) NULL)
566 ConcatenateStringInfo(version,nonce);
567 signature=CRC32(GetStringInfoDatum(version),GetStringInfoLength(version));
568 version=DestroyStringInfo(version);
569 return(signature);
570 }
571
572 /*
573 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
574 % %
575 % %
576 % %
577 % G e t M a g i c k V e r s i o n %
578 % %
579 % %
580 % %
581 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
582 %
583 % GetMagickVersion() returns the ImageMagick API version as a string and
584 % as a number.
585 %
586 % The format of the GetMagickVersion method is:
587 %
588 % const char *GetMagickVersion(size_t *version)
589 %
590 % A description of each parameter follows:
591 %
592 % o version: the ImageMagick version is returned as a number.
593 %
594 */
GetMagickVersion(size_t * version)595 MagickExport const char *GetMagickVersion(size_t *version)
596 {
597 if (version != (size_t *) NULL)
598 *version=MagickLibVersion;
599 return(MagickVersion);
600 }
601
602 /*
603 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
604 % %
605 % %
606 % %
607 % L i s t M a g i c k V e r s i o n %
608 % %
609 % %
610 % %
611 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
612 %
613 % ListMagickVersion() identifies the ImageMagick version by printing its
614 % attributes to the file. Attributes include the copyright, features, and
615 % delegates.
616 %
617 % The format of the ListMagickVersion method is:
618 %
619 % void ListMagickVersion(FILE *file)
620 %
621 % A description of each parameter follows:
622 %
623 % o file: the file, typically stdout.
624 %
625 */
ListMagickVersion(FILE * file)626 MagickExport void ListMagickVersion(FILE *file)
627 {
628 (void) FormatLocaleFile(file,"Version: %s\n",
629 GetMagickVersion((size_t *) NULL));;
630 (void) FormatLocaleFile(file,"Copyright: %s\n",GetMagickCopyright());
631 (void) FormatLocaleFile(file,"License: %s\n",GetMagickLicense());
632 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_FULL_VER)
633 (void) FormatLocaleFile(file,"Visual C++: %d\n",_MSC_FULL_VER);
634 #endif
635 (void) FormatLocaleFile(file,"Features: %s\n",GetMagickFeatures());
636 (void) FormatLocaleFile(file,"Delegates (built-in): %s\n",
637 GetMagickDelegates());
638 if (IsEventLogging() != MagickFalse)
639 {
640 (void) FormatLocaleFile(file,"Wizard attributes: ");
641 (void) FormatLocaleFile(file,"QuantumRange=%g; ",(double) QuantumRange);
642 (void) FormatLocaleFile(file,"QuantumScale=%.*g; ",GetMagickPrecision(),
643 (double) QuantumScale);
644 (void) FormatLocaleFile(file,"MagickEpsilon=%.*g; ",GetMagickPrecision(),
645 (double) MagickEpsilon);
646 (void) FormatLocaleFile(file,"MaxMap=%g; ",(double) MaxMap);
647 (void) FormatLocaleFile(file,"MagickPathExtent=%g; ",
648 (double) MagickPathExtent);
649 (void) FormatLocaleFile(file,"sizeof(Quantum)=%g; ",(double)
650 sizeof(Quantum));
651 (void) FormatLocaleFile(file,"sizeof(MagickSizeType)=%g; ",(double)
652 sizeof(MagickSizeType));
653 (void) FormatLocaleFile(file,"sizeof(MagickOffsetType)=%g",(double)
654 sizeof(MagickOffsetType));
655 }
656 }
657