Rewrote version.pl, and added some tests
[nasm/perl-rewrite.git] / perl / version.pl
blobaad7102bfc99bf6524ae2e754924fe2ee616d136
1 #!/usr/bin/env perl
3 # version.pl
5 # Parse the NASM version file and produce appropriate macros
7 # The NASM version number is assumed to consist of:
9 # <major>.<minor>[.<subminor>][pl<patchlevel> | rc<number>]]<tail>
11 # ... where <tail> is not necessarily numeric, but if it is of the form
12 # -<digits> it is assumed to be a snapshot release.
14 # This defines the following macros:
16 # version.h:
17 # NASM_MAJOR_VER
18 # NASM_MINOR_VER
19 # NASM_SUBMINOR_VER -- this is zero if no subminor
20 # NASM_PATCHLEVEL_VER -- this is zero is no patchlevel
21 # NASM_SNAPSHOT -- if snapshot
22 # NASM_VERSION_ID -- version number encoded
23 # NASM_VER -- whole version number as a string
25 # version.mac:
26 # __NASM_MAJOR__
27 # __NASM_MINOR__
28 # __NASM_SUBMINOR__
29 # __NASM_PATCHLEVEL__
30 # __NASM_SNAPSHOT__
31 # __NASM_VERSION_ID__
32 # __NASM_VER__
34 use Modern::Perl;
35 use warnings;
36 use strict;
38 # fill in %version;
39 our %version;
41 my $line = <STDIN>;
42 chomp $line;
43 $version{_line} = $line;
45 $line =~ m{ ^
46 (?<major>\d+)[.](?<minor>\d+)
47 (?:[.](?<subminor>\d+))?
48 (?:
49 pl(?<patchlevel>\d+) |
50 rc(?<rc>\d+)
52 (?:
53 [-](?<snapshot>\d+) |
54 (?<tail>.+)
57 }x;
59 for my $key(qw'major minor subminor patchlevel rc'){
60 my $value = $+{$key} || 0;
61 $version{$key} = $value + 0;
63 for my $key(qw'snapshot tail'){
64 if(exists $+{$key}){
65 $version{$key} = $+{$key};
73 # modify %version if this is a release candidate
74 if($version{rc}){
75 $version{patchlevel} = $version{rc} + 90;
77 if($version{subminor}){
78 $version{subminor}--;
79 }else{
80 $version{subminor} = 99;
82 if($version{minor}){
83 $version{minor}--;
84 }else{
85 $version{minor} = 99;
86 $version{major}--;
93 # add 'id' and 'xid' to %version
94 $version{id} =
95 ($version{major} << 24) +
96 ($version{minor} << 16) +
97 ($version{subminor} << 8) +
98 $version{patchlevel};
99 $version{xid} = sprintf('0x%08x',$version{id});
103 # add 'mangled' to %version
105 my $mangled = sprintf("%d.%02d",$version{major},$version{minor});
107 $version{subminor} ||
108 $version{patchlevel} ||
109 $version{snapshot}
111 $mangled .= sprintf(".%02d",$version{subminor});
114 $version{patchlevel} ||
115 $version{snapshot}
117 $mangled .= sprintf(".%02d",$version{patchlevel})
121 if($version{snapshot}){
122 $mangled .= '.'.$version{snapshot}
123 }elsif( $version{tail}){
124 my $tail = $version{tail};
125 $tail =~ s/-/./g;
126 $mangled .= $tail;
129 $version{mangled} = $mangled;
135 # forward definition of subroutines
136 sub help;
137 sub h;
138 sub mac;
139 sub sed;
140 sub make;
143 # jump table to subroutines / variables
144 my %jump = (
145 help => \&help,
146 h => \&h,
147 mac => \&mac,
148 sed => \&sed,
149 make => \&make,
150 id => \$version{id},
151 xid => \$version{xid},
152 dump => sub{
153 no warnings;
154 require Data::Dumper;
155 $Data::Dumper::Terse = 1;
157 my %ret = %version;
158 for( keys %ret ){
159 # remove any "hidden" keys
160 delete $ret{$_} if /^[_.]/;
162 return Data::Dumper::Dumper(\%ret);
167 # Main Code Block
169 use Scalar::Util 'reftype';
171 my($arg) = (@ARGV, 'help');
172 local( undef, @ARGV) = @ARGV if @ARGV;
174 my $jump = $jump{$arg} || $jump{help};
177 if( ref $jump ){
178 my $reftype = reftype $jump;
180 if($reftype eq 'CODE'){
181 my $ret = $jump->(@ARGV);
182 print "$ret\n" if defined $ret;
184 }elsif($reftype eq 'SCALAR'){
185 print $$jump;
187 }else{
188 die;
190 }else{
191 print $jump;
196 # subroutine definitions
199 sub h{
200 printf <<END, @version{'major','minor','subminor','patchlevel'};
201 #ifndef NASM_VERSION_H
202 #define NASM_VERSION_H
203 #define NASM_MAJOR_VER %d
204 #define NASM_MINOR_VER %d
205 #define NASM_SUBMINOR_VER %d
206 #define NASM_PATCHLEVEL_VER %d
209 if ($version{snapshot}) {
210 printf "#define NASM_SNAPSHOT %d\n", $version{snapshot};
213 printf <<END, @version{'xid','_line'};
214 #define NASM_VERSION_ID %s
215 #define NASM_VER "%s"
216 #endif /* NASM_VERSION_H */
218 return;
223 sub mac{
224 printf <<'END', @version{'major','minor','subminor','patchlevel'};
225 %%define __NASM_MAJOR__ %d
226 %%define __NASM_MINOR__ %d
227 %%define __NASM_SUBMINOR__ %d
228 %%define __NASM_PATCHLEVEL__ %d
231 if ($version{snapshot}) {
232 printf "%%define __NASM_SNAPSHOT__ %d\n", $version{snapshot};
235 printf <<'END', @version{'id','_line'};
236 %%define __NASM_VERSION_ID__ 0%08Xh
237 %%define __NASM_VER__ "%s"
239 return;
244 sub sed{
245 my @rep = @version{qw{
246 major
247 minor
248 subminor
249 patchlevel
250 snapshot
253 _line
254 mangled
256 no warnings 'uninitialized';
257 sprintf <<'END', @rep;
258 s/@@NASM_MAJOR@@/%d/g
259 s/@@NASM_MINOR@@/%d/g
260 s/@@NASM_SUBMINOR@@/%d/g
261 s/@@NASM_PATCHLEVEL@@/%d/g
262 s/@@NASM_SNAPSHOT@@/%d/g
263 s/@@NASM_VERSION_ID@@/%d/g
264 s/@@NASM_VERSION_XID@@/%s/g
265 s/@@NASM_VER@@/%s/g
266 s/@@NASM_MANGLED_VER@@/%s/g
273 sub make{
274 return sprintf <<END, @version{'_line','major','minor','subminor','patchlevel'};
275 NASM_VER=%s
276 NASM_MAJOR_VER=%d
277 NASM_MINOR_VER=%d
278 NASM_SUBMINOR_VER=%d
279 NASM_PATCHLEVEL_VER=%d
285 BEGIN{
286 my %help = (
287 sed => 'strings for sed command',
288 mac => 'strings for nasm macros',
289 h => 'strings for headers',
290 make => 'strings for makefiles',
291 dump => 'dump of program data'
293 sub help{
294 my($cmd) = @_;
295 if( $cmd and $help{$cmd} ){
296 return $help{$cmd};
297 }else{
298 return "$0 [help] <[ sed | mac | h | make | dump ]>";