1#!/bin/sh
2# -*- tcl -*- \
3exec tclsh "$0" ${1+"$@"}
4
5# Insert version and other information into a number of files.
6
7global trouble
8set    trouble 0
9
10# ============================================================
11# Generate the substitution map.
12
13proc mapdef {k v} {
14    global map
15    set map(@${k}@) $v
16    return
17}
18
19proc map {} {
20    global map
21    set res [list]
22    foreach k [lsort [array names map]] {
23	lappend res $k $map($k)
24    }
25    return $res
26}
27
28# ============================================================
29
30proc svfile {fname patternlist} {
31    global trouble subst out
32    if {![file exists $fname]} {
33	puts stderr   "File $fname: Does not exist"
34	set trouble 1
35	return
36    }
37
38    puts "Updating file $fname ..."
39
40    set                 fh [open $fname r]
41    set contents [read $fh]
42    close              $fh
43
44    puts $out "svfile [list $fname] \{"
45
46    foreach {pattern current} $patternlist {
47	set newvalue [string map $subst $pattern]
48
49	puts $out "    [list $pattern]"
50	puts $out "    [list $newvalue]"
51
52	set oldcontents $contents
53	set contents [string map [list $current $newvalue] $contents]
54	if {[string equal $contents $oldcontents] && ![string equal $current $newvalue]} {
55	    puts stderr   "File $fname: $pattern not applicable"
56	    set trouble 1
57	}
58    }
59
60    puts $out "\}"
61
62    if {[catch {
63	set              fh [open ${fname}.new w]
64	puts -nonewline $fh $contents
65	close           $fh
66    }]} {
67	file delete -force ${fname}.new
68	puts stderr "Unable to write new contents of $fname"
69	set trouble 1
70	return
71    }
72    file rename -force ${fname}.new $fname
73    return
74}
75
76proc extension {name data} {
77    global pname
78    set    pname $name
79}
80
81# ============================================================
82
83set v [lindex $argv 0]
84if {$v == {}} {
85    puts stderr "Usage: $argv0 major.minor(\[abp.\]patchlevel)?"
86    exit -1
87}
88
89regexp {([0-9]+)\.([0-9+])(([abp.])([0-9]+))?} $v \
90	-> major minor __ detail patchlevel
91
92source DESCRIPTION
93
94mapdef mDate            [string toupper \
95	[clock format \
96	[clock seconds] -format "%b-%d-%Y"]]
97mapdef mFullVersion     $v
98mapdef mMajor           $major
99mapdef mMinor           $minor
100mapdef mShortDosVersion $major$minor
101mapdef mVersion         ${major}.$minor
102mapdef mName            $pname
103
104
105# ============================================================
106
107set flistfile [file join [file dirname [info script]] svfiles]
108set newflist ${flistfile}.new
109set out [open ${flistfile}.new w]
110set subst [map]
111source $flistfile
112close $out
113
114## set trouble 1 ; # enforce that new file does not overwrite old
115if {!$trouble} {
116    file rename -force ${flistfile}.new ${flistfile}
117}
118