generate version string from individual numbers

Thanks to @sorawee for pointing me to
  https://stackoverflow.com/a/5459929/718349
This commit is contained in:
Matthew Flatt 2019-05-22 15:42:01 -06:00
parent b219f92113
commit d9c8ef964c
4 changed files with 54 additions and 25 deletions

View File

@ -1,25 +1,37 @@
(define-syntax (extract-version-string stx)
(chez:call-with-input-file
(#%call-with-input-file
"../racket/src/schvers.h"
(lambda (i)
(let ([to-find "#define MZSCHEME_VERSION \""])
(let loop ([pos 0])
(let ([to-find "#define MZSCHEME_VERSION_"])
(let numbers-loop ([numbers '()])
(cond
[(= pos (string-length to-find))
(list->string
(let loop ()
(let ([ch (chez:read-char i)])
(if (char=? ch #\")
'()
(cons ch (loop))))))]
[(= 4 (length numbers))
(cond
[(not (zero? (car numbers)))
(#%apply #%format "~a.~a.~a.~a" (reverse numbers))]
[(not (zero? (cadr numbers)))
(#%apply #%format "~a.~a.~a" (reverse (cdr numbers)))]
[else
(#%apply #%format "~a.~a" (reverse (cddr numbers)))])]
[else
(let ([ch (chez:read-char i)])
(let loop ([pos 0])
(cond
[(char=? ch (string-ref to-find pos))
(loop (add1 pos))]
[(= pos (string-length to-find))
(#%read-char i) ; discard "X", "Y", "Z", or "W"
(#%read-char i) ; discard space
(let digit-loop ([n 0])
(let ([ch (#%read-char i)])
(if (char-numeric? ch)
(digit-loop (+ (* n 10) (- (char->integer ch) (char->integer #\0))))
(numbers-loop (cons n numbers)))))]
[else
(loop 0)]))]))))))
(let ([ch (#%read-char i)])
(cond
[(char=? ch (string-ref to-find pos))
(loop (add1 pos))]
[else
(loop 0)]))]))]))))))
(define (version) (extract-version-string))
(define (banner) (string-append "Welcome to Racket v" (version) " [cs].\n"))

View File

@ -9,17 +9,27 @@
{X+1}.0; Z>=900 means working towards X.{Y+1}, and X.Y.Z as an
alpha release.
(The string and the separate X/Y/Z/W numbers must be updated
consistently.)
Note that the version number in the "base" package's "info.rkt"
needs to be updated separately.
*/
#define MZSCHEME_VERSION "7.3.0.4"
#define MZSCHEME_VERSION_X 7
#define MZSCHEME_VERSION_Y 3
#define MZSCHEME_VERSION_Z 0
#define MZSCHEME_VERSION_W 4
/* A level of indirection makes `#` work as needed: */
#define AS_a_STR_HELPER(x) #x
#define AS_a_STR(x) AS_a_STR_HELPER(x)
#if MZSCHEME_VERSION_W != 0
# define MZSCHEME_VERSION AS_a_STR(MZSCHEME_VERSION_X) "." AS_a_STR(MZSCHEME_VERSION_Y) "." AS_a_STR(MZSCHEME_VERSION_Z) "." AS_a_STR(MZSCHEME_VERSION_W)
#elif MZSCHEME_VERSION_Z != 0
# define MZSCHEME_VERSION AS_a_STR(MZSCHEME_VERSION_X) "." AS_a_STR(MZSCHEME_VERSION_Y) "." AS_a_STR(MZSCHEME_VERSION_Z)
#else
# define MZSCHEME_VERSION AS_a_STR(MZSCHEME_VERSION_X) "." AS_a_STR(MZSCHEME_VERSION_Y)
#endif
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -1,2 +1,13 @@
FWVERSION = $(shell grep ' MZSCHEME_VERSION ' $(mainsrcdir)/racket/src/schvers.h | cut -d '"' -f 2)
FWVERSION_X = $(shell grep 'define MZSCHEME_VERSION_X ' $(mainsrcdir)/racket/src/schvers.h | cut -d ' ' -f 3)
FWVERSION_Y = $(shell grep 'define MZSCHEME_VERSION_Y ' $(mainsrcdir)/racket/src/schvers.h | cut -d ' ' -f 3)
FWVERSION_Z = $(shell grep 'define MZSCHEME_VERSION_Z ' $(mainsrcdir)/racket/src/schvers.h | cut -d ' ' -f 3)
FWVERSION_W = $(shell grep 'define MZSCHEME_VERSION_W ' $(mainsrcdir)/racket/src/schvers.h | cut -d ' ' -f 3)
ifneq ($(FWVERSION_W),0)
FWVERSION = $(FWVERSION_X).$(FWVERSION_Y).$(FWVERSION_Z).$(FWVERSION_W)
else ifneq ($(FWVERSION_Z),0)
FWVERSION = $(FWVERSION_X).$(FWVERSION_Y).$(FWVERSION_Z)
else
FWVERSION = $(FWVERSION_X).$(FWVERSION_Y)
endif

View File

@ -85,12 +85,8 @@ CAPTION "MzCOM"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",IDOK,76,69,50,14,BS_CENTER
CTEXT "MzCOM v"MZSCHEME_VERSION,mzIDC_STATIC,71,8,61,8
CTEXT "Copyright (c) 2000-2018 PLT Design Inc.",mzIDC_STATIC,
41,20,146,9
CTEXT "Racket v"MZSCHEME_VERSION,mzIDC_STATIC,64,35,75,8
CTEXT "Copyright (c) 1995-2018 PLT Design Inc.",mzIDC_STATIC,
30,47,143,8
CTEXT "MzCOM",mzIDC_STATIC,71,8,61,8
CTEXT "Racket",mzIDC_STATIC,64,35,75,8
ICON MZICON,mzIDC_STATIC,11,16,20,20
END