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:
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
42 $version{_line
} = $line;
45 (?
<major
>\d
+)[.](?
<minor
>\d
+)
46 (?
:[.](?
<subminor
>\d
+))?
48 pl
(?
<patchlevel
>\d
+) |
58 for my $key(qw
'major minor subminor patchlevel rc'){
59 my $value = $+{$key} || 0;
60 $version{$key} = $value + 0;
62 for my $key(qw
'snapshot tail'){
64 $version{$key} = $+{$key};
72 # modify %version if this is a release candidate
74 $version{patchlevel
} = $version{rc
} + 90;
76 if($version{subminor
}){
79 $version{subminor
} = 99;
92 # add 'id' and 'xid' to %version
94 ($version{major
} << 24) +
95 ($version{minor
} << 16) +
96 ($version{subminor
} << 8) +
98 $version{xid
} = sprintf('0x%08x',$version{id
});
102 # add 'mangled' to %version
104 my $mangled = sprintf("%d.%02d",$version{major
},$version{minor
});
106 $version{subminor
} ||
107 $version{patchlevel
} ||
110 $mangled .= sprintf(".%02d",$version{subminor
});
113 $version{patchlevel
} ||
116 $mangled .= sprintf(".%02d",$version{patchlevel
})
120 if($version{snapshot
}){
121 $mangled .= '.'.$version{snapshot
}
122 }elsif( $version{tail
}){
123 my $tail = $version{tail
};
128 $version{mangled
} = $mangled;
134 # forward definition of subroutines
143 # jump table to subroutines / variables
152 xid
=> \
$version{xid
},
155 require Data
::Dumper
;
156 $Data::Dumper
::Terse
= 1;
160 # remove any "hidden" keys
161 delete $ret{$_} if /^[_.]/;
163 return Data
::Dumper
::Dumper
(\
%ret);
170 use Scalar
::Util
'reftype';
172 my($arg) = (@ARGV, 'help');
173 local( undef, @ARGV) = @ARGV if @ARGV;
175 my $jump = $jump{$arg} || $jump{help
};
179 my $reftype = reftype
$jump;
181 if($reftype eq 'CODE'){
182 my $ret = $jump->(@ARGV);
183 print "$ret\n" if defined $ret;
185 }elsif($reftype eq 'SCALAR'){
197 # subroutine definitions
201 printf <<END, @version{'major','minor','subminor','patchlevel'};
202 #ifndef NASM_VERSION_H
203 #define NASM_VERSION_H
204 #define NASM_MAJOR_VER %d
205 #define NASM_MINOR_VER %d
206 #define NASM_SUBMINOR_VER %d
207 #define NASM_PATCHLEVEL_VER %d
210 if ($version{snapshot
}) {
211 printf "#define NASM_SNAPSHOT %d\n", $version{snapshot
};
214 printf <<END, @version{'xid','_line'};
215 #define NASM_VERSION_ID %s
216 #define NASM_VER "%s"
217 #endif /* NASM_VERSION_H */
225 printf <<'END', @version{'major','minor','subminor','patchlevel'};
226 %%define __NASM_MAJOR__ %d
227 %%define __NASM_MINOR__ %d
228 %%define __NASM_SUBMINOR__ %d
229 %%define __NASM_PATCHLEVEL__ %d
232 if ($version{snapshot
}) {
233 printf "%%define __NASM_SNAPSHOT__ %d\n", $version{snapshot
};
236 printf <<'END', @version{'id','_line'};
237 %%define __NASM_VERSION_ID__ 0%08Xh
238 %%define __NASM_VER__ "%s"
246 my @rep = @version{qw{
257 no warnings
'uninitialized';
258 sprintf <<'END', @rep;
259 s/@@NASM_MAJOR@@/%d/g
260 s/@@NASM_MINOR@@/%d/g
261 s/@@NASM_SUBMINOR@@/%d/g
262 s/@@NASM_PATCHLEVEL@@/%d/g
263 s/@@NASM_SNAPSHOT@@/%d/g
264 s/@@NASM_VERSION_ID@@/%d/g
265 s/@@NASM_VERSION_XID@@/%s/g
267 s/@@NASM_MANGLED_VER@@/%s/g
275 return sprintf <<END, @version{'_line','major','minor','subminor','patchlevel'};
280 NASM_PATCHLEVEL_VER=%d
287 return sprintf <<'END', @version{'_line','major','minor','subminor','patchlevel'};
291 !define SUBMINOR_VER %d
292 !define PATCHLEVEL_VER %d
300 sed
=> 'strings for sed command',
301 mac
=> 'strings for nasm macros',
302 h
=> 'strings for headers',
303 make
=> 'strings for makefiles',
304 dump => 'dump of program data',
309 if( $cmd and $help{$cmd} ){
312 return "$0 [help] <[ sed | mac | h | make | nsis | dump ]>";