Fossil

Hex Artifact Content
Login

Artifact 50e3be4716625ffea38d0f8248051de7372b78282744f33dde201bed5dd977cb:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 43 20 70 72 6f  /*.** This C pro
0010: 67 72 61 6d 20 67 65 6e 65 72 61 74 65 73 20 74  gram generates t
0020: 68 65 20 22 56 45 52 53 49 4f 4e 2e 68 22 20 68  he "VERSION.h" h
0030: 65 61 64 65 72 20 66 69 6c 65 20 66 72 6f 6d 20  eader file from 
0040: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 65  information.** e
0050: 78 74 72 61 63 74 65 64 20 6f 75 74 20 6f 66 20  xtracted out of 
0060: 74 68 65 20 22 6d 61 6e 69 66 65 73 74 22 2c 20  the "manifest", 
0070: 22 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 22 2c  "manifest.uuid",
0080: 20 61 6e 64 20 22 56 45 52 53 49 4f 4e 22 20 66   and "VERSION" f
0090: 69 6c 65 73 2e 0a 2a 2a 20 43 61 6c 6c 20 74 68  iles..** Call th
00a0: 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20  is program with 
00b0: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 3a  three arguments:
00c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2f 61 2e 6f  .**.**     ./a.o
00d0: 75 74 20 6d 61 6e 69 66 65 73 74 2e 75 75 69 64  ut manifest.uuid
00e0: 20 6d 61 6e 69 66 65 73 74 20 56 45 52 53 49 4f   manifest VERSIO
00f0: 4e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  N.**.** Note tha
0100: 74 20 74 68 65 20 6d 61 6e 69 66 65 73 74 2e 75  t the manifest.u
0110: 75 69 64 20 61 6e 64 20 6d 61 6e 69 66 65 73 74  uid and manifest
0120: 20 66 69 6c 65 73 20 61 72 65 20 67 65 6e 65 72   files are gener
0130: 61 74 65 64 20 62 79 20 46 6f 73 73 69 6c 2e 0a  ated by Fossil..
0140: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74  **.** The output
0150: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 22 56 45   becomes the "VE
0160: 52 53 49 4f 4e 2e 68 22 20 66 69 6c 65 2e 20 20  RSION.h" file.  
0170: 54 68 65 20 6f 75 74 70 75 74 20 69 73 20 61 20  The output is a 
0180: 43 2d 6c 61 6e 67 75 61 67 65 0a 2a 2a 20 68 65  C-language.** he
0190: 61 64 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  ader that contai
01a0: 6e 73 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  ns #defines for 
01b0: 76 61 72 69 6f 75 73 20 70 72 6f 70 65 72 74 69  various properti
01c0: 65 73 20 6f 66 20 74 68 65 20 62 75 69 6c 64 3a  es of the build:
01d0: 0a 2a 2a 0a 2a 2a 20 20 20 4d 41 4e 49 46 45 53  .**.**   MANIFES
01e0: 54 5f 55 55 49 44 20 20 20 20 20 20 20 20 20 20  T_UUID          
01f0: 20 20 20 20 54 68 65 73 65 20 76 61 6c 75 65 73      These values
0200: 20 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67   are text string
0210: 73 20 74 68 61 74 0a 2a 2a 20 20 20 4d 41 4e 49  s that.**   MANI
0220: 46 45 53 54 5f 56 45 52 53 49 4f 4e 20 20 20 20  FEST_VERSION    
0230: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 79 20         identify 
0240: 74 68 65 20 46 6f 73 73 69 6c 20 63 68 65 63 6b  the Fossil check
0250: 2d 69 6e 20 74 6f 20 77 68 69 63 68 0a 2a 2a 20  -in to which.** 
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
0280: 20 73 6f 75 72 63 65 20 74 72 65 65 20 62 65 6c   source tree bel
0290: 6f 6e 67 73 2e 20 20 54 68 65 79 20 64 6f 20 6e  ongs.  They do n
02a0: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ot.**           
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 74 61 6b 65 20 69 6e 74 6f 20 61 63 63     take into acc
02d0: 6f 75 6e 74 20 61 6e 79 20 75 6e 63 6f 6d 6d 69  ount any uncommi
02e0: 74 74 65 64 20 65 64 69 74 73 2e 0a 2a 2a 0a 2a  tted edits..**.*
02f0: 2a 20 20 20 46 4f 53 53 49 4c 5f 42 55 49 4c 44  *   FOSSIL_BUILD
0300: 5f 48 41 53 48 20 20 20 20 20 20 20 20 20 20 41  _HASH          A
0310: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 73 74 72   hexadecimal str
0320: 69 6e 67 20 74 68 61 74 20 69 73 20 61 20 73 74  ing that is a st
0330: 72 6f 6e 67 20 68 61 73 68 0a 2a 2a 20 20 20 20  rong hash.**    
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
0360: 20 4d 41 4e 49 46 45 53 54 5f 55 55 49 44 20 74   MANIFEST_UUID t
0370: 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
0380: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 6f 66   current time of
03b0: 20 74 68 65 20 62 75 69 6c 64 2e 20 20 57 65 20   the build.  We 
03c0: 6e 6f 72 6d 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  normally want.**
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
03f0: 69 73 20 74 6f 20 62 65 20 64 69 66 66 65 72 65  is to be differe
0400: 6e 74 20 6f 6e 20 65 61 63 68 20 62 75 69 6c 64  nt on each build
0410: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 20 20  , as the.**     
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 69           value i
0440: 73 20 75 73 65 64 20 74 6f 20 65 78 70 69 72 65  s used to expire
0450: 20 45 54 61 67 3a 20 66 69 65 6c 64 73 20 69 6e   ETag: fields in
0460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 48 54 54 50 20 72 65 71 75 65 73 74 73 2e 20   HTTP requests. 
0490: 20 42 75 74 20 69 66 20 79 6f 75 20 6e 65 65 64   But if you need
04a0: 20 74 6f 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   to do.**       
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 20 72 65 70 65 61 74 61 62 6c         repeatabl
04d0: 65 20 62 79 74 65 2d 66 6f 72 2d 62 79 74 65 20  e byte-for-byte 
04e0: 69 64 65 6e 74 69 63 61 6c 20 62 75 69 6c 64 73  identical builds
04f0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0510: 20 20 61 64 64 20 74 68 65 20 2d 44 46 4f 53 53    add the -DFOSS
0520: 49 4c 5f 42 55 49 4c 44 5f 45 50 4f 43 48 3d 6e  IL_BUILD_EPOCH=n
0530: 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20   option..**.**  
0540: 20 4d 41 4e 49 46 45 53 54 5f 44 41 54 45 20 20   MANIFEST_DATE  
0550: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0560: 64 61 74 65 2f 74 69 6d 65 20 6f 66 20 74 68 65  date/time of the
0570: 20 73 6f 75 72 63 65 2d 63 6f 64 65 20 63 68 65   source-code che
0580: 63 6b 2d 69 6e 0a 2a 2a 20 20 20 4d 41 4e 49 46  ck-in.**   MANIF
0590: 45 53 54 5f 59 45 41 52 20 20 20 20 20 20 20 20  EST_YEAR        
05a0: 20 20 20 20 20 20 69 6e 20 76 61 72 69 6f 75 73        in various
05b0: 20 66 6f 72 6d 61 74 73 2e 0a 2a 2a 20 20 20 4d   formats..**   M
05c0: 41 4e 49 46 45 53 54 5f 4e 55 4d 45 52 49 43 5f  ANIFEST_NUMERIC_
05d0: 44 41 54 45 0a 2a 2a 20 20 20 4d 41 4e 49 46 45  DATE.**   MANIFE
05e0: 53 54 5f 4e 55 4d 45 52 49 43 5f 54 49 4d 45 0a  ST_NUMERIC_TIME.
05f0: 2a 2a 0a 2a 2a 20 20 20 52 45 4c 45 41 53 45 5f  **.**   RELEASE_
0600: 56 45 52 53 49 4f 4e 20 20 20 20 20 20 20 20 20  VERSION         
0610: 20 20 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6e     The version n
0620: 75 6d 62 65 72 20 28 66 72 6f 6d 20 74 68 65 20  umber (from the 
0630: 56 45 52 53 49 4f 4e 20 73 6f 75 72 63 65 0a 2a  VERSION source.*
0640: 2a 20 20 20 52 45 4c 45 41 53 45 5f 56 45 52 53  *   RELEASE_VERS
0650: 49 4f 4e 5f 4e 55 4d 42 45 52 20 20 20 20 20 66  ION_NUMBER     f
0660: 69 6c 65 29 20 69 6e 20 76 61 72 69 6f 75 73 20  ile) in various 
0670: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 20 20 52 45 4c  format..**   REL
0680: 45 41 53 45 5f 52 45 53 4f 55 52 43 45 5f 56 45  EASE_RESOURCE_VE
0690: 52 53 49 4f 4e 0a 2a 2a 0a 2a 2a 20 4e 65 77 20  RSION.**.** New 
06a0: 23 64 65 66 69 6e 65 73 20 6d 61 79 20 62 65 20  #defines may be 
06b0: 61 64 64 65 64 20 69 6e 20 74 68 65 20 66 75 74  added in the fut
06c0: 75 72 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ure..*/.#include
06d0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
06e0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
06f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0700: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h>.#include <cty
0710: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pe.h>.#include <
0720: 74 69 6d 65 2e 68 3e 0a 0a 23 69 66 20 64 65 66  time.h>..#if def
0730: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
0740: 26 20 28 5f 4d 53 43 5f 56 45 52 20 3c 20 31 38  & (_MSC_VER < 18
0750: 30 30 29 20 2f 2a 20 4d 53 56 53 20 32 30 31 33  00) /* MSVS 2013
0760: 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 73 74   */.#  define st
0770: 72 74 6f 6c 6c 20 5f 73 74 72 74 6f 69 36 34 0a  rtoll _strtoi64.
0780: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 46  #endif..static F
0790: 49 4c 45 20 2a 6f 70 65 6e 5f 66 6f 72 5f 72 65  ILE *open_for_re
07a0: 61 64 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72  ading(const char
07b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
07c0: 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28  FILE *f = fopen(
07d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b  zFilename, "r");
07e0: 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20  .  if( f==0 ){. 
07f0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
0800: 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
0810: 5c 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69  \"%s\" for readi
0820: 6e 67 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ng\n", zFilename
0830: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
0840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a    }.  return f;.
0850: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
0860: 6e 20 61 72 62 69 74 72 61 72 79 2d 6c 65 6e 67  n arbitrary-leng
0870: 74 68 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  th input string 
0880: 6b 65 79 20 7a 49 6e 2c 20 67 65 6e 65 72 61 74  key zIn, generat
0890: 65 0a 2a 2a 20 61 6e 20 4e 2d 62 79 74 65 20 68  e.** an N-byte h
08a0: 65 78 61 64 65 63 69 6d 61 6c 20 68 61 73 68 20  exadecimal hash 
08b0: 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67 20 69  of that string i
08c0: 6e 74 6f 20 7a 4f 75 74 2e 0a 2a 2f 0a 73 74 61  nto zOut..*/.sta
08d0: 74 69 63 20 76 6f 69 64 20 68 61 73 68 28 63 6f  tic void hash(co
08e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69  nst char *zIn, i
08f0: 6e 74 20 4e 2c 20 63 68 61 72 20 2a 7a 4f 75 74  nt N, char *zOut
0900: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
0910: 61 72 20 69 2c 20 6a 2c 20 74 3b 0a 20 20 69 6e  ar i, j, t;.  in
0920: 74 20 6d 2c 20 6e 3b 0a 20 20 75 6e 73 69 67 6e  t m, n;.  unsign
0930: 65 64 20 63 68 61 72 20 73 5b 32 35 36 5d 3b 0a  ed char s[256];.
0940: 20 20 66 6f 72 28 6d 3d 30 3b 20 6d 3c 32 35 36    for(m=0; m<256
0950: 3b 20 6d 2b 2b 29 7b 20 73 5b 6d 5d 20 3d 20 6d  ; m++){ s[m] = m
0960: 3b 20 7d 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6d  ; }.  for(j=0, m
0970: 3d 6e 3d 30 3b 20 6d 3c 32 35 36 3b 20 6d 2b 2b  =n=0; m<256; m++
0980: 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d  , n++){.    j +=
0990: 20 73 5b 6d 5d 20 2b 20 7a 49 6e 5b 6e 5d 3b 0a   s[m] + zIn[n];.
09a0: 20 20 20 20 69 66 28 20 7a 49 6e 5b 6e 5d 3d 3d      if( zIn[n]==
09b0: 30 20 29 7b 20 6e 20 3d 20 2d 31 3b 20 7d 0a 20  0 ){ n = -1; }. 
09c0: 20 20 20 74 20 3d 20 73 5b 6a 5d 3b 0a 20 20 20     t = s[j];.   
09d0: 20 73 5b 6a 5d 20 3d 20 73 5b 6d 5d 3b 0a 20 20   s[j] = s[m];.  
09e0: 20 20 73 5b 6d 5d 20 3d 20 74 3b 0a 20 20 7d 0a    s[m] = t;.  }.
09f0: 20 20 69 20 3d 20 6a 20 3d 20 30 3b 0a 20 20 66    i = j = 0;.  f
0a00: 6f 72 28 6e 3d 30 3b 20 6e 3c 4e 2d 32 3b 20 6e  or(n=0; n<N-2; n
0a10: 2b 3d 32 29 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20  +=2){.    i++;. 
0a20: 20 20 20 74 20 3d 20 73 5b 69 5d 3b 0a 20 20 20     t = s[i];.   
0a30: 20 6a 20 2b 3d 20 74 3b 0a 20 20 20 20 73 5b 69   j += t;.    s[i
0a40: 5d 20 3d 20 73 5b 6a 5d 3b 0a 20 20 20 20 73 5b  ] = s[j];.    s[
0a50: 6a 5d 20 3d 20 74 3b 0a 20 20 20 20 74 20 2b 3d  j] = t;.    t +=
0a60: 20 73 5b 69 5d 3b 0a 20 20 20 20 7a 4f 75 74 5b   s[i];.    zOut[
0a70: 6e 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  n] = "0123456789
0a80: 61 62 63 64 65 66 22 5b 28 74 3e 3e 34 29 26 30  abcdef"[(t>>4)&0
0a90: 78 66 5d 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 2b  xf];.    zOut[n+
0aa0: 31 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39  1] = "0123456789
0ab0: 61 62 63 64 65 66 22 5b 74 26 30 78 66 5d 3b 0a  abcdef"[t&0xf];.
0ac0: 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 5d 20 3d 20    }.  zOut[n] = 
0ad0: 30 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 63 61 6c 20 73  0;.}../* Local s
0ae0: 74 72 63 70 79 28 29 20 63 6c 6f 6e 65 20 74 6f  trcpy() clone to
0af0: 20 73 71 75 65 6c 63 68 20 61 6e 20 75 6e 77 61   squelch an unwa
0b00: 72 72 61 6e 74 65 64 20 77 61 72 6e 69 6e 67 20  rranted warning 
0b10: 66 72 6f 6d 20 4f 70 65 6e 42 53 44 2e 20 2a 2f  from OpenBSD. */
0b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 63  .static void loc
0b30: 61 6c 5f 73 74 72 63 70 79 28 63 68 61 72 20 2a  al_strcpy(char *
0b40: 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  dest, const char
0b50: 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c 65 28   *src){.  while(
0b60: 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20 2a 28   (*(dest++) = *(
0b70: 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d 0a 7d  src++))!=0 ){}.}
0b80: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
0b90: 72 67 63 2c 20 63 68 61 72 20 2a 61 72 67 76 5b  rgc, char *argv[
0ba0: 5d 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6d 2c  ]){.    FILE *m,
0bb0: 2a 75 2c 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  *u,*v;.    char 
0bc0: 2a 7a 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  *z;.#if defined(
0bd0: 5f 5f 44 4d 43 5f 5f 29 20 20 20 20 20 20 20 20  __DMC__)        
0be0: 20 20 20 20 2f 2a 20 65 2e 67 2e 20 30 78 38 35      /* e.g. 0x85
0bf0: 37 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d  7 */.    int i =
0c00: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   0;.#endif.    i
0c10: 6e 74 20 6a 20 3d 20 30 2c 20 78 20 3d 20 30 2c  nt j = 0, x = 0,
0c20: 20 64 20 3d 20 30 3b 0a 20 20 20 20 73 69 7a 65   d = 0;.    size
0c30: 5f 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 76 6e  _t n;.    int vn
0c40: 5b 33 5d 3b 0a 20 20 20 20 63 68 61 72 20 62 5b  [3];.    char b[
0c50: 31 30 30 30 5d 3b 0a 20 20 20 20 63 68 61 72 20  1000];.    char 
0c60: 76 78 5b 31 30 30 30 5d 3b 0a 20 20 20 20 69 66  vx[1000];.    if
0c70: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
0c80: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
0c90: 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 6d 61  r, "Usage: %s ma
0ca0: 6e 69 66 65 73 74 2e 75 75 69 64 20 6d 61 6e 69  nifest.uuid mani
0cb0: 66 65 73 74 20 56 45 52 53 49 4f 4e 5c 6e 22 2c  fest VERSION\n",
0cc0: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20   argv[0]);.     
0cd0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
0ce0: 20 20 20 20 6d 65 6d 73 65 74 28 62 2c 30 2c 73      memset(b,0,s
0cf0: 69 7a 65 6f 66 28 62 29 29 3b 0a 20 20 20 20 6d  izeof(b));.    m
0d00: 65 6d 73 65 74 28 76 78 2c 30 2c 73 69 7a 65 6f  emset(vx,0,sizeo
0d10: 66 28 76 78 29 29 3b 0a 20 20 20 20 75 20 3d 20  f(vx));.    u = 
0d20: 6f 70 65 6e 5f 66 6f 72 5f 72 65 61 64 69 6e 67  open_for_reading
0d30: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
0d40: 66 28 20 66 67 65 74 73 28 62 2c 20 73 69 7a 65  f( fgets(b, size
0d50: 6f 66 28 62 29 2d 31 2c 75 29 3d 3d 30 20 29 7b  of(b)-1,u)==0 ){
0d60: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
0d70: 74 64 65 72 72 2c 20 22 6d 61 6c 66 6f 72 6d 65  tderr, "malforme
0d80: 64 20 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 20  d manifest.uuid 
0d90: 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 20 61 72 67  file: %s\n", arg
0da0: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 65 78 69  v[1]);.      exi
0db0: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
0dc0: 66 63 6c 6f 73 65 28 75 29 3b 0a 20 20 20 20 66  fclose(u);.    f
0dd0: 6f 72 28 7a 3d 62 3b 20 7a 5b 30 5d 20 26 26 20  or(z=b; z[0] && 
0de0: 7a 5b 30 5d 21 3d 27 5c 72 27 20 26 26 20 7a 5b  z[0]!='\r' && z[
0df0: 30 5d 21 3d 27 5c 6e 27 3b 20 7a 2b 2b 29 7b 7d  0]!='\n'; z++){}
0e00: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  .    *z = 0;.   
0e10: 20 70 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65   printf("#define
0e20: 20 4d 41 4e 49 46 45 53 54 5f 55 55 49 44 20 5c   MANIFEST_UUID \
0e30: 22 25 73 5c 22 5c 6e 22 2c 62 29 3b 0a 20 20 20  "%s\"\n",b);.   
0e40: 20 70 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65   printf("#define
0e50: 20 4d 41 4e 49 46 45 53 54 5f 56 45 52 53 49 4f   MANIFEST_VERSIO
0e60: 4e 20 5c 22 5b 25 31 30 2e 31 30 73 5d 5c 22 5c  N \"[%10.10s]\"\
0e70: 6e 22 2c 62 29 3b 0a 20 20 20 20 6e 20 3d 20 73  n",b);.    n = s
0e80: 74 72 6c 65 6e 28 62 29 3b 0a 20 20 20 20 69 66  trlen(b);.    if
0e90: 28 20 6e 20 2b 20 35 30 20 3c 20 73 69 7a 65 6f  ( n + 50 < sizeo
0ea0: 66 28 62 29 20 29 7b 0a 23 69 66 64 65 66 20 46  f(b) ){.#ifdef F
0eb0: 4f 53 53 49 4c 5f 42 55 49 4c 44 5f 45 50 4f 43  OSSIL_BUILD_EPOC
0ec0: 48 0a 23 64 65 66 69 6e 65 20 73 74 72 28 73 29  H.#define str(s)
0ed0: 20 23 73 0a 20 20 20 20 20 20 73 6e 70 72 69 6e   #s.      snprin
0ee0: 74 66 28 62 2b 6e 2c 20 73 69 7a 65 6f 66 28 62  tf(b+n, sizeof(b
0ef0: 29 2d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )-n,.           
0f00: 20 20 20 20 22 25 64 22 2c 20 28 69 6e 74 29 73      "%d", (int)s
0f10: 74 72 74 6f 6c 6c 28 73 74 72 28 46 4f 53 53 49  trtoll(str(FOSSI
0f20: 4c 5f 42 55 49 4c 44 5f 45 50 4f 43 48 29 2c 20  L_BUILD_EPOCH), 
0f30: 30 2c 20 31 30 29 29 3b 0a 23 65 6c 73 65 0a 20  0, 10));.#else. 
0f40: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
0f50: 2a 7a 45 70 6f 63 68 20 3d 20 67 65 74 65 6e 76  *zEpoch = getenv
0f60: 28 22 53 4f 55 52 43 45 5f 44 41 54 45 5f 45 50  ("SOURCE_DATE_EP
0f70: 4f 43 48 22 29 3b 0a 20 20 20 20 20 20 69 66 28  OCH");.      if(
0f80: 20 7a 45 70 6f 63 68 20 26 26 20 69 73 64 69 67   zEpoch && isdig
0f90: 69 74 28 7a 45 70 6f 63 68 5b 30 5d 29 20 29 7b  it(zEpoch[0]) ){
0fa0: 0a 20 20 20 20 20 20 20 20 73 6e 70 72 69 6e 74  .        snprint
0fb0: 66 28 62 2b 6e 2c 20 73 69 7a 65 6f 66 28 62 29  f(b+n, sizeof(b)
0fc0: 2d 6e 2c 20 22 25 64 22 2c 20 28 69 6e 74 29 73  -n, "%d", (int)s
0fd0: 74 72 74 6f 6c 6c 28 7a 45 70 6f 63 68 2c 20 30  trtoll(zEpoch, 0
0fe0: 2c 20 31 30 29 29 3b 0a 20 20 20 20 20 20 7d 65  , 10));.      }e
0ff0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6e 70  lse{.        snp
1000: 72 69 6e 74 66 28 62 2b 6e 2c 20 73 69 7a 65 6f  rintf(b+n, sizeo
1010: 66 28 62 29 2d 6e 2c 20 22 25 64 22 2c 20 28 69  f(b)-n, "%d", (i
1020: 6e 74 29 74 69 6d 65 28 30 29 29 3b 0a 20 20 20  nt)time(0));.   
1030: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1040: 20 20 68 61 73 68 28 62 2c 33 33 2c 76 78 29 3b    hash(b,33,vx);
1050: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 23  .      printf("#
1060: 64 65 66 69 6e 65 20 46 4f 53 53 49 4c 5f 42 55  define FOSSIL_BU
1070: 49 4c 44 5f 48 41 53 48 20 5c 22 25 73 5c 22 5c  ILD_HASH \"%s\"\
1080: 6e 22 2c 20 76 78 29 3b 0a 20 20 20 20 7d 0a 20  n", vx);.    }. 
1090: 20 20 20 6d 20 3d 20 6f 70 65 6e 5f 66 6f 72 5f     m = open_for_
10a0: 72 65 61 64 69 6e 67 28 61 72 67 76 5b 32 5d 29  reading(argv[2])
10b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 62 20 3d 3d  ;.    while(b ==
10c0: 20 20 66 67 65 74 73 28 62 2c 20 73 69 7a 65 6f    fgets(b, sizeo
10d0: 66 28 62 29 2d 31 2c 6d 29 29 7b 0a 20 20 20 20  f(b)-1,m)){.    
10e0: 20 20 69 66 28 30 20 3d 3d 20 73 74 72 6e 63 6d    if(0 == strncm
10f0: 70 28 22 44 20 22 2c 62 2c 32 29 29 7b 0a 20 20  p("D ",b,2)){.  
1100: 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6e 3b 0a        int k, n;.
1110: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 44 61          char zDa
1120: 74 65 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20  teNum[30];.     
1130: 20 20 20 70 72 69 6e 74 66 28 22 23 64 65 66 69     printf("#defi
1140: 6e 65 20 4d 41 4e 49 46 45 53 54 5f 44 41 54 45  ne MANIFEST_DATE
1150: 20 5c 22 25 2e 31 30 73 20 25 2e 38 73 5c 22 5c   \"%.10s %.8s\"\
1160: 6e 22 2c 62 2b 32 2c 62 2b 31 33 29 3b 0a 20 20  n",b+2,b+13);.  
1170: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 23 64        printf("#d
1180: 65 66 69 6e 65 20 4d 41 4e 49 46 45 53 54 5f 59  efine MANIFEST_Y
1190: 45 41 52 20 5c 22 25 2e 34 73 5c 22 5c 6e 22 2c  EAR \"%.4s\"\n",
11a0: 62 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  b+2);.        n 
11b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
11c0: 28 6b 3d 30 3b 20 6b 3c 31 30 3b 20 6b 2b 2b 29  (k=0; k<10; k++)
11d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
11e0: 69 73 64 69 67 69 74 28 62 5b 6b 2b 32 5d 29 20  isdigit(b[k+2]) 
11f0: 29 20 7a 44 61 74 65 4e 75 6d 5b 6e 2b 2b 5d 20  ) zDateNum[n++] 
1200: 3d 20 62 5b 6b 2b 32 5d 3b 0a 20 20 20 20 20 20  = b[k+2];.      
1210: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 61 74    }.        zDat
1220: 65 4e 75 6d 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  eNum[n] = 0;.   
1230: 20 20 20 20 20 70 72 69 6e 74 66 28 22 23 64 65       printf("#de
1240: 66 69 6e 65 20 4d 41 4e 49 46 45 53 54 5f 4e 55  fine MANIFEST_NU
1250: 4d 45 52 49 43 5f 44 41 54 45 20 25 73 5c 6e 22  MERIC_DATE %s\n"
1260: 2c 20 7a 44 61 74 65 4e 75 6d 29 3b 0a 20 20 20  , zDateNum);.   
1270: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
1280: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 38      for(k=0; k<8
1290: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
12a0: 20 20 69 66 28 20 69 73 64 69 67 69 74 28 62 5b    if( isdigit(b[
12b0: 6b 2b 31 33 5d 29 20 29 20 7a 44 61 74 65 4e 75  k+13]) ) zDateNu
12c0: 6d 5b 6e 2b 2b 5d 20 3d 20 62 5b 6b 2b 31 33 5d  m[n++] = b[k+13]
12d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12e0: 20 20 20 20 7a 44 61 74 65 4e 75 6d 5b 6e 5d 20      zDateNum[n] 
12f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
1300: 28 6b 3d 30 3b 20 7a 44 61 74 65 4e 75 6d 5b 6b  (k=0; zDateNum[k
1310: 5d 3d 3d 27 30 27 3b 20 6b 2b 2b 29 7b 7d 0a 20  ]=='0'; k++){}. 
1320: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 23         printf("#
1330: 64 65 66 69 6e 65 20 4d 41 4e 49 46 45 53 54 5f  define MANIFEST_
1340: 4e 55 4d 45 52 49 43 5f 54 49 4d 45 20 25 73 5c  NUMERIC_TIME %s\
1350: 6e 22 2c 20 7a 44 61 74 65 4e 75 6d 2b 6b 29 3b  n", zDateNum+k);
1360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1370: 20 20 20 66 63 6c 6f 73 65 28 6d 29 3b 0a 20 20     fclose(m);.  
1380: 20 20 76 20 3d 20 6f 70 65 6e 5f 66 6f 72 5f 72    v = open_for_r
1390: 65 61 64 69 6e 67 28 61 72 67 76 5b 33 5d 29 3b  eading(argv[3]);
13a0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 62  .    if( fgets(b
13b0: 2c 20 73 69 7a 65 6f 66 28 62 29 2d 31 2c 76 29  , sizeof(b)-1,v)
13c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
13d0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 61  intf(stderr, "ma
13e0: 6c 66 6f 72 6d 65 64 20 56 45 52 53 49 4f 4e 20  lformed VERSION 
13f0: 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 20 61 72 67  file: %s\n", arg
1400: 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 65 78 69  v[3]);.      exi
1410: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
1420: 66 63 6c 6f 73 65 28 76 29 3b 0a 20 20 20 20 66  fclose(v);.    f
1430: 6f 72 28 7a 3d 62 3b 20 7a 5b 30 5d 20 26 26 20  or(z=b; z[0] && 
1440: 7a 5b 30 5d 21 3d 27 5c 72 27 20 26 26 20 7a 5b  z[0]!='\r' && z[
1450: 30 5d 21 3d 27 5c 6e 27 3b 20 7a 2b 2b 29 7b 7d  0]!='\n'; z++){}
1460: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  .    *z = 0;.   
1470: 20 70 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65   printf("#define
1480: 20 52 45 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e   RELEASE_VERSION
1490: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 62 29 3b 0a   \"%s\"\n", b);.
14a0: 20 20 20 20 7a 3d 62 3b 0a 20 20 20 20 76 6e 5b      z=b;.    vn[
14b0: 30 5d 20 3d 20 76 6e 5b 31 5d 20 3d 20 76 6e 5b  0] = vn[1] = vn[
14c0: 32 5d 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  2] = 0;.    whil
14d0: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e(1){.      if( 
14e0: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
14f0: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  ]<='9' ){.      
1500: 20 20 78 20 3d 20 78 2a 31 30 20 2b 20 7a 5b 30    x = x*10 + z[0
1510: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7d  ] - '0';.      }
1520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1530: 28 20 6a 3c 33 20 29 20 76 6e 5b 6a 2b 2b 5d 20  ( j<3 ) vn[j++] 
1540: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  = x;.        x =
1550: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
1560: 7a 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  z[0]==0 ) break;
1570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
1580: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
1590: 72 28 7a 3d 76 78 3b 20 7a 5b 30 5d 3d 3d 27 30  r(z=vx; z[0]=='0
15a0: 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 20 20 70 72  '; z++){}.    pr
15b0: 69 6e 74 66 28 22 23 64 65 66 69 6e 65 20 52 45  intf("#define RE
15c0: 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  LEASE_VERSION_NU
15d0: 4d 42 45 52 20 25 64 25 30 32 64 25 30 32 64 5c  MBER %d%02d%02d\
15e0: 6e 22 2c 20 76 6e 5b 30 5d 2c 20 76 6e 5b 31 5d  n", vn[0], vn[1]
15f0: 2c 20 76 6e 5b 32 5d 29 3b 0a 20 20 20 20 6d 65  , vn[2]);.    me
1600: 6d 73 65 74 28 76 78 2c 30 2c 73 69 7a 65 6f 66  mset(vx,0,sizeof
1610: 28 76 78 29 29 3b 0a 20 20 20 20 6c 6f 63 61 6c  (vx));.    local
1620: 5f 73 74 72 63 70 79 28 76 78 2c 62 29 3b 0a 20  _strcpy(vx,b);. 
1630: 20 20 20 66 6f 72 28 7a 3d 76 78 3b 20 7a 5b 30     for(z=vx; z[0
1640: 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; z++){.      i
1650: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
1660: 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 30          z[0] = 0
1670: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1690: 66 28 20 7a 5b 30 5d 21 3d 27 2e 27 20 29 20 63  f( z[0]!='.' ) c
16a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
16b0: 66 20 28 20 64 3c 33 20 29 7b 0a 20 20 20 20 20  f ( d<3 ){.     
16c0: 20 20 20 7a 5b 30 5d 20 3d 20 27 2c 27 3b 0a 20     z[0] = ',';. 
16d0: 20 20 20 20 20 20 20 64 2b 2b 3b 0a 20 20 20 20         d++;.    
16e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16f0: 20 7a 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20   z[0] = '\0';.  
1700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1710: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1720: 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65 20 52  rintf("#define R
1730: 45 4c 45 41 53 45 5f 52 45 53 4f 55 52 43 45 5f  ELEASE_RESOURCE_
1740: 56 45 52 53 49 4f 4e 20 25 73 22 2c 20 76 78 29  VERSION %s", vx)
1750: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 3c 33  ;.    while( d<3
1760: 20 29 7b 20 70 72 69 6e 74 66 28 22 2c 30 22 29   ){ printf(",0")
1770: 3b 20 64 2b 2b 3b 20 7d 0a 20 20 20 20 70 72 69  ; d++; }.    pri
1780: 6e 74 66 28 22 5c 6e 22 29 3b 0a 23 69 66 20 64  ntf("\n");.#if d
1790: 65 66 69 6e 65 64 28 5f 5f 44 4d 43 5f 5f 29 20  efined(__DMC__) 
17a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 2e             /* e.
17b0: 67 2e 20 30 78 38 35 37 20 2a 2f 0a 20 20 20 20  g. 0x857 */.    
17c0: 64 20 3d 20 28 5f 5f 44 4d 43 5f 5f 20 26 20 30  d = (__DMC__ & 0
17d0: 78 46 30 30 29 20 3e 3e 20 38 3b 20 2f 2a 20 6d  xF00) >> 8; /* m
17e0: 61 6a 6f 72 20 2a 2f 0a 20 20 20 20 78 20 3d 20  ajor */.    x = 
17f0: 28 5f 5f 44 4d 43 5f 5f 20 26 20 30 78 30 46 30  (__DMC__ & 0x0F0
1800: 29 20 3e 3e 20 34 3b 20 2f 2a 20 6d 69 6e 6f 72  ) >> 4; /* minor
1810: 20 2a 2f 0a 20 20 20 20 69 20 3d 20 28 5f 5f 44   */.    i = (__D
1820: 4d 43 5f 5f 20 26 20 30 78 30 30 46 29 3b 20 20  MC__ & 0x00F);  
1830: 20 20 20 20 2f 2a 20 72 65 76 69 73 69 6f 6e 20      /* revision 
1840: 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 23  */.    printf("#
1850: 64 65 66 69 6e 65 20 43 4f 4d 50 49 4c 45 52 5f  define COMPILER_
1860: 56 45 52 53 49 4f 4e 20 5c 22 25 64 2e 25 64 2e  VERSION \"%d.%d.
1870: 25 64 5c 22 5c 6e 22 2c 20 64 2c 20 78 2c 20 69  %d\"\n", d, x, i
1880: 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1890: 28 5f 5f 50 4f 43 43 5f 5f 29 20 20 20 2f 2a 20  (__POCC__)   /* 
18a0: 65 2e 67 2e 20 37 30 30 20 2a 2f 0a 20 20 20 20  e.g. 700 */.    
18b0: 64 20 3d 20 28 5f 5f 50 4f 43 43 5f 5f 20 2f 20  d = (__POCC__ / 
18c0: 31 30 30 29 3b 20 2f 2a 20 6d 61 6a 6f 72 20 2a  100); /* major *
18d0: 2f 0a 20 20 20 20 78 20 3d 20 28 5f 5f 50 4f 43  /.    x = (__POC
18e0: 43 5f 5f 20 25 20 31 30 30 29 3b 20 2f 2a 20 6d  C__ % 100); /* m
18f0: 69 6e 6f 72 20 2a 2f 0a 20 20 20 20 70 72 69 6e  inor */.    prin
1900: 74 66 28 22 23 64 65 66 69 6e 65 20 43 4f 4d 50  tf("#define COMP
1910: 49 4c 45 52 5f 56 45 52 53 49 4f 4e 20 5c 22 25  ILER_VERSION \"%
1920: 64 2e 25 30 32 64 5c 22 5c 6e 22 2c 20 64 2c 20  d.%02d\"\n", d, 
1930: 78 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  x);.#elif define
1940: 64 28 5f 4d 53 43 5f 56 45 52 29 20 20 20 2f 2a  d(_MSC_VER)   /*
1950: 20 65 2e 67 2e 20 31 38 30 30 20 2a 2f 0a 20 20   e.g. 1800 */.  
1960: 20 20 2f 2a 20 5f 4d 53 43 5f 46 55 4c 4c 5f 56    /* _MSC_FULL_V
1970: 45 52 20 61 6c 73 6f 20 64 65 66 69 6e 65 64 2c  ER also defined,
1980: 20 65 2e 67 2e 20 31 39 33 30 33 30 37 30 39 20   e.g. 193030709 
1990: 2a 2f 0a 20 20 20 20 64 20 3d 20 28 5f 4d 53 43  */.    d = (_MSC
19a0: 5f 56 45 52 20 2f 20 31 30 30 29 3b 20 2f 2a 20  _VER / 100); /* 
19b0: 6d 61 6a 6f 72 20 2a 2f 0a 20 20 20 20 78 20 3d  major */.    x =
19c0: 20 28 5f 4d 53 43 5f 56 45 52 20 25 20 31 30 30   (_MSC_VER % 100
19d0: 29 3b 20 2f 2a 20 6d 69 6e 6f 72 20 2a 2f 0a 20  ); /* minor */. 
19e0: 20 20 20 70 72 69 6e 74 66 28 22 23 64 65 66 69     printf("#defi
19f0: 6e 65 20 43 4f 4d 50 49 4c 45 52 5f 56 45 52 53  ne COMPILER_VERS
1a00: 49 4f 4e 20 5c 22 25 64 2e 25 30 32 64 2e 22 2c  ION \"%d.%02d.",
1a10: 20 64 2c 20 78 29 3b 0a 20 20 20 20 70 72 69 6e   d, x);.    prin
1a20: 74 66 28 22 25 30 35 64 5c 22 5c 6e 22 2c 28 69  tf("%05d\"\n",(i
1a30: 6e 74 29 28 5f 4d 53 43 5f 46 55 4c 4c 5f 56 45  nt)(_MSC_FULL_VE
1a40: 52 20 25 20 31 30 30 30 30 30 29 29 3b 20 2f 2a  R % 100000)); /*
1a50: 20 62 75 69 6c 64 20 28 70 61 74 63 68 29 20 2a   build (patch) *
1a60: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  /.#endif.    ret
1a70: 75 72 6e 20 30 3b 0a 7d 0a                       urn 0;.}.